From d3fcd7f10ce209f94edd1c1b861eb75af48f2873 Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Wed, 12 Feb 2014 12:36:59 +0400 Subject: [PATCH] initial commit --- .gitignore | 2 + README.md | 11 + gulpfile.js | 20 + node_modules/.bin/_mocha | 1 + node_modules/.bin/express | 1 + node_modules/.bin/gulp | 1 + node_modules/.bin/jade | 1 + node_modules/.bin/mocha | 1 + node_modules/consolidate/.npmignore | 4 + node_modules/consolidate/History.md | 86 + node_modules/consolidate/Makefile | 9 + node_modules/consolidate/Readme.md | 155 + node_modules/consolidate/index.js | 1 + node_modules/consolidate/lib/consolidate.js | 764 + node_modules/consolidate/package.json | 67 + node_modules/express/.npmignore | 9 + node_modules/express/.travis.yml | 4 + node_modules/express/History.md | 1274 + node_modules/express/LICENSE | 22 + node_modules/express/Makefile | 34 + node_modules/express/Readme.md | 126 + node_modules/express/benchmarks/Makefile | 13 + node_modules/express/benchmarks/middleware.js | 23 + node_modules/express/benchmarks/run | 16 + node_modules/express/bin/express | 423 + node_modules/express/index.js | 4 + node_modules/express/lib/application.js | 534 + node_modules/express/lib/express.js | 82 + node_modules/express/lib/middleware.js | 32 + node_modules/express/lib/request.js | 529 + node_modules/express/lib/response.js | 799 + node_modules/express/lib/router/index.js | 321 + node_modules/express/lib/router/route.js | 78 + node_modules/express/lib/utils.js | 314 + node_modules/express/lib/view.js | 77 + .../node_modules/buffer-crc32/.npmignore | 1 + .../node_modules/buffer-crc32/.travis.yml | 8 + .../node_modules/buffer-crc32/README.md | 47 + .../node_modules/buffer-crc32/index.js | 88 + .../node_modules/buffer-crc32/package.json | 43 + .../buffer-crc32/tests/crc.test.js | 89 + .../express/node_modules/commander/History.md | 174 + .../express/node_modules/commander/Readme.md | 276 + .../express/node_modules/commander/index.js | 1160 + .../commander/node_modules/keypress/README.md | 101 + .../commander/node_modules/keypress/index.js | 346 + .../node_modules/keypress/package.json | 32 + .../commander/node_modules/keypress/test.js | 28 + .../node_modules/commander/package.json | 45 + .../express/node_modules/connect/.npmignore | 12 + .../express/node_modules/connect/.travis.yml | 4 + .../express/node_modules/connect/LICENSE | 24 + .../express/node_modules/connect/Readme.md | 84 + .../express/node_modules/connect/index.js | 4 + .../express/node_modules/connect/lib/cache.js | 81 + .../node_modules/connect/lib/connect.js | 92 + .../express/node_modules/connect/lib/index.js | 50 + .../connect/lib/middleware/basicAuth.js | 106 + .../connect/lib/middleware/bodyParser.js | 68 + .../connect/lib/middleware/compress.js | 192 + .../connect/lib/middleware/cookieParser.js | 67 + .../connect/lib/middleware/cookieSession.js | 122 + .../connect/lib/middleware/csrf.js | 163 + .../connect/lib/middleware/directory.js | 330 + .../connect/lib/middleware/errorHandler.js | 86 + .../connect/lib/middleware/favicon.js | 80 + .../connect/lib/middleware/json.js | 87 + .../connect/lib/middleware/limit.js | 89 + .../connect/lib/middleware/logger.js | 342 + .../connect/lib/middleware/methodOverride.js | 58 + .../connect/lib/middleware/multipart.js | 171 + .../connect/lib/middleware/query.js | 47 + .../connect/lib/middleware/responseTime.js | 32 + .../connect/lib/middleware/session.js | 358 + .../connect/lib/middleware/session/cookie.js | 128 + .../connect/lib/middleware/session/memory.js | 129 + .../connect/lib/middleware/session/session.js | 116 + .../connect/lib/middleware/session/store.js | 84 + .../connect/lib/middleware/static.js | 102 + .../connect/lib/middleware/staticCache.js | 238 + .../connect/lib/middleware/timeout.js | 55 + .../connect/lib/middleware/urlencoded.js | 77 + .../connect/lib/middleware/vhost.js | 40 + .../express/node_modules/connect/lib/patch.js | 89 + .../express/node_modules/connect/lib/proto.js | 233 + .../connect/lib/public/directory.html | 82 + .../connect/lib/public/error.html | 14 + .../connect/lib/public/favicon.ico | Bin 0 -> 1406 bytes .../connect/lib/public/icons/folder.png | Bin 0 -> 634 bytes .../connect/lib/public/icons/page.png | Bin 0 -> 635 bytes .../connect/lib/public/icons/page_add.png | Bin 0 -> 739 bytes .../connect/lib/public/icons/page_attach.png | Bin 0 -> 794 bytes .../connect/lib/public/icons/page_code.png | Bin 0 -> 818 bytes .../connect/lib/public/icons/page_copy.png | Bin 0 -> 663 bytes .../connect/lib/public/icons/page_delete.png | Bin 0 -> 740 bytes .../connect/lib/public/icons/page_edit.png | Bin 0 -> 807 bytes .../connect/lib/public/icons/page_error.png | Bin 0 -> 793 bytes .../connect/lib/public/icons/page_excel.png | Bin 0 -> 817 bytes .../connect/lib/public/icons/page_find.png | Bin 0 -> 879 bytes .../connect/lib/public/icons/page_gear.png | Bin 0 -> 833 bytes .../connect/lib/public/icons/page_go.png | Bin 0 -> 779 bytes .../connect/lib/public/icons/page_green.png | Bin 0 -> 621 bytes .../connect/lib/public/icons/page_key.png | Bin 0 -> 801 bytes .../lib/public/icons/page_lightning.png | Bin 0 -> 839 bytes .../connect/lib/public/icons/page_link.png | Bin 0 -> 830 bytes .../lib/public/icons/page_paintbrush.png | Bin 0 -> 813 bytes .../connect/lib/public/icons/page_paste.png | Bin 0 -> 703 bytes .../connect/lib/public/icons/page_red.png | Bin 0 -> 641 bytes .../connect/lib/public/icons/page_refresh.png | Bin 0 -> 858 bytes .../connect/lib/public/icons/page_save.png | Bin 0 -> 774 bytes .../connect/lib/public/icons/page_white.png | Bin 0 -> 294 bytes .../lib/public/icons/page_white_acrobat.png | Bin 0 -> 591 bytes .../public/icons/page_white_actionscript.png | Bin 0 -> 664 bytes .../lib/public/icons/page_white_add.png | Bin 0 -> 512 bytes .../connect/lib/public/icons/page_white_c.png | Bin 0 -> 587 bytes .../lib/public/icons/page_white_camera.png | Bin 0 -> 656 bytes .../lib/public/icons/page_white_cd.png | Bin 0 -> 666 bytes .../lib/public/icons/page_white_code.png | Bin 0 -> 603 bytes .../lib/public/icons/page_white_code_red.png | Bin 0 -> 587 bytes .../public/icons/page_white_coldfusion.png | Bin 0 -> 592 bytes .../public/icons/page_white_compressed.png | Bin 0 -> 724 bytes .../lib/public/icons/page_white_copy.png | Bin 0 -> 309 bytes .../lib/public/icons/page_white_cplusplus.png | Bin 0 -> 621 bytes .../lib/public/icons/page_white_csharp.png | Bin 0 -> 700 bytes .../lib/public/icons/page_white_cup.png | Bin 0 -> 639 bytes .../lib/public/icons/page_white_database.png | Bin 0 -> 579 bytes .../lib/public/icons/page_white_delete.png | Bin 0 -> 536 bytes .../lib/public/icons/page_white_dvd.png | Bin 0 -> 638 bytes .../lib/public/icons/page_white_edit.png | Bin 0 -> 618 bytes .../lib/public/icons/page_white_error.png | Bin 0 -> 623 bytes .../lib/public/icons/page_white_excel.png | Bin 0 -> 663 bytes .../lib/public/icons/page_white_find.png | Bin 0 -> 676 bytes .../lib/public/icons/page_white_flash.png | Bin 0 -> 582 bytes .../lib/public/icons/page_white_freehand.png | Bin 0 -> 639 bytes .../lib/public/icons/page_white_gear.png | Bin 0 -> 402 bytes .../lib/public/icons/page_white_get.png | Bin 0 -> 516 bytes .../lib/public/icons/page_white_go.png | Bin 0 -> 612 bytes .../connect/lib/public/icons/page_white_h.png | Bin 0 -> 603 bytes .../public/icons/page_white_horizontal.png | Bin 0 -> 296 bytes .../lib/public/icons/page_white_key.png | Bin 0 -> 616 bytes .../lib/public/icons/page_white_lightning.png | Bin 0 -> 669 bytes .../lib/public/icons/page_white_link.png | Bin 0 -> 614 bytes .../lib/public/icons/page_white_magnify.png | Bin 0 -> 554 bytes .../lib/public/icons/page_white_medal.png | Bin 0 -> 706 bytes .../lib/public/icons/page_white_office.png | Bin 0 -> 779 bytes .../lib/public/icons/page_white_paint.png | Bin 0 -> 688 bytes .../public/icons/page_white_paintbrush.png | Bin 0 -> 618 bytes .../lib/public/icons/page_white_paste.png | Bin 0 -> 620 bytes .../lib/public/icons/page_white_php.png | Bin 0 -> 538 bytes .../lib/public/icons/page_white_picture.png | Bin 0 -> 650 bytes .../public/icons/page_white_powerpoint.png | Bin 0 -> 588 bytes .../lib/public/icons/page_white_put.png | Bin 0 -> 523 bytes .../lib/public/icons/page_white_ruby.png | Bin 0 -> 626 bytes .../lib/public/icons/page_white_stack.png | Bin 0 -> 317 bytes .../lib/public/icons/page_white_star.png | Bin 0 -> 565 bytes .../lib/public/icons/page_white_swoosh.png | Bin 0 -> 634 bytes .../lib/public/icons/page_white_text.png | Bin 0 -> 342 bytes .../public/icons/page_white_text_width.png | Bin 0 -> 315 bytes .../lib/public/icons/page_white_tux.png | Bin 0 -> 668 bytes .../lib/public/icons/page_white_vector.png | Bin 0 -> 644 bytes .../public/icons/page_white_visualstudio.png | Bin 0 -> 702 bytes .../lib/public/icons/page_white_width.png | Bin 0 -> 309 bytes .../lib/public/icons/page_white_word.png | Bin 0 -> 651 bytes .../lib/public/icons/page_white_world.png | Bin 0 -> 734 bytes .../lib/public/icons/page_white_wrench.png | Bin 0 -> 613 bytes .../lib/public/icons/page_white_zip.png | Bin 0 -> 386 bytes .../connect/lib/public/icons/page_word.png | Bin 0 -> 777 bytes .../connect/lib/public/icons/page_world.png | Bin 0 -> 903 bytes .../node_modules/connect/lib/public/style.css | 257 + .../express/node_modules/connect/lib/utils.js | 408 + .../connect/node_modules/batch/.npmignore | 4 + .../connect/node_modules/batch/History.md | 66 + .../connect/node_modules/batch/Makefile | 6 + .../connect/node_modules/batch/Readme.md | 74 + .../connect/node_modules/batch/component.json | 14 + .../connect/node_modules/batch/index.js | 158 + .../connect/node_modules/batch/package.json | 22 + .../connect/node_modules/bytes/.npmignore | 1 + .../connect/node_modules/bytes/History.md | 15 + .../connect/node_modules/bytes/Makefile | 7 + .../connect/node_modules/bytes/Readme.md | 51 + .../connect/node_modules/bytes/component.json | 7 + .../connect/node_modules/bytes/index.js | 39 + .../connect/node_modules/bytes/package.json | 29 + .../connect/node_modules/multiparty/.jshintrc | 70 + .../node_modules/multiparty/.npmignore | 1 + .../node_modules/multiparty/.travis.yml | 6 + .../node_modules/multiparty/CHANGELOG.md | 191 + .../connect/node_modules/multiparty/LICENSE | 7 + .../connect/node_modules/multiparty/README.md | 177 + .../multiparty/examples/azureblobstorage.js | 41 + .../node_modules/multiparty/examples/s3.js | 74 + .../multiparty/examples/upload.js | 37 + .../connect/node_modules/multiparty/index.js | 618 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 18 + .../node_modules/readable-stream/README.md | 768 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 923 + .../readable-stream/lib/_stream_duplex.js | 69 + .../lib/_stream_passthrough.js | 41 + .../readable-stream/lib/_stream_readable.js | 924 + .../readable-stream/lib/_stream_transform.js | 210 + .../readable-stream/lib/_stream_writable.js | 460 + .../node_modules/core-util-is/README.md | 3 + .../node_modules/core-util-is/float.patch | 604 + .../node_modules/core-util-is/lib/util.js | 107 + .../node_modules/core-util-is/package.json | 35 + .../node_modules/core-util-is/util.js | 106 + .../node_modules/debuglog/LICENSE | 19 + .../node_modules/debuglog/README.md | 40 + .../node_modules/debuglog/debuglog.js | 22 + .../node_modules/debuglog/package.json | 30 + .../node_modules/readable-stream/package.json | 42 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 7 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../node_modules/stream-counter/.npmignore | 1 + .../node_modules/stream-counter/README.md | 14 + .../node_modules/stream-counter/index.js | 16 + .../node_modules/stream-counter/package.json | 32 + .../node_modules/stream-counter/test/test.js | 20 + .../node_modules/stream-counter/test/test.txt | 1 + .../node_modules/multiparty/package.json | 47 + .../multiparty/test/bench-multipart-parser.js | 76 + .../test/fixture/file/beta-sticker-1.png | Bin 0 -> 1660 bytes .../test/fixture/file/binaryfile.tar.gz | Bin 0 -> 301 bytes .../multiparty/test/fixture/file/blank.gif | Bin 0 -> 49 bytes .../test/fixture/file/funkyfilename.txt | 1 + .../test/fixture/file/menu_separator.png | Bin 0 -> 931 bytes .../multiparty/test/fixture/file/pf1y5.png | Bin 0 -> 768323 bytes .../multiparty/test/fixture/file/plain.txt | 1 + .../http/encoding/beta-sticker-1.png.http | 12 + .../http/encoding/binaryfile.tar.gz.http | 12 + .../test/fixture/http/encoding/blank.gif.http | 12 + .../http/encoding/menu_seperator.png.http | 12 + .../test/fixture/http/encoding/pf1y5.png.http | Bin 0 -> 769113 bytes .../test/fixture/http/encoding/plain.txt.http | 13 + .../http/no-filename/filename-name.http | 13 + .../fixture/http/no-filename/generic.http | 13 + .../test/fixture/http/preamble/crlf.http | 13 + .../test/fixture/http/preamble/preamble.http | 13 + .../http/special-chars-in-filename/info.md | 3 + .../osx-chrome-13.http | 26 + .../osx-firefox-3.6.http | 24 + .../osx-safari-5.http | 23 + .../xp-chrome-12.http | 24 + .../special-chars-in-filename/xp-ie-7.http | 22 + .../special-chars-in-filename/xp-ie-8.http | 22 + .../xp-safari-5.http | 22 + .../http/workarounds/missing-hyphens1.http | 12 + .../http/workarounds/missing-hyphens2.http | 12 + .../multiparty/test/fixture/js/encoding.js | 69 + .../multiparty/test/fixture/js/no-filename.js | 9 + .../multiparty/test/fixture/js/preamble.js | 9 + .../fixture/js/special-chars-in-filename.js | 30 + .../multiparty/test/fixture/js/workarounds.js | 8 + .../test/fixture/multi_video.upload | Bin 0 -> 1953781 bytes .../multiparty/test/fixture/multipart.js | 72 + .../node_modules/multiparty/test/record.js | 47 + .../standalone/test-connection-aborted.js | 27 + .../test-content-transfer-encoding.js | 52 + .../test/standalone/test-invalid.js | 35 + .../test/standalone/test-issue-15.js | 88 + .../test/standalone/test-issue-19.js | 44 + .../test/standalone/test-issue-21.js | 66 + .../test/standalone/test-issue-4.js | 51 + .../test/standalone/test-issue-46.js | 49 + .../test/standalone/test-issue-5.js | 39 + .../node_modules/multiparty/test/test.js | 117 + .../connect/node_modules/negotiator/LICENSE | 27 + .../negotiator/examples/accept.js | 47 + .../negotiator/examples/charset.js | 52 + .../negotiator/examples/encoding.js | 48 + .../negotiator/examples/language.js | 44 + .../node_modules/negotiator/lib/charset.js | 71 + .../node_modules/negotiator/lib/encoding.js | 89 + .../node_modules/negotiator/lib/language.js | 92 + .../node_modules/negotiator/lib/mediaType.js | 101 + .../node_modules/negotiator/lib/negotiator.js | 29 + .../node_modules/negotiator/package.json | 54 + .../connect/node_modules/negotiator/readme.md | 132 + .../node_modules/negotiator/test/charset.js | 62 + .../node_modules/negotiator/test/encoding.js | 70 + .../node_modules/negotiator/test/language.js | 70 + .../node_modules/negotiator/test/mediaType.js | 70 + .../connect/node_modules/pause/.npmignore | 4 + .../connect/node_modules/pause/History.md | 5 + .../connect/node_modules/pause/Makefile | 7 + .../connect/node_modules/pause/Readme.md | 29 + .../connect/node_modules/pause/index.js | 29 + .../connect/node_modules/pause/package.json | 24 + .../connect/node_modules/qs/.gitmodules | 6 + .../connect/node_modules/qs/.npmignore | 7 + .../connect/node_modules/qs/Readme.md | 58 + .../connect/node_modules/qs/index.js | 366 + .../connect/node_modules/qs/package.json | 42 + .../connect/node_modules/raw-body/.npmignore | 1 + .../connect/node_modules/raw-body/.travis.yml | 8 + .../connect/node_modules/raw-body/Makefile | 13 + .../connect/node_modules/raw-body/README.md | 96 + .../connect/node_modules/raw-body/index.js | 160 + .../node_modules/raw-body/package.json | 45 + .../connect/node_modules/uid2/LICENSE | 21 + .../connect/node_modules/uid2/index.js | 55 + .../connect/node_modules/uid2/package.json | 16 + .../express/node_modules/connect/package.json | 69 + .../node_modules/cookie-signature/.npmignore | 4 + .../node_modules/cookie-signature/History.md | 11 + .../node_modules/cookie-signature/Makefile | 7 + .../node_modules/cookie-signature/Readme.md | 42 + .../node_modules/cookie-signature/index.js | 42 + .../cookie-signature/package.json | 28 + .../express/node_modules/cookie/.npmignore | 1 + .../express/node_modules/cookie/.travis.yml | 5 + .../express/node_modules/cookie/LICENSE | 9 + .../express/node_modules/cookie/README.md | 44 + .../express/node_modules/cookie/index.js | 70 + .../express/node_modules/cookie/package.json | 41 + .../node_modules/cookie/test/mocha.opts | 1 + .../express/node_modules/cookie/test/parse.js | 44 + .../node_modules/cookie/test/serialize.js | 64 + .../express/node_modules/debug/Readme.md | 115 + .../express/node_modules/debug/debug.js | 137 + .../express/node_modules/debug/index.js | 5 + .../express/node_modules/debug/lib/debug.js | 147 + .../express/node_modules/debug/package.json | 46 + .../express/node_modules/fresh/.npmignore | 1 + .../express/node_modules/fresh/History.md | 5 + .../express/node_modules/fresh/Makefile | 7 + .../express/node_modules/fresh/Readme.md | 57 + .../express/node_modules/fresh/index.js | 53 + .../express/node_modules/fresh/package.json | 32 + .../node_modules/merge-descriptors/.npmignore | 59 + .../node_modules/merge-descriptors/README.md | 49 + .../merge-descriptors/component.json | 10 + .../node_modules/merge-descriptors/index.js | 8 + .../merge-descriptors/package.json | 30 + .../express/node_modules/methods/History.md | 5 + .../express/node_modules/methods/Readme.md | 4 + .../express/node_modules/methods/index.js | 37 + .../express/node_modules/methods/package.json | 33 + .../express/node_modules/mkdirp/.npmignore | 2 + .../express/node_modules/mkdirp/.travis.yml | 5 + .../express/node_modules/mkdirp/LICENSE | 21 + .../node_modules/mkdirp/examples/pow.js | 6 + .../express/node_modules/mkdirp/index.js | 82 + .../express/node_modules/mkdirp/package.json | 34 + .../node_modules/mkdirp/readme.markdown | 63 + .../express/node_modules/mkdirp/test/chmod.js | 38 + .../node_modules/mkdirp/test/clobber.js | 37 + .../node_modules/mkdirp/test/mkdirp.js | 28 + .../express/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../express/node_modules/mkdirp/test/race.js | 41 + .../express/node_modules/mkdirp/test/rel.js | 32 + .../node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../express/node_modules/mkdirp/test/root.js | 18 + .../express/node_modules/mkdirp/test/sync.js | 32 + .../express/node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 32 + .../node_modules/range-parser/.npmignore | 1 + .../node_modules/range-parser/History.md | 15 + .../node_modules/range-parser/Makefile | 7 + .../node_modules/range-parser/Readme.md | 28 + .../node_modules/range-parser/index.js | 49 + .../node_modules/range-parser/package.json | 24 + .../express/node_modules/send/.npmignore | 4 + .../express/node_modules/send/History.md | 40 + .../express/node_modules/send/Makefile | 8 + .../express/node_modules/send/Readme.md | 128 + .../express/node_modules/send/index.js | 2 + .../express/node_modules/send/lib/send.js | 474 + .../express/node_modules/send/lib/utils.js | 47 + .../send/node_modules/mime/LICENSE | 19 + .../send/node_modules/mime/README.md | 66 + .../send/node_modules/mime/mime.js | 114 + .../send/node_modules/mime/package.json | 36 + .../send/node_modules/mime/test.js | 84 + .../send/node_modules/mime/types/mime.types | 1588 ++ .../send/node_modules/mime/types/node.types | 77 + .../express/node_modules/send/package.json | 46 + node_modules/express/package.json | 91 + node_modules/gulp-minify-css/.npmignore | 6 + node_modules/gulp-minify-css/.travis.yml | 4 + node_modules/gulp-minify-css/LICENSE | 20 + node_modules/gulp-minify-css/README.md | 68 + node_modules/gulp-minify-css/index.js | 52 + .../node_modules/.bin/cleancss | 1 + .../node_modules/bufferstreams/.npmignore | 5 + .../node_modules/bufferstreams/.travis.yml | 9 + .../node_modules/bufferstreams/LICENCE | 21 + .../node_modules/bufferstreams/README.md | 42 + .../node_modules/bufferstreams/package.json | 45 + .../node_modules/bufferstreams/src/index.js | 45 + .../bufferstreams/tests/index.mocha.js | 111 + .../node_modules/clean-css/History.md | 379 + .../node_modules/clean-css/LICENSE | 19 + .../node_modules/clean-css/README.md | 187 + .../node_modules/clean-css/bin/cleancss | 138 + .../node_modules/clean-css/index.js | 1 + .../node_modules/clean-css/lib/clean.js | 329 + .../clean-css/lib/colors/hsl-to-hex.js | 64 + .../clean-css/lib/colors/long-to-short-hex.js | 12 + .../clean-css/lib/colors/rgb-to-hex.js | 16 + .../clean-css/lib/colors/shortener.js | 174 + .../clean-css/lib/images/url-rebase.js | 34 + .../clean-css/lib/images/url-rewriter.js | 53 + .../clean-css/lib/imports/inliner.js | 152 + .../clean-css/lib/properties/optimizer.js | 228 + .../lib/properties/shorthand-notations.js | 50 + .../clean-css/lib/selectors/empty-removal.js | 30 + .../clean-css/lib/selectors/optimizer.js | 221 + .../clean-css/lib/selectors/tokenizer.js | 129 + .../clean-css/lib/text/comments.js | 59 + .../clean-css/lib/text/escape-store.js | 32 + .../clean-css/lib/text/expressions.js | 69 + .../node_modules/clean-css/lib/text/free.js | 76 + .../node_modules/clean-css/lib/text/urls.js | 39 + .../node_modules/commander/History.md | 179 + .../node_modules/commander/Readme.md | 195 + .../clean-css/node_modules/commander/index.js | 847 + .../node_modules/commander/package.json | 38 + .../node_modules/clean-css/package.json | 72 + .../node_modules/clone/.npmignore | 1 + .../node_modules/clone/.travis.yml | 5 + .../node_modules/clone/LICENSE | 18 + .../node_modules/clone/README.md | 124 + .../node_modules/clone/clone.js | 159 + .../node_modules/clone/package.json | 89 + .../node_modules/clone/test.js | 217 + .../node_modules/event-stream/.npmignore | 3 + .../node_modules/event-stream/.travis.yml | 4 + .../node_modules/event-stream/LICENCE | 22 + .../event-stream/examples/pretty.js | 25 + .../node_modules/event-stream/index.js | 302 + .../node_modules/duplexer/.npmignore | 3 + .../node_modules/duplexer/.travis.yml | 6 + .../node_modules/duplexer/LICENCE | 19 + .../node_modules/duplexer/README.md | 47 + .../node_modules/duplexer/index.js | 87 + .../node_modules/duplexer/package.json | 57 + .../node_modules/duplexer/test/index.js | 31 + .../event-stream/node_modules/from/.npmignore | 1 + .../node_modules/from/LICENSE.APACHE2 | 15 + .../node_modules/from/LICENSE.MIT | 24 + .../event-stream/node_modules/from/index.js | 68 + .../node_modules/from/package.json | 38 + .../node_modules/from/readme.markdown | 38 + .../node_modules/from/test/index.js | 141 + .../node_modules/map-stream/.npmignore | 3 + .../node_modules/map-stream/.travis.yml | 4 + .../node_modules/map-stream/LICENCE | 22 + .../map-stream/examples/pretty.js | 26 + .../node_modules/map-stream/index.js | 145 + .../node_modules/map-stream/package.json | 34 + .../node_modules/map-stream/readme.markdown | 37 + .../map-stream/test/simple-map.asynct.js | 318 + .../node_modules/pause-stream/.npmignore | 3 + .../node_modules/pause-stream/LICENSE | 231 + .../node_modules/pause-stream/index.js | 3 + .../node_modules/pause-stream/package.json | 47 + .../node_modules/pause-stream/readme.markdown | 29 + .../node_modules/pause-stream/test/index.js | 17 + .../pause-stream/test/pause-end.js | 33 + .../node_modules/split/.npmignore | 3 + .../node_modules/split/.travis.yml | 4 + .../event-stream/node_modules/split/LICENCE | 22 + .../node_modules/split/examples/pretty.js | 26 + .../event-stream/node_modules/split/index.js | 59 + .../node_modules/split/package.json | 39 + .../node_modules/split/readme.markdown | 39 + .../split/test/partitioned_unicode.js | 34 + .../node_modules/split/test/split.asynct.js | 85 + .../split/test/try_catch.asynct.js | 51 + .../node_modules/stream-combiner/.npmignore | 3 + .../node_modules/stream-combiner/.travis.yml | 4 + .../node_modules/stream-combiner/LICENSE | 22 + .../node_modules/stream-combiner/README.md | 29 + .../node_modules/stream-combiner/index.js | 39 + .../node_modules/stream-combiner/package.json | 33 + .../stream-combiner/test/index.js | 52 + .../node_modules/through/.travis.yml | 5 + .../node_modules/through/LICENSE.APACHE2 | 15 + .../node_modules/through/LICENSE.MIT | 24 + .../node_modules/through/index.js | 108 + .../node_modules/through/package.json | 46 + .../node_modules/through/readme.markdown | 63 + .../node_modules/through/test/auto-destroy.js | 30 + .../node_modules/through/test/buffering.js | 71 + .../node_modules/through/test/end.js | 45 + .../node_modules/through/test/index.js | 114 + .../node_modules/event-stream/package.json | 63 + .../node_modules/event-stream/readme.markdown | 323 + .../event-stream/test/connect.asynct.js | 86 + .../event-stream/test/helper/index.js | 12 + .../event-stream/test/merge.asynct.js | 21 + .../event-stream/test/pause.asynct.js | 39 + .../event-stream/test/pipeline.asynct.js | 52 + .../event-stream/test/readArray.asynct.js | 89 + .../event-stream/test/readable.asynct.js | 175 + .../event-stream/test/replace.asynct.js | 51 + .../event-stream/test/simple-map.asynct.js | 343 + .../event-stream/test/spec.asynct.js | 86 + .../event-stream/test/split.asynct.js | 47 + .../event-stream/test/stringify.js | 15 + .../event-stream/test/writeArray.asynct.js | 31 + .../node_modules/gulp-util/.npmignore | 6 + .../node_modules/gulp-util/.travis.yml | 6 + .../node_modules/gulp-util/LICENSE | 20 + .../node_modules/gulp-util/README.md | 166 + .../node_modules/gulp-util/index.js | 18 + .../node_modules/gulp-util/lib/File.js | 1 + .../node_modules/gulp-util/lib/PluginError.js | 65 + .../node_modules/gulp-util/lib/beep.js | 3 + .../node_modules/gulp-util/lib/buffer.js | 15 + .../node_modules/gulp-util/lib/colors.js | 1 + .../node_modules/gulp-util/lib/combine.js | 11 + .../node_modules/gulp-util/lib/date.js | 1 + .../node_modules/gulp-util/lib/env.js | 4 + .../node_modules/gulp-util/lib/isBuffer.js | 7 + .../node_modules/gulp-util/lib/isNull.js | 3 + .../node_modules/gulp-util/lib/isStream.js | 5 + .../node_modules/gulp-util/lib/linefeed.js | 1 + .../node_modules/gulp-util/lib/log.js | 9 + .../node_modules/gulp-util/lib/noop.js | 5 + .../gulp-util/lib/replaceExtension.js | 9 + .../node_modules/gulp-util/lib/template.js | 19 + .../gulp-util/node_modules/chalk/index.js | 63 + .../chalk/node_modules/.bin/strip-ansi | 1 + .../node_modules/ansi-styles/ansi-styles.js | 38 + .../node_modules/ansi-styles/package.json | 58 + .../chalk/node_modules/ansi-styles/readme.md | 65 + .../chalk/node_modules/has-color/has-color.js | 24 + .../chalk/node_modules/has-color/package.json | 55 + .../chalk/node_modules/has-color/readme.md | 28 + .../chalk/node_modules/strip-ansi/cli.js | 27 + .../chalk/node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/package.json | 64 + .../chalk/node_modules/strip-ansi/readme.md | 46 + .../gulp-util/node_modules/chalk/package.json | 61 + .../gulp-util/node_modules/chalk/readme.md | 158 + .../gulp-util/node_modules/dateformat/LICENSE | 20 + .../node_modules/dateformat/Readme.md | 79 + .../node_modules/dateformat/lib/dateformat.js | 183 + .../node_modules/dateformat/package.json | 40 + .../node_modules/dateformat/test/basic.js | 45 + .../dateformat/test/test_dayofweek.js | 10 + .../dateformat/test/test_weekofyear.js | 4 + .../dateformat/test/test_weekofyear.sh | 27 + .../lodash._reinterpolate/LICENSE.txt | 22 + .../lodash._reinterpolate/README.md | 15 + .../lodash._reinterpolate/index.js | 13 + .../lodash._reinterpolate/package.json | 45 + .../node_modules/lodash.template/LICENSE.txt | 22 + .../node_modules/lodash.template/README.md | 15 + .../node_modules/lodash.template/index.js | 216 + .../lodash._escapestringchar/LICENSE.txt | 22 + .../lodash._escapestringchar/README.md | 15 + .../lodash._escapestringchar/index.js | 33 + .../lodash._escapestringchar/package.json | 45 + .../node_modules/lodash.defaults/LICENSE.txt | 22 + .../node_modules/lodash.defaults/README.md | 15 + .../node_modules/lodash.defaults/index.js | 54 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 45 + .../node_modules/lodash.defaults/package.json | 56 + .../node_modules/lodash.escape/LICENSE.txt | 22 + .../node_modules/lodash.escape/README.md | 15 + .../node_modules/lodash.escape/index.js | 31 + .../lodash._escapehtmlchar/LICENSE.txt | 22 + .../lodash._escapehtmlchar/README.md | 15 + .../lodash._escapehtmlchar/index.js | 22 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 45 + .../lodash._escapehtmlchar/package.json | 48 + .../lodash._reunescapedhtml/LICENSE.txt | 22 + .../lodash._reunescapedhtml/README.md | 15 + .../lodash._reunescapedhtml/index.js | 15 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 45 + .../lodash._reunescapedhtml/package.json | 49 + .../node_modules/lodash.escape/package.json | 57 + .../node_modules/lodash.keys/LICENSE.txt | 22 + .../node_modules/lodash.keys/README.md | 15 + .../node_modules/lodash.keys/index.js | 36 + .../node_modules/lodash._isnative/LICENSE.txt | 22 + .../node_modules/lodash._isnative/README.md | 15 + .../node_modules/lodash._isnative/index.js | 34 + .../lodash._isnative/package.json | 45 + .../node_modules/lodash._shimkeys/LICENSE.txt | 22 + .../node_modules/lodash._shimkeys/README.md | 15 + .../node_modules/lodash._shimkeys/index.js | 38 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 46 + .../lodash._shimkeys/package.json | 48 + .../node_modules/lodash.isobject/LICENSE.txt | 22 + .../node_modules/lodash.isobject/README.md | 15 + .../node_modules/lodash.isobject/index.js | 39 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 46 + .../node_modules/lodash.isobject/package.json | 55 + .../node_modules/lodash.keys/package.json | 57 + .../lodash.templatesettings/LICENSE.txt | 22 + .../lodash.templatesettings/README.md | 15 + .../lodash.templatesettings/index.js | 73 + .../lodash.templatesettings/package.json | 56 + .../node_modules/lodash.values/LICENSE.txt | 22 + .../node_modules/lodash.values/README.md | 15 + .../node_modules/lodash.values/index.js | 36 + .../node_modules/lodash.values/package.json | 55 + .../node_modules/lodash.template/package.json | 61 + .../node_modules/minimist/.travis.yml | 4 + .../gulp-util/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../gulp-util/node_modules/minimist/index.js | 187 + .../node_modules/minimist/package.json | 50 + .../node_modules/minimist/readme.markdown | 73 + .../node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../node_modules/minimist/test/dotted.js | 16 + .../node_modules/minimist/test/long.js | 31 + .../node_modules/minimist/test/parse.js | 297 + .../minimist/test/parse_modified.js | 9 + .../node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../node_modules/multipipe/.npmignore | 1 + .../node_modules/multipipe/.travis.yml | 3 + .../node_modules/multipipe/History.md | 10 + .../gulp-util/node_modules/multipipe/Makefile | 10 + .../node_modules/multipipe/Readme.md | 74 + .../gulp-util/node_modules/multipipe/index.js | 57 + .../node_modules/duplexer2/.npmignore | 1 + .../node_modules/duplexer2/.travis.yml | 3 + .../node_modules/duplexer2/LICENSE.md | 26 + .../node_modules/duplexer2/README.md | 129 + .../node_modules/duplexer2/example.js | 49 + .../multipipe/node_modules/duplexer2/index.js | 62 + .../node_modules/duplexer2/package.json | 37 + .../node_modules/duplexer2/test/tests.js | 161 + .../node_modules/multipipe/package.json | 26 + .../node_modules/multipipe/test/multipipe.js | 85 + .../gulp-util/node_modules/through2/.jshintrc | 59 + .../node_modules/through2/.npmignore | 1 + .../node_modules/through2/.travis.yml | 17 + .../gulp-util/node_modules/through2/LICENSE | 39 + .../gulp-util/node_modules/through2/README.md | 131 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 27 + .../node_modules/readable-stream/README.md | 768 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 68 + .../readable-stream/lib/_stream_duplex.js | 69 + .../lib/_stream_passthrough.js | 41 + .../readable-stream/lib/_stream_readable.js | 927 + .../readable-stream/lib/_stream_transform.js | 205 + .../readable-stream/lib/_stream_writable.js | 371 + .../node_modules/string_decoder/.npmignore | 1 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../string_decoder/build/.npmignore | 1 + .../string_decoder/build/build.js | 94 + .../string_decoder/build/files.js | 36 + .../string_decoder/build/package.json | 12 + .../string_decoder/build/test-replacements.js | 24 + .../node_modules/string_decoder/index.js | 200 + .../node_modules/string_decoder/package.json | 32 + .../string_decoder/test/common.js | 200 + .../test/simple/test-string-decoder-end.js | 75 + .../test/simple/test-string-decoder.js | 163 + .../node_modules/readable-stream/package.json | 38 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 6 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../through2/node_modules/xtend/.npmignore | 1 + .../through2/node_modules/xtend/LICENCE | 19 + .../through2/node_modules/xtend/Makefile | 4 + .../through2/node_modules/xtend/README.md | 27 + .../through2/node_modules/xtend/has-keys.js | 7 + .../through2/node_modules/xtend/index.js | 25 + .../through2/node_modules/xtend/mutable.js | 25 + .../xtend/node_modules/object-keys/.npmignore | 1 + .../node_modules/object-keys/.travis.yml | 5 + .../xtend/node_modules/object-keys/README.md | 39 + .../xtend/node_modules/object-keys/foreach.js | 40 + .../xtend/node_modules/object-keys/index.js | 2 + .../node_modules/object-keys/isArguments.js | 16 + .../node_modules/object-keys/package.json | 56 + .../xtend/node_modules/object-keys/shim.js | 62 + .../node_modules/object-keys/test/foreach.js | 156 + .../node_modules/object-keys/test/index.js | 6 + .../object-keys/test/isArguments.js | 10 + .../node_modules/object-keys/test/shim.js | 134 + .../through2/node_modules/xtend/package.json | 72 + .../through2/node_modules/xtend/test.js | 63 + .../node_modules/through2/package.json | 44 + .../node_modules/through2/test/basic-test.js | 334 + .../node_modules/through2/test/bench.js | 42 + .../node_modules/through2/test/sauce.js | 38 + .../node_modules/through2/test/test.js | 9 + .../node_modules/through2/through2.js | 78 + .../gulp-util/node_modules/vinyl/.npmignore | 6 + .../gulp-util/node_modules/vinyl/.travis.yml | 6 + .../gulp-util/node_modules/vinyl/LICENSE | 20 + .../gulp-util/node_modules/vinyl/README.md | 123 + .../gulp-util/node_modules/vinyl/index.js | 128 + .../node_modules/vinyl/lib/cloneBuffer.js | 7 + .../node_modules/vinyl/lib/inspectStream.js | 12 + .../node_modules/vinyl/lib/isBuffer.js | 7 + .../node_modules/vinyl/lib/isNull.js | 3 + .../node_modules/vinyl/lib/isStream.js | 5 + .../vinyl/node_modules/clone-stats/LICENSE.md | 21 + .../vinyl/node_modules/clone-stats/README.md | 17 + .../vinyl/node_modules/clone-stats/index.js | 13 + .../node_modules/clone-stats/package.json | 39 + .../vinyl/node_modules/clone-stats/test.js | 36 + .../gulp-util/node_modules/vinyl/package.json | 51 + .../gulp-util/node_modules/vinyl/test/File.js | 540 + .../node_modules/vinyl/test/cloneBuffer.js | 28 + .../node_modules/vinyl/test/inspectStream.js | 53 + .../node_modules/vinyl/test/isBuffer.js | 29 + .../node_modules/vinyl/test/isNull.js | 23 + .../node_modules/vinyl/test/isStream.js | 29 + .../node_modules/gulp-util/package.json | 58 + .../node_modules/gulp-util/test/File.js | 46 + .../gulp-util/test/PluginError.js | 70 + .../node_modules/gulp-util/test/beep.js | 23 + .../node_modules/gulp-util/test/buffer.js | 36 + .../node_modules/gulp-util/test/colors.js | 11 + .../node_modules/gulp-util/test/combine.js | 38 + .../node_modules/gulp-util/test/date.js | 17 + .../node_modules/gulp-util/test/env.js | 12 + .../node_modules/gulp-util/test/isBuffer.js | 16 + .../node_modules/gulp-util/test/isNull.js | 20 + .../node_modules/gulp-util/test/isStream.js | 16 + .../node_modules/gulp-util/test/linefeed.js | 5 + .../node_modules/gulp-util/test/log.js | 23 + .../node_modules/gulp-util/test/noop.js | 24 + .../gulp-util/test/replaceExtension.js | 34 + .../node_modules/gulp-util/test/template.js | 99 + node_modules/gulp-minify-css/package.json | 46 + .../gulp-minify-css/test/fixture/index.css | 81 + node_modules/gulp-minify-css/test/minify.js | 64 + node_modules/gulp-sass/.npmignore | 15 + node_modules/gulp-sass/.travis.yml | 3 + node_modules/gulp-sass/LICENSE | 20 + node_modules/gulp-sass/README.md | 73 + node_modules/gulp-sass/index.js | 62 + .../gulp-sass/node_modules/.bin/node-sass | 1 + .../node_modules/gulp-util/.npmignore | 6 + .../node_modules/gulp-util/.travis.yml | 6 + .../gulp-sass/node_modules/gulp-util/LICENSE | 20 + .../node_modules/gulp-util/README.md | 166 + .../gulp-sass/node_modules/gulp-util/index.js | 18 + .../node_modules/gulp-util/lib/File.js | 1 + .../node_modules/gulp-util/lib/PluginError.js | 65 + .../node_modules/gulp-util/lib/beep.js | 3 + .../node_modules/gulp-util/lib/buffer.js | 15 + .../node_modules/gulp-util/lib/colors.js | 1 + .../node_modules/gulp-util/lib/combine.js | 11 + .../node_modules/gulp-util/lib/date.js | 1 + .../node_modules/gulp-util/lib/env.js | 4 + .../node_modules/gulp-util/lib/isBuffer.js | 7 + .../node_modules/gulp-util/lib/isNull.js | 3 + .../node_modules/gulp-util/lib/isStream.js | 5 + .../node_modules/gulp-util/lib/linefeed.js | 1 + .../node_modules/gulp-util/lib/log.js | 9 + .../node_modules/gulp-util/lib/noop.js | 5 + .../gulp-util/lib/replaceExtension.js | 9 + .../node_modules/gulp-util/lib/template.js | 19 + .../gulp-util/node_modules/chalk/index.js | 63 + .../chalk/node_modules/.bin/strip-ansi | 1 + .../node_modules/ansi-styles/ansi-styles.js | 38 + .../node_modules/ansi-styles/package.json | 58 + .../chalk/node_modules/ansi-styles/readme.md | 65 + .../chalk/node_modules/has-color/has-color.js | 24 + .../chalk/node_modules/has-color/package.json | 55 + .../chalk/node_modules/has-color/readme.md | 28 + .../chalk/node_modules/strip-ansi/cli.js | 27 + .../chalk/node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/package.json | 64 + .../chalk/node_modules/strip-ansi/readme.md | 46 + .../gulp-util/node_modules/chalk/package.json | 61 + .../gulp-util/node_modules/chalk/readme.md | 158 + .../gulp-util/node_modules/dateformat/LICENSE | 20 + .../node_modules/dateformat/Readme.md | 79 + .../node_modules/dateformat/lib/dateformat.js | 183 + .../node_modules/dateformat/package.json | 40 + .../node_modules/dateformat/test/basic.js | 45 + .../dateformat/test/test_dayofweek.js | 10 + .../dateformat/test/test_weekofyear.js | 4 + .../dateformat/test/test_weekofyear.sh | 27 + .../lodash._reinterpolate/LICENSE.txt | 22 + .../lodash._reinterpolate/README.md | 15 + .../lodash._reinterpolate/index.js | 13 + .../lodash._reinterpolate/package.json | 45 + .../node_modules/lodash.template/LICENSE.txt | 22 + .../node_modules/lodash.template/README.md | 15 + .../node_modules/lodash.template/index.js | 216 + .../lodash._escapestringchar/LICENSE.txt | 22 + .../lodash._escapestringchar/README.md | 15 + .../lodash._escapestringchar/index.js | 33 + .../lodash._escapestringchar/package.json | 45 + .../node_modules/lodash.defaults/LICENSE.txt | 22 + .../node_modules/lodash.defaults/README.md | 15 + .../node_modules/lodash.defaults/index.js | 54 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 45 + .../node_modules/lodash.defaults/package.json | 56 + .../node_modules/lodash.escape/LICENSE.txt | 22 + .../node_modules/lodash.escape/README.md | 15 + .../node_modules/lodash.escape/index.js | 31 + .../lodash._escapehtmlchar/LICENSE.txt | 22 + .../lodash._escapehtmlchar/README.md | 15 + .../lodash._escapehtmlchar/index.js | 22 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 45 + .../lodash._escapehtmlchar/package.json | 48 + .../lodash._reunescapedhtml/LICENSE.txt | 22 + .../lodash._reunescapedhtml/README.md | 15 + .../lodash._reunescapedhtml/index.js | 15 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 45 + .../lodash._reunescapedhtml/package.json | 49 + .../node_modules/lodash.escape/package.json | 57 + .../node_modules/lodash.keys/LICENSE.txt | 22 + .../node_modules/lodash.keys/README.md | 15 + .../node_modules/lodash.keys/index.js | 36 + .../node_modules/lodash._isnative/LICENSE.txt | 22 + .../node_modules/lodash._isnative/README.md | 15 + .../node_modules/lodash._isnative/index.js | 34 + .../lodash._isnative/package.json | 45 + .../node_modules/lodash._shimkeys/LICENSE.txt | 22 + .../node_modules/lodash._shimkeys/README.md | 15 + .../node_modules/lodash._shimkeys/index.js | 38 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 46 + .../lodash._shimkeys/package.json | 48 + .../node_modules/lodash.isobject/LICENSE.txt | 22 + .../node_modules/lodash.isobject/README.md | 15 + .../node_modules/lodash.isobject/index.js | 39 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 46 + .../node_modules/lodash.isobject/package.json | 55 + .../node_modules/lodash.keys/package.json | 57 + .../lodash.templatesettings/LICENSE.txt | 22 + .../lodash.templatesettings/README.md | 15 + .../lodash.templatesettings/index.js | 73 + .../lodash.templatesettings/package.json | 56 + .../node_modules/lodash.values/LICENSE.txt | 22 + .../node_modules/lodash.values/README.md | 15 + .../node_modules/lodash.values/index.js | 36 + .../node_modules/lodash.values/package.json | 55 + .../node_modules/lodash.template/package.json | 61 + .../node_modules/minimist/.travis.yml | 4 + .../gulp-util/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../gulp-util/node_modules/minimist/index.js | 187 + .../node_modules/minimist/package.json | 50 + .../node_modules/minimist/readme.markdown | 73 + .../node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../node_modules/minimist/test/dotted.js | 16 + .../node_modules/minimist/test/long.js | 31 + .../node_modules/minimist/test/parse.js | 297 + .../minimist/test/parse_modified.js | 9 + .../node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../node_modules/multipipe/.npmignore | 1 + .../node_modules/multipipe/.travis.yml | 3 + .../node_modules/multipipe/History.md | 10 + .../gulp-util/node_modules/multipipe/Makefile | 10 + .../node_modules/multipipe/Readme.md | 74 + .../gulp-util/node_modules/multipipe/index.js | 57 + .../node_modules/duplexer2/.npmignore | 1 + .../node_modules/duplexer2/.travis.yml | 3 + .../node_modules/duplexer2/LICENSE.md | 26 + .../node_modules/duplexer2/README.md | 129 + .../node_modules/duplexer2/example.js | 49 + .../multipipe/node_modules/duplexer2/index.js | 62 + .../node_modules/duplexer2/package.json | 37 + .../node_modules/duplexer2/test/tests.js | 161 + .../node_modules/multipipe/package.json | 26 + .../node_modules/multipipe/test/multipipe.js | 85 + .../gulp-util/node_modules/through2/.jshintrc | 59 + .../node_modules/through2/.npmignore | 1 + .../node_modules/through2/.travis.yml | 17 + .../gulp-util/node_modules/through2/LICENSE | 39 + .../gulp-util/node_modules/through2/README.md | 131 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 27 + .../node_modules/readable-stream/README.md | 768 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 68 + .../readable-stream/lib/_stream_duplex.js | 69 + .../lib/_stream_passthrough.js | 41 + .../readable-stream/lib/_stream_readable.js | 927 + .../readable-stream/lib/_stream_transform.js | 205 + .../readable-stream/lib/_stream_writable.js | 371 + .../node_modules/string_decoder/.npmignore | 1 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../string_decoder/build/.npmignore | 1 + .../string_decoder/build/build.js | 94 + .../string_decoder/build/files.js | 36 + .../string_decoder/build/package.json | 12 + .../string_decoder/build/test-replacements.js | 24 + .../node_modules/string_decoder/index.js | 200 + .../node_modules/string_decoder/package.json | 32 + .../string_decoder/test/common.js | 200 + .../test/simple/test-string-decoder-end.js | 75 + .../test/simple/test-string-decoder.js | 163 + .../node_modules/readable-stream/package.json | 38 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 6 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../through2/node_modules/xtend/.npmignore | 1 + .../through2/node_modules/xtend/LICENCE | 19 + .../through2/node_modules/xtend/Makefile | 4 + .../through2/node_modules/xtend/README.md | 27 + .../through2/node_modules/xtend/has-keys.js | 7 + .../through2/node_modules/xtend/index.js | 25 + .../through2/node_modules/xtend/mutable.js | 25 + .../xtend/node_modules/object-keys/.npmignore | 1 + .../node_modules/object-keys/.travis.yml | 5 + .../xtend/node_modules/object-keys/README.md | 39 + .../xtend/node_modules/object-keys/foreach.js | 40 + .../xtend/node_modules/object-keys/index.js | 2 + .../node_modules/object-keys/isArguments.js | 16 + .../node_modules/object-keys/package.json | 56 + .../xtend/node_modules/object-keys/shim.js | 62 + .../node_modules/object-keys/test/foreach.js | 156 + .../node_modules/object-keys/test/index.js | 6 + .../object-keys/test/isArguments.js | 10 + .../node_modules/object-keys/test/shim.js | 134 + .../through2/node_modules/xtend/package.json | 72 + .../through2/node_modules/xtend/test.js | 63 + .../node_modules/through2/package.json | 44 + .../node_modules/through2/test/basic-test.js | 334 + .../node_modules/through2/test/bench.js | 42 + .../node_modules/through2/test/sauce.js | 38 + .../node_modules/through2/test/test.js | 9 + .../node_modules/through2/through2.js | 78 + .../gulp-util/node_modules/vinyl/.npmignore | 6 + .../gulp-util/node_modules/vinyl/.travis.yml | 6 + .../gulp-util/node_modules/vinyl/LICENSE | 20 + .../gulp-util/node_modules/vinyl/README.md | 123 + .../gulp-util/node_modules/vinyl/index.js | 128 + .../node_modules/vinyl/lib/cloneBuffer.js | 7 + .../node_modules/vinyl/lib/inspectStream.js | 12 + .../node_modules/vinyl/lib/isBuffer.js | 7 + .../node_modules/vinyl/lib/isNull.js | 3 + .../node_modules/vinyl/lib/isStream.js | 5 + .../vinyl/node_modules/clone-stats/LICENSE.md | 21 + .../vinyl/node_modules/clone-stats/README.md | 17 + .../vinyl/node_modules/clone-stats/index.js | 13 + .../node_modules/clone-stats/package.json | 39 + .../vinyl/node_modules/clone-stats/test.js | 36 + .../gulp-util/node_modules/vinyl/package.json | 51 + .../gulp-util/node_modules/vinyl/test/File.js | 540 + .../node_modules/vinyl/test/cloneBuffer.js | 28 + .../node_modules/vinyl/test/inspectStream.js | 53 + .../node_modules/vinyl/test/isBuffer.js | 29 + .../node_modules/vinyl/test/isNull.js | 23 + .../node_modules/vinyl/test/isStream.js | 29 + .../node_modules/gulp-util/package.json | 58 + .../node_modules/gulp-util/test/File.js | 46 + .../gulp-util/test/PluginError.js | 70 + .../node_modules/gulp-util/test/beep.js | 23 + .../node_modules/gulp-util/test/buffer.js | 36 + .../node_modules/gulp-util/test/colors.js | 11 + .../node_modules/gulp-util/test/combine.js | 38 + .../node_modules/gulp-util/test/date.js | 17 + .../node_modules/gulp-util/test/env.js | 12 + .../node_modules/gulp-util/test/isBuffer.js | 16 + .../node_modules/gulp-util/test/isNull.js | 20 + .../node_modules/gulp-util/test/isStream.js | 16 + .../node_modules/gulp-util/test/linefeed.js | 5 + .../node_modules/gulp-util/test/log.js | 23 + .../node_modules/gulp-util/test/noop.js | 24 + .../gulp-util/test/replaceExtension.js | 34 + .../node_modules/gulp-util/test/template.js | 99 + .../node_modules/map-stream/.npmignore | 3 + .../node_modules/map-stream/.travis.yml | 4 + .../gulp-sass/node_modules/map-stream/LICENCE | 22 + .../map-stream/examples/pretty.js | 26 + .../node_modules/map-stream/index.js | 145 + .../node_modules/map-stream/package.json | 34 + .../node_modules/map-stream/readme.markdown | 37 + .../map-stream/test/simple-map.asynct.js | 318 + .../node_modules/node-sass/.editorconfig | 11 + .../node_modules/node-sass/.gitmodules | 3 + .../node_modules/node-sass/.jshintignore | 1 + .../node_modules/node-sass/.jshintrc | 15 + .../node_modules/node-sass/.npmignore | 1 + .../node_modules/node-sass/.travis.yml | 3 + .../node_modules/node-sass/CONTRIBUTING.md | 6 + .../gulp-sass/node_modules/node-sass/LICENSE | 20 + .../node_modules/node-sass/README.md | 189 + .../bin/darwin-x64-v8-3.14/binding.node | Bin 0 -> 1304540 bytes .../bin/darwin-x64-v8-3.22/binding.node | Bin 0 -> 1309548 bytes .../bin/linux-ia32-v8-3.14/binding.node | Bin 0 -> 1171214 bytes .../bin/linux-x64-v8-3.14/binding.node | Bin 0 -> 1189254 bytes .../node_modules/node-sass/bin/node-sass | 15 + .../bin/win32-ia32-v8-3.14/binding.node | Bin 0 -> 556032 bytes .../bin/win32-x64-v8-3.14/binding.node | Bin 0 -> 677888 bytes .../node_modules/node-sass/binding.cpp | 208 + .../node_modules/node-sass/binding.gyp | 59 + .../gulp-sass/node_modules/node-sass/build.js | 101 + .../node_modules/node-sass/build/Makefile | 350 + .../Release/.deps/Release/binding.node.d | 1 + .../Release/obj.target/binding/binding.o.d | 34 + .../obj.target/binding/libsass/ast.o.d | 28 + .../obj.target/binding/libsass/base64vlq.o.d | 5 + .../obj.target/binding/libsass/bind.o.d | 31 + .../obj.target/binding/libsass/constants.o.d | 5 + .../obj.target/binding/libsass/context.o.d | 48 + .../binding/libsass/contextualize.o.d | 35 + .../obj.target/binding/libsass/copy_c_str.o.d | 4 + .../binding/libsass/error_handling.o.d | 10 + .../obj.target/binding/libsass/eval.o.d | 36 + .../obj.target/binding/libsass/expand.o.d | 35 + .../obj.target/binding/libsass/extend.o.d | 32 + .../obj.target/binding/libsass/file.o.d | 28 + .../obj.target/binding/libsass/functions.o.d | 37 + .../obj.target/binding/libsass/inspect.o.d | 28 + .../binding/libsass/output_compressed.o.d | 30 + .../binding/libsass/output_nested.o.d | 30 + .../obj.target/binding/libsass/parser.o.d | 34 + .../obj.target/binding/libsass/prelexer.o.d | 6 + .../obj.target/binding/libsass/sass.o.d | 26 + .../binding/libsass/sass_interface.o.d | 28 + .../obj.target/binding/libsass/source_map.o.d | 27 + .../obj.target/binding/libsass/to_c.o.d | 19 + .../obj.target/binding/libsass/to_string.o.d | 29 + .../obj.target/binding/libsass/units.o.d | 5 + .../binding/sass_context_wrapper.o.d | 34 + .../node-sass/build/Release/linker.lock | 0 .../Release/obj.target/binding/binding.o | Bin 0 -> 144412 bytes .../Release/obj.target/binding/libsass/ast.o | Bin 0 -> 215832 bytes .../obj.target/binding/libsass/base64vlq.o | Bin 0 -> 23464 bytes .../Release/obj.target/binding/libsass/bind.o | Bin 0 -> 430052 bytes .../obj.target/binding/libsass/constants.o | Bin 0 -> 25292 bytes .../obj.target/binding/libsass/context.o | Bin 0 -> 918252 bytes .../binding/libsass/contextualize.o | Bin 0 -> 403336 bytes .../obj.target/binding/libsass/copy_c_str.o | Bin 0 -> 3100 bytes .../binding/libsass/error_handling.o | Bin 0 -> 96276 bytes .../Release/obj.target/binding/libsass/eval.o | Bin 0 -> 1209700 bytes .../obj.target/binding/libsass/expand.o | Bin 0 -> 993712 bytes .../obj.target/binding/libsass/extend.o | Bin 0 -> 347048 bytes .../Release/obj.target/binding/libsass/file.o | Bin 0 -> 128900 bytes .../obj.target/binding/libsass/functions.o | Bin 0 -> 1202804 bytes .../obj.target/binding/libsass/inspect.o | Bin 0 -> 604572 bytes .../binding/libsass/output_compressed.o | Bin 0 -> 270240 bytes .../binding/libsass/output_nested.o | Bin 0 -> 242872 bytes .../obj.target/binding/libsass/parser.o | Bin 0 -> 1718884 bytes .../obj.target/binding/libsass/prelexer.o | Bin 0 -> 240656 bytes .../Release/obj.target/binding/libsass/sass.o | Bin 0 -> 276772 bytes .../binding/libsass/sass_interface.o | Bin 0 -> 374200 bytes .../obj.target/binding/libsass/source_map.o | Bin 0 -> 130084 bytes .../Release/obj.target/binding/libsass/to_c.o | Bin 0 -> 212528 bytes .../obj.target/binding/libsass/to_string.o | Bin 0 -> 163616 bytes .../obj.target/binding/libsass/units.o | Bin 0 -> 20204 bytes .../obj.target/binding/sass_context_wrapper.o | Bin 0 -> 66680 bytes .../node-sass/build/binding.Makefile | 6 + .../node-sass/build/binding.target.mk | 177 + .../node_modules/node-sass/build/config.gypi | 119 + .../node_modules/node-sass/build/gyp-mac-tool | 265 + .../node-sass/examples/middleware.js | 23 + .../node-sass/examples/public/.npmignore | 1 + .../node_modules/node-sass/examples/test.scss | 13 + .../node_modules/node-sass/lib/cli.js | 156 + .../node_modules/node-sass/lib/middleware.js | 207 + .../node_modules/node-sass/lib/render.js | 53 + .../node_modules/node-sass/libsass/.npmignore | 50 + .../node-sass/libsass/.travis.yml | 18 + .../node_modules/node-sass/libsass/COPYING | 25 + .../node_modules/node-sass/libsass/INSTALL | 370 + .../node_modules/node-sass/libsass/LICENSE | 25 + .../node_modules/node-sass/libsass/Makefile | 60 + .../node-sass/libsass/Makefile.am | 57 + .../node_modules/node-sass/libsass/Readme.md | 113 + .../node_modules/node-sass/libsass/ast.cpp | 76 + .../node_modules/node-sass/libsass/ast.hpp | 1234 + .../node-sass/libsass/ast_def_macros.hpp | 16 + .../node-sass/libsass/ast_factory.hpp | 82 + .../node-sass/libsass/ast_fwd_decl.hpp | 66 + .../node-sass/libsass/backtrace.hpp | 61 + .../node-sass/libsass/base64vlq.cpp | 43 + .../node-sass/libsass/base64vlq.hpp | 28 + .../node_modules/node-sass/libsass/bind.cpp | 160 + .../node_modules/node-sass/libsass/bind.hpp | 18 + .../node-sass/libsass/color_names.hpp | 311 + .../node-sass/libsass/configure.ac | 73 + .../node-sass/libsass/constants.cpp | 132 + .../node-sass/libsass/constants.hpp | 132 + .../node-sass/libsass/context.cpp | 394 + .../node-sass/libsass/context.hpp | 93 + .../node-sass/libsass/contextualize.cpp | 137 + .../node-sass/libsass/contextualize.hpp | 65 + .../node-sass/libsass/copy_c_str.cpp | 13 + .../node-sass/libsass/copy_c_str.hpp | 5 + .../node-sass/libsass/environment.hpp | 56 + .../node-sass/libsass/error_handling.cpp | 28 + .../node-sass/libsass/error_handling.hpp | 28 + .../node_modules/node-sass/libsass/eval.cpp | 853 + .../node_modules/node-sass/libsass/eval.hpp | 77 + .../node_modules/node-sass/libsass/expand.cpp | 334 + .../node_modules/node-sass/libsass/expand.hpp | 76 + .../node_modules/node-sass/libsass/extconf.rb | 6 + .../node_modules/node-sass/libsass/extend.cpp | 116 + .../node_modules/node-sass/libsass/extend.hpp | 47 + .../node_modules/node-sass/libsass/file.cpp | 144 + .../node_modules/node-sass/libsass/file.hpp | 16 + .../node-sass/libsass/functions.cpp | 978 + .../node-sass/libsass/functions.hpp | 141 + .../node-sass/libsass/inspect.cpp | 640 + .../node-sass/libsass/inspect.hpp | 99 + .../node-sass/libsass/kwd_arg_macros.hpp | 23 + .../node-sass/libsass/m4/.gitkeep | 0 .../node-sass/libsass/mapping.hpp | 17 + .../node-sass/libsass/memory_manager.hpp | 54 + .../node-sass/libsass/operation.hpp | 141 + .../node-sass/libsass/output_compressed.cpp | 249 + .../node-sass/libsass/output_compressed.hpp | 87 + .../node-sass/libsass/output_nested.cpp | 225 + .../node-sass/libsass/output_nested.hpp | 98 + .../node_modules/node-sass/libsass/parser.cpp | 1610 ++ .../node_modules/node-sass/libsass/parser.hpp | 239 + .../node-sass/libsass/position.hpp | 22 + .../node-sass/libsass/prelexer.cpp | 479 + .../node-sass/libsass/prelexer.hpp | 472 + .../node_modules/node-sass/libsass/sass.cpp | 154 + .../node_modules/node-sass/libsass/sass.h | 130 + .../node-sass/libsass/sass_interface.cpp | 187 + .../node-sass/libsass/sass_interface.h | 74 + .../node-sass/libsass/sassc++.cpp | 40 + .../node-sass/libsass/source_map.cpp | 99 + .../node-sass/libsass/source_map.hpp | 49 + .../node-sass/libsass/support/libsass.pc.in | 11 + .../node-sass/libsass/test-driver | 127 + .../node_modules/node-sass/libsass/to_c.cpp | 47 + .../node_modules/node-sass/libsass/to_c.hpp | 44 + .../node-sass/libsass/to_string.cpp | 29 + .../node-sass/libsass/to_string.hpp | 32 + .../node_modules/node-sass/libsass/token.hpp | 32 + .../node_modules/node-sass/libsass/travis.sh | 15 + .../node_modules/node-sass/libsass/units.cpp | 44 + .../node_modules/node-sass/libsass/units.hpp | 11 + .../node-sass/node_modules/.bin/_mocha | 1 + .../node-sass/node_modules/.bin/mocha | 1 + .../node-sass/node_modules/chalk/chalk.js | 64 + .../node_modules/ansi-styles/ansi-styles.js | 29 + .../node_modules/ansi-styles/package.json | 58 + .../chalk/node_modules/ansi-styles/readme.md | 65 + .../chalk/node_modules/has-color/has-color.js | 24 + .../chalk/node_modules/has-color/package.json | 55 + .../chalk/node_modules/has-color/readme.md | 28 + .../node-sass/node_modules/chalk/package.json | 61 + .../node-sass/node_modules/chalk/readme.md | 134 + .../node-sass/node_modules/mkdirp/.npmignore | 2 + .../node-sass/node_modules/mkdirp/.travis.yml | 5 + .../node-sass/node_modules/mkdirp/LICENSE | 21 + .../node_modules/mkdirp/examples/pow.js | 6 + .../node-sass/node_modules/mkdirp/index.js | 82 + .../node_modules/mkdirp/package.json | 34 + .../node_modules/mkdirp/readme.markdown | 63 + .../node_modules/mkdirp/test/chmod.js | 38 + .../node_modules/mkdirp/test/clobber.js | 37 + .../node_modules/mkdirp/test/mkdirp.js | 28 + .../node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../node_modules/mkdirp/test/race.js | 41 + .../node-sass/node_modules/mkdirp/test/rel.js | 32 + .../node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../node_modules/mkdirp/test/root.js | 18 + .../node_modules/mkdirp/test/sync.js | 32 + .../node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 32 + .../node-sass/node_modules/mocha/Readme.md | 124 + .../node-sass/node_modules/mocha/bin/_mocha | 448 + .../node-sass/node_modules/mocha/bin/mocha | 51 + .../node_modules/mocha/images/error.png | Bin 0 -> 412 bytes .../node_modules/mocha/images/ok.png | Bin 0 -> 388 bytes .../node-sass/node_modules/mocha/index.js | 4 + .../node_modules/mocha/lib/browser/debug.js | 5 + .../node_modules/mocha/lib/browser/events.js | 178 + .../node_modules/mocha/lib/browser/fs.js | 0 .../node_modules/mocha/lib/browser/path.js | 0 .../mocha/lib/browser/progress.js | 125 + .../node_modules/mocha/lib/browser/tty.js | 13 + .../node_modules/mocha/lib/context.js | 69 + .../node-sass/node_modules/mocha/lib/hook.js | 49 + .../node_modules/mocha/lib/interfaces/bdd.js | 135 + .../mocha/lib/interfaces/exports.js | 60 + .../mocha/lib/interfaces/index.js | 5 + .../mocha/lib/interfaces/qunit.js | 122 + .../node_modules/mocha/lib/interfaces/tdd.js | 138 + .../node-sass/node_modules/mocha/lib/mocha.js | 317 + .../node-sass/node_modules/mocha/lib/ms.js | 111 + .../node_modules/mocha/lib/reporters/base.js | 401 + .../node_modules/mocha/lib/reporters/doc.js | 56 + .../node_modules/mocha/lib/reporters/dot.js | 62 + .../mocha/lib/reporters/html-cov.js | 51 + .../node_modules/mocha/lib/reporters/html.js | 253 + .../node_modules/mocha/lib/reporters/index.js | 19 + .../mocha/lib/reporters/json-cov.js | 153 + .../mocha/lib/reporters/json-stream.js | 61 + .../node_modules/mocha/lib/reporters/json.js | 70 + .../mocha/lib/reporters/landing.js | 97 + .../node_modules/mocha/lib/reporters/list.js | 64 + .../mocha/lib/reporters/markdown.js | 91 + .../node_modules/mocha/lib/reporters/min.js | 38 + .../node_modules/mocha/lib/reporters/nyan.js | 260 + .../mocha/lib/reporters/progress.js | 86 + .../node_modules/mocha/lib/reporters/spec.js | 87 + .../node_modules/mocha/lib/reporters/tap.js | 73 + .../mocha/lib/reporters/teamcity.js | 65 + .../lib/reporters/templates/coverage.jade | 50 + .../mocha/lib/reporters/templates/menu.jade | 13 + .../mocha/lib/reporters/templates/script.html | 34 + .../mocha/lib/reporters/templates/style.html | 320 + .../node_modules/mocha/lib/reporters/xunit.js | 115 + .../node_modules/mocha/lib/runnable.js | 217 + .../node_modules/mocha/lib/runner.js | 561 + .../node-sass/node_modules/mocha/lib/suite.js | 296 + .../node_modules/mocha/lib/template.html | 18 + .../node-sass/node_modules/mocha/lib/test.js | 32 + .../node-sass/node_modules/mocha/lib/utils.js | 281 + .../node-sass/node_modules/mocha/mocha.css | 260 + .../node-sass/node_modules/mocha/mocha.js | 5554 ++++ .../node_modules/mocha/node_modules/.bin/jade | 1 + .../mocha/node_modules/commander/.npmignore | 4 + .../mocha/node_modules/commander/.travis.yml | 4 + .../mocha/node_modules/commander/History.md | 107 + .../mocha/node_modules/commander/Makefile | 7 + .../mocha/node_modules/commander/Readme.md | 262 + .../mocha/node_modules/commander/index.js | 2 + .../node_modules/commander/lib/commander.js | 1026 + .../mocha/node_modules/commander/package.json | 39 + .../mocha/node_modules/debug/Readme.md | 115 + .../mocha/node_modules/debug/debug.js | 137 + .../mocha/node_modules/debug/index.js | 5 + .../mocha/node_modules/debug/lib/debug.js | 147 + .../mocha/node_modules/debug/package.json | 46 + .../mocha/node_modules/diff/README.md | 101 + .../mocha/node_modules/diff/diff.js | 354 + .../mocha/node_modules/diff/package.json | 51 + .../mocha/node_modules/glob/.npmignore | 2 + .../mocha/node_modules/glob/.travis.yml | 3 + .../mocha/node_modules/glob/LICENSE | 27 + .../mocha/node_modules/glob/README.md | 250 + .../mocha/node_modules/glob/examples/g.js | 9 + .../node_modules/glob/examples/usr-local.js | 9 + .../mocha/node_modules/glob/glob.js | 675 + .../glob/node_modules/graceful-fs/.npmignore | 1 + .../glob/node_modules/graceful-fs/LICENSE | 27 + .../glob/node_modules/graceful-fs/README.md | 26 + .../node_modules/graceful-fs/graceful-fs.js | 159 + .../node_modules/graceful-fs/package.json | 49 + .../node_modules/graceful-fs/polyfills.js | 228 + .../node_modules/graceful-fs/test/open.js | 39 + .../glob/node_modules/inherits/LICENSE | 16 + .../glob/node_modules/inherits/README.md | 42 + .../glob/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../glob/node_modules/inherits/package.json | 33 + .../glob/node_modules/inherits/test.js | 25 + .../glob/node_modules/minimatch/.npmignore | 1 + .../glob/node_modules/minimatch/LICENSE | 23 + .../glob/node_modules/minimatch/README.md | 218 + .../glob/node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../glob/node_modules/minimatch/package.json | 40 + .../glob/node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../mocha/node_modules/glob/package.json | 40 + .../mocha/node_modules/glob/test/00-setup.js | 176 + .../node_modules/glob/test/bash-comparison.js | 63 + .../node_modules/glob/test/bash-results.json | 350 + .../mocha/node_modules/glob/test/cwd-test.js | 55 + .../node_modules/glob/test/globstar-match.js | 19 + .../mocha/node_modules/glob/test/mark.js | 74 + .../node_modules/glob/test/nocase-nomagic.js | 113 + .../node_modules/glob/test/pause-resume.js | 73 + .../node_modules/glob/test/root-nomount.js | 39 + .../mocha/node_modules/glob/test/root.js | 46 + .../mocha/node_modules/glob/test/stat.js | 32 + .../node_modules/glob/test/zz-cleanup.js | 11 + .../mocha/node_modules/growl/History.md | 63 + .../mocha/node_modules/growl/Readme.md | 99 + .../mocha/node_modules/growl/lib/growl.js | 234 + .../mocha/node_modules/growl/package.json | 14 + .../mocha/node_modules/growl/test.js | 20 + .../mocha/node_modules/jade/.npmignore | 15 + .../mocha/node_modules/jade/LICENSE | 22 + .../mocha/node_modules/jade/bin/jade | 147 + .../mocha/node_modules/jade/index.js | 4 + .../mocha/node_modules/jade/jade.js | 3586 +++ .../mocha/node_modules/jade/jade.md | 510 + .../mocha/node_modules/jade/jade.min.js | 2 + .../mocha/node_modules/jade/lib/compiler.js | 642 + .../mocha/node_modules/jade/lib/doctypes.js | 18 + .../mocha/node_modules/jade/lib/filters.js | 97 + .../node_modules/jade/lib/inline-tags.js | 28 + .../mocha/node_modules/jade/lib/jade.js | 237 + .../mocha/node_modules/jade/lib/lexer.js | 771 + .../node_modules/jade/lib/nodes/attrs.js | 77 + .../jade/lib/nodes/block-comment.js | 33 + .../node_modules/jade/lib/nodes/block.js | 121 + .../mocha/node_modules/jade/lib/nodes/case.js | 43 + .../mocha/node_modules/jade/lib/nodes/code.js | 35 + .../node_modules/jade/lib/nodes/comment.js | 32 + .../node_modules/jade/lib/nodes/doctype.js | 29 + .../mocha/node_modules/jade/lib/nodes/each.js | 35 + .../node_modules/jade/lib/nodes/filter.js | 35 + .../node_modules/jade/lib/nodes/index.js | 20 + .../node_modules/jade/lib/nodes/literal.js | 32 + .../node_modules/jade/lib/nodes/mixin.js | 36 + .../mocha/node_modules/jade/lib/nodes/node.js | 25 + .../mocha/node_modules/jade/lib/nodes/tag.js | 95 + .../mocha/node_modules/jade/lib/nodes/text.js | 36 + .../mocha/node_modules/jade/lib/parser.js | 710 + .../mocha/node_modules/jade/lib/runtime.js | 174 + .../node_modules/jade/lib/self-closing.js | 19 + .../mocha/node_modules/jade/lib/utils.js | 49 + .../jade/node_modules/mkdirp/.gitignore.orig | 2 + .../jade/node_modules/mkdirp/.gitignore.rej | 5 + .../jade/node_modules/mkdirp/.npmignore | 2 + .../jade/node_modules/mkdirp/LICENSE | 21 + .../jade/node_modules/mkdirp/README.markdown | 54 + .../jade/node_modules/mkdirp/examples/pow.js | 6 + .../node_modules/mkdirp/examples/pow.js.orig | 6 + .../node_modules/mkdirp/examples/pow.js.rej | 19 + .../jade/node_modules/mkdirp/index.js | 79 + .../jade/node_modules/mkdirp/package.json | 37 + .../jade/node_modules/mkdirp/test/chmod.js | 38 + .../jade/node_modules/mkdirp/test/clobber.js | 37 + .../jade/node_modules/mkdirp/test/mkdirp.js | 28 + .../jade/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../jade/node_modules/mkdirp/test/race.js | 41 + .../jade/node_modules/mkdirp/test/rel.js | 32 + .../jade/node_modules/mkdirp/test/sync.js | 27 + .../jade/node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 27 + .../mocha/node_modules/jade/package.json | 48 + .../mocha/node_modules/jade/runtime.js | 179 + .../mocha/node_modules/jade/runtime.min.js | 1 + .../mocha/node_modules/jade/test.jade | 7 + .../mocha/node_modules/jade/testing/head.jade | 5 + .../node_modules/jade/testing/index.jade | 22 + .../mocha/node_modules/jade/testing/index.js | 11 + .../node_modules/jade/testing/layout.jade | 6 + .../mocha/node_modules/jade/testing/user.jade | 7 + .../mocha/node_modules/jade/testing/user.js | 27 + .../node-sass/node_modules/mocha/package.json | 60 + .../node-sass/node_modules/nan/LICENSE | 43 + .../node-sass/node_modules/nan/README.md | 792 + .../node_modules/nan/build/config.gypi | 38 + .../node_modules/nan/include_dirs.js | 1 + .../node-sass/node_modules/nan/nan.h | 1102 + .../node-sass/node_modules/nan/package.json | 41 + .../node-sass/node_modules/node-watch/LICENSE | 22 + .../node_modules/node-watch/README.md | 74 + .../node_modules/node-watch/index.js | 1 + .../node_modules/node-watch/lib/watch.js | 245 + .../node_modules/node-watch/package.json | 29 + .../node_modules/optimist/.travis.yml | 4 + .../node-sass/node_modules/optimist/LICENSE | 21 + .../node_modules/optimist/example/bool.js | 10 + .../optimist/example/boolean_double.js | 7 + .../optimist/example/boolean_single.js | 7 + .../optimist/example/default_hash.js | 8 + .../optimist/example/default_singles.js | 7 + .../node_modules/optimist/example/divide.js | 8 + .../optimist/example/line_count.js | 20 + .../optimist/example/line_count_options.js | 29 + .../optimist/example/line_count_wrap.js | 29 + .../node_modules/optimist/example/nonopt.js | 4 + .../node_modules/optimist/example/reflect.js | 2 + .../node_modules/optimist/example/short.js | 3 + .../node_modules/optimist/example/string.js | 11 + .../optimist/example/usage-options.js | 19 + .../node_modules/optimist/example/xup.js | 10 + .../node-sass/node_modules/optimist/index.js | 343 + .../node_modules/minimist/.travis.yml | 4 + .../optimist/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../optimist/node_modules/minimist/index.js | 187 + .../node_modules/minimist/package.json | 50 + .../node_modules/minimist/readme.markdown | 73 + .../node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../node_modules/minimist/test/dotted.js | 16 + .../node_modules/minimist/test/long.js | 31 + .../node_modules/minimist/test/parse.js | 297 + .../minimist/test/parse_modified.js | 9 + .../node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../optimist/node_modules/wordwrap/.npmignore | 1 + .../node_modules/wordwrap/README.markdown | 70 + .../node_modules/wordwrap/example/center.js | 10 + .../node_modules/wordwrap/example/meat.js | 3 + .../optimist/node_modules/wordwrap/index.js | 76 + .../node_modules/wordwrap/package.json | 45 + .../node_modules/wordwrap/test/break.js | 30 + .../node_modules/wordwrap/test/idleness.txt | 63 + .../node_modules/wordwrap/test/wrap.js | 31 + .../node_modules/optimist/package.json | 47 + .../node_modules/optimist/readme.markdown | 513 + .../node-sass/node_modules/optimist/test/_.js | 71 + .../node_modules/optimist/test/_/argv.js | 2 + .../node_modules/optimist/test/_/bin.js | 3 + .../node_modules/optimist/test/dash.js | 31 + .../node_modules/optimist/test/parse.js | 446 + .../optimist/test/parse_modified.js | 14 + .../node_modules/optimist/test/short.js | 16 + .../node_modules/optimist/test/usage.js | 292 + .../node_modules/optimist/test/whitespace.js | 8 + .../node_modules/node-sass/package.json | 58 + .../gulp-sass/node_modules/node-sass/sass.js | 101 + .../node-sass/sass_context_wrapper.cpp | 22 + .../node-sass/sass_context_wrapper.h | 21 + .../node-sass/scripts/prepublish.sh | 12 + .../node_modules/node-sass/test/cli.js | 159 + .../node-sass/test/functions/colorBlue.scss | 3 + .../node-sass/test/include_path.scss | 4 + .../node-sass/test/large_test.scss | 11869 ++++++++ .../node_modules/node-sass/test/lib/vars.scss | 1 + .../node-sass/test/mem_test_render.js | 19 + .../node-sass/test/mem_test_renderSync.js | 12 + .../node_modules/node-sass/test/sample.scss | 13 + .../node-sass/test/source_comments_spec.js | 36 + .../node_modules/node-sass/test/test.js | 174 + node_modules/gulp-sass/package.json | 42 + .../gulp-sass/test/ref/inheritance.css | 10 + node_modules/gulp-sass/test/ref/mixins.css | 8 + node_modules/gulp-sass/test/ref/nesting.css | 9 + node_modules/gulp-sass/test/ref/variables.css | 8 + .../gulp-sass/test/scss/includes/_cats.scss | 2 + .../gulp-sass/test/scss/inheritance.scss | 16 + node_modules/gulp-sass/test/scss/mixins.scss | 17 + node_modules/gulp-sass/test/scss/nesting.scss | 14 + .../gulp-sass/test/scss/variables.scss | 14 + node_modules/gulp-sass/test/test.js | 109 + node_modules/gulp/.jshintrc | 12 + node_modules/gulp/.npmignore | 12 + node_modules/gulp/.travis.yml | 6 + node_modules/gulp/CHANGELOG.md | 128 + node_modules/gulp/LICENSE | 20 + node_modules/gulp/README.md | 77 + node_modules/gulp/bin/gulp.js | 202 + node_modules/gulp/completion/README.md | 12 + node_modules/gulp/completion/bash | 29 + node_modules/gulp/completion/zsh | 27 + node_modules/gulp/docs/API.md | 232 + node_modules/gulp/docs/CLI.md | 25 + node_modules/gulp/docs/FAQ.md | 50 + node_modules/gulp/docs/README.md | 30 + node_modules/gulp/docs/getting-started.md | 46 + .../combining-streams-to-handle-errors.md | 38 + .../recipes/mocha-test-runner-with-gulp.md | 69 + .../only-pass-through-changed-files.md | 27 + .../gulp/docs/recipes/pass-params-from-cli.md | 28 + .../recipes/rebuild-only-files-that-change.md | 16 + .../docs/recipes/running-tasks-in-series.md | 34 + .../gulp/docs/recipes/specifying-a-cwd.md | 37 + .../using-coffee-script-for-gulpfile.md | 23 + .../recipes/using-external-config-file.md | 49 + .../using-multiple-sources-in-one-task.md | 17 + .../gulp/docs/writing-a-plugin/README.md | 53 + .../writing-a-plugin/dealing-with-streams.md | 83 + .../gulp/docs/writing-a-plugin/guidelines.md | 97 + .../writing-a-plugin/readme-conventions.md | 218 + .../gulp/docs/writing-a-plugin/testing.md | 95 + .../docs/writing-a-plugin/using-buffers.md | 72 + node_modules/gulp/gulpfile.js | 27 + node_modules/gulp/index.js | 51 + node_modules/gulp/lib/completion.js | 16 + node_modules/gulp/lib/taskTree.js | 11 + node_modules/gulp/node_modules/.bin/semver | 1 + .../gulp/node_modules/archy/.travis.yml | 4 + .../gulp/node_modules/archy/README.markdown | 92 + .../gulp/node_modules/archy/examples/beep.js | 24 + .../node_modules/archy/examples/multi_line.js | 25 + node_modules/gulp/node_modules/archy/index.js | 35 + .../gulp/node_modules/archy/package.json | 49 + .../gulp/node_modules/archy/test/beep.js | 40 + .../node_modules/archy/test/multi_line.js | 45 + .../node_modules/archy/test/non_unicode.js | 40 + .../gulp/node_modules/deprecated/.npmignore | 6 + .../gulp/node_modules/deprecated/.travis.yml | 6 + .../gulp/node_modules/deprecated/LICENSE | 20 + .../gulp/node_modules/deprecated/README.md | 51 + .../gulp/node_modules/deprecated/index.js | 39 + .../gulp/node_modules/deprecated/package.json | 50 + .../node_modules/deprecated/test/field.js | 44 + .../node_modules/deprecated/test/method.js | 32 + .../gulp/node_modules/findup-sync/.jshintrc | 16 + .../gulp/node_modules/findup-sync/.npmignore | 0 .../node_modules/findup-sync/Gruntfile.js | 25 + .../gulp/node_modules/findup-sync/LICENSE-MIT | 22 + .../gulp/node_modules/findup-sync/README.md | 44 + .../findup-sync/lib/findup-sync.js | 46 + .../findup-sync/node_modules/glob/.npmignore | 2 + .../findup-sync/node_modules/glob/.travis.yml | 3 + .../findup-sync/node_modules/glob/LICENSE | 27 + .../findup-sync/node_modules/glob/README.md | 233 + .../node_modules/glob/examples/g.js | 9 + .../node_modules/glob/examples/usr-local.js | 9 + .../findup-sync/node_modules/glob/glob.js | 643 + .../glob/node_modules/graceful-fs/.npmignore | 1 + .../glob/node_modules/graceful-fs/LICENSE | 27 + .../glob/node_modules/graceful-fs/README.md | 33 + .../node_modules/graceful-fs/graceful-fs.js | 442 + .../node_modules/graceful-fs/package.json | 49 + .../node_modules/graceful-fs/test/open.js | 46 + .../node_modules/graceful-fs/test/ulimit.js | 158 + .../glob/node_modules/inherits/README.md | 51 + .../glob/node_modules/inherits/inherits.js | 29 + .../glob/node_modules/inherits/package.json | 30 + .../glob/node_modules/minimatch/.npmignore | 1 + .../glob/node_modules/minimatch/LICENSE | 23 + .../glob/node_modules/minimatch/README.md | 218 + .../glob/node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../glob/node_modules/minimatch/package.json | 40 + .../glob/node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../node_modules/glob/package.json | 40 + .../node_modules/glob/test/00-setup.js | 176 + .../node_modules/glob/test/bash-comparison.js | 63 + .../node_modules/glob/test/bash-results.json | 348 + .../node_modules/glob/test/cwd-test.js | 55 + .../node_modules/glob/test/mark.js | 74 + .../node_modules/glob/test/nocase-nomagic.js | 113 + .../node_modules/glob/test/pause-resume.js | 73 + .../node_modules/glob/test/root-nomount.js | 39 + .../node_modules/glob/test/root.js | 46 + .../node_modules/glob/test/zz-cleanup.js | 11 + .../findup-sync/node_modules/lodash/README.md | 164 + .../node_modules/lodash/dist/lodash.compat.js | 5152 ++++ .../lodash/dist/lodash.compat.min.js | 42 + .../node_modules/lodash/dist/lodash.js | 4983 ++++ .../node_modules/lodash/dist/lodash.min.js | 40 + .../lodash/dist/lodash.underscore.js | 4307 +++ .../lodash/dist/lodash.underscore.min.js | 34 + .../node_modules/lodash/package.json | 62 + .../node_modules/findup-sync/package.json | 48 + .../findup-sync/test/findup-sync_test.js | 48 + .../findup-sync/test/fixtures/a.txt | 0 .../findup-sync/test/fixtures/a/b/bar.txt | 0 .../findup-sync/test/fixtures/a/foo.txt | 0 .../findup-sync/test/fixtures/aaa.txt | 0 .../gulp/node_modules/gulp-util/.npmignore | 6 + .../gulp/node_modules/gulp-util/.travis.yml | 6 + .../gulp/node_modules/gulp-util/LICENSE | 20 + .../gulp/node_modules/gulp-util/README.md | 166 + .../gulp/node_modules/gulp-util/index.js | 18 + .../gulp/node_modules/gulp-util/lib/File.js | 1 + .../node_modules/gulp-util/lib/PluginError.js | 65 + .../gulp/node_modules/gulp-util/lib/beep.js | 3 + .../gulp/node_modules/gulp-util/lib/buffer.js | 15 + .../gulp/node_modules/gulp-util/lib/colors.js | 1 + .../node_modules/gulp-util/lib/combine.js | 11 + .../gulp/node_modules/gulp-util/lib/date.js | 1 + .../gulp/node_modules/gulp-util/lib/env.js | 4 + .../node_modules/gulp-util/lib/isBuffer.js | 7 + .../gulp/node_modules/gulp-util/lib/isNull.js | 3 + .../node_modules/gulp-util/lib/isStream.js | 5 + .../node_modules/gulp-util/lib/linefeed.js | 1 + .../gulp/node_modules/gulp-util/lib/log.js | 9 + .../gulp/node_modules/gulp-util/lib/noop.js | 5 + .../gulp-util/lib/replaceExtension.js | 9 + .../node_modules/gulp-util/lib/template.js | 19 + .../gulp-util/node_modules/chalk/index.js | 63 + .../chalk/node_modules/.bin/strip-ansi | 1 + .../node_modules/ansi-styles/ansi-styles.js | 38 + .../node_modules/ansi-styles/package.json | 62 + .../chalk/node_modules/ansi-styles/readme.md | 65 + .../chalk/node_modules/has-color/has-color.js | 24 + .../chalk/node_modules/has-color/package.json | 59 + .../chalk/node_modules/has-color/readme.md | 28 + .../chalk/node_modules/strip-ansi/cli.js | 27 + .../chalk/node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/package.json | 68 + .../chalk/node_modules/strip-ansi/readme.md | 46 + .../gulp-util/node_modules/chalk/package.json | 65 + .../gulp-util/node_modules/chalk/readme.md | 158 + .../gulp-util/node_modules/dateformat/LICENSE | 20 + .../node_modules/dateformat/Readme.md | 79 + .../node_modules/dateformat/lib/dateformat.js | 183 + .../node_modules/dateformat/package.json | 44 + .../node_modules/dateformat/test/basic.js | 45 + .../dateformat/test/test_dayofweek.js | 10 + .../dateformat/test/test_weekofyear.js | 4 + .../dateformat/test/test_weekofyear.sh | 27 + .../lodash._reinterpolate/LICENSE.txt | 22 + .../lodash._reinterpolate/README.md | 15 + .../lodash._reinterpolate/index.js | 13 + .../lodash._reinterpolate/package.json | 49 + .../node_modules/lodash.template/LICENSE.txt | 22 + .../node_modules/lodash.template/README.md | 15 + .../node_modules/lodash.template/index.js | 216 + .../lodash._escapestringchar/LICENSE.txt | 22 + .../lodash._escapestringchar/README.md | 15 + .../lodash._escapestringchar/index.js | 33 + .../lodash._escapestringchar/package.json | 49 + .../node_modules/lodash.defaults/LICENSE.txt | 22 + .../node_modules/lodash.defaults/README.md | 15 + .../node_modules/lodash.defaults/index.js | 54 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 49 + .../node_modules/lodash.defaults/package.json | 60 + .../node_modules/lodash.escape/LICENSE.txt | 22 + .../node_modules/lodash.escape/README.md | 15 + .../node_modules/lodash.escape/index.js | 31 + .../lodash._escapehtmlchar/LICENSE.txt | 22 + .../lodash._escapehtmlchar/README.md | 15 + .../lodash._escapehtmlchar/index.js | 22 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 49 + .../lodash._escapehtmlchar/package.json | 52 + .../lodash._reunescapedhtml/LICENSE.txt | 22 + .../lodash._reunescapedhtml/README.md | 15 + .../lodash._reunescapedhtml/index.js | 15 + .../lodash._htmlescapes/LICENSE.txt | 22 + .../lodash._htmlescapes/README.md | 15 + .../node_modules/lodash._htmlescapes/index.js | 26 + .../lodash._htmlescapes/package.json | 49 + .../lodash._reunescapedhtml/package.json | 53 + .../node_modules/lodash.escape/package.json | 61 + .../node_modules/lodash.keys/LICENSE.txt | 22 + .../node_modules/lodash.keys/README.md | 15 + .../node_modules/lodash.keys/index.js | 36 + .../node_modules/lodash._isnative/LICENSE.txt | 22 + .../node_modules/lodash._isnative/README.md | 15 + .../node_modules/lodash._isnative/index.js | 34 + .../lodash._isnative/package.json | 49 + .../node_modules/lodash._shimkeys/LICENSE.txt | 22 + .../node_modules/lodash._shimkeys/README.md | 15 + .../node_modules/lodash._shimkeys/index.js | 38 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 50 + .../lodash._shimkeys/package.json | 52 + .../node_modules/lodash.isobject/LICENSE.txt | 22 + .../node_modules/lodash.isobject/README.md | 15 + .../node_modules/lodash.isobject/index.js | 39 + .../lodash._objecttypes/LICENSE.txt | 22 + .../lodash._objecttypes/README.md | 15 + .../node_modules/lodash._objecttypes/index.js | 20 + .../lodash._objecttypes/package.json | 50 + .../node_modules/lodash.isobject/package.json | 59 + .../node_modules/lodash.keys/package.json | 61 + .../lodash.templatesettings/LICENSE.txt | 22 + .../lodash.templatesettings/README.md | 15 + .../lodash.templatesettings/index.js | 73 + .../lodash.templatesettings/package.json | 60 + .../node_modules/lodash.values/LICENSE.txt | 22 + .../node_modules/lodash.values/README.md | 15 + .../node_modules/lodash.values/index.js | 36 + .../node_modules/lodash.values/package.json | 59 + .../node_modules/lodash.template/package.json | 65 + .../node_modules/multipipe/.npmignore | 1 + .../node_modules/multipipe/.travis.yml | 3 + .../node_modules/multipipe/History.md | 10 + .../gulp-util/node_modules/multipipe/Makefile | 10 + .../node_modules/multipipe/Readme.md | 74 + .../gulp-util/node_modules/multipipe/index.js | 57 + .../node_modules/duplexer2/.npmignore | 1 + .../node_modules/duplexer2/.travis.yml | 3 + .../node_modules/duplexer2/LICENSE.md | 26 + .../node_modules/duplexer2/README.md | 129 + .../node_modules/duplexer2/example.js | 49 + .../multipipe/node_modules/duplexer2/index.js | 62 + .../node_modules/duplexer2/package.json | 41 + .../node_modules/duplexer2/test/tests.js | 161 + .../node_modules/multipipe/package.json | 30 + .../node_modules/multipipe/test/multipipe.js | 85 + .../gulp-util/node_modules/through2/.jshintrc | 59 + .../node_modules/through2/.npmignore | 1 + .../node_modules/through2/.travis.yml | 17 + .../gulp-util/node_modules/through2/LICENSE | 39 + .../gulp-util/node_modules/through2/README.md | 131 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 27 + .../node_modules/readable-stream/README.md | 768 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 68 + .../readable-stream/lib/_stream_duplex.js | 69 + .../lib/_stream_passthrough.js | 41 + .../readable-stream/lib/_stream_readable.js | 927 + .../readable-stream/lib/_stream_transform.js | 205 + .../readable-stream/lib/_stream_writable.js | 371 + .../node_modules/string_decoder/.npmignore | 1 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../string_decoder/build/.npmignore | 1 + .../string_decoder/build/build.js | 94 + .../string_decoder/build/files.js | 36 + .../string_decoder/build/package.json | 12 + .../string_decoder/build/test-replacements.js | 24 + .../node_modules/string_decoder/index.js | 200 + .../node_modules/string_decoder/package.json | 32 + .../string_decoder/test/common.js | 200 + .../test/simple/test-string-decoder-end.js | 75 + .../test/simple/test-string-decoder.js | 163 + .../node_modules/readable-stream/package.json | 38 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 6 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../through2/node_modules/xtend/.npmignore | 1 + .../through2/node_modules/xtend/LICENCE | 19 + .../through2/node_modules/xtend/Makefile | 4 + .../through2/node_modules/xtend/README.md | 27 + .../through2/node_modules/xtend/has-keys.js | 7 + .../through2/node_modules/xtend/index.js | 25 + .../through2/node_modules/xtend/mutable.js | 25 + .../xtend/node_modules/object-keys/.npmignore | 1 + .../node_modules/object-keys/.travis.yml | 5 + .../xtend/node_modules/object-keys/README.md | 39 + .../xtend/node_modules/object-keys/foreach.js | 40 + .../xtend/node_modules/object-keys/index.js | 2 + .../node_modules/object-keys/isArguments.js | 16 + .../node_modules/object-keys/package.json | 60 + .../xtend/node_modules/object-keys/shim.js | 62 + .../node_modules/object-keys/test/foreach.js | 156 + .../node_modules/object-keys/test/index.js | 6 + .../object-keys/test/isArguments.js | 10 + .../node_modules/object-keys/test/shim.js | 134 + .../through2/node_modules/xtend/package.json | 76 + .../through2/node_modules/xtend/test.js | 63 + .../node_modules/through2/package.json | 48 + .../node_modules/through2/test/basic-test.js | 334 + .../node_modules/through2/test/bench.js | 42 + .../node_modules/through2/test/sauce.js | 38 + .../node_modules/through2/test/test.js | 9 + .../node_modules/through2/through2.js | 78 + .../gulp-util/node_modules/vinyl/.npmignore | 6 + .../gulp-util/node_modules/vinyl/.travis.yml | 6 + .../gulp-util/node_modules/vinyl/LICENSE | 20 + .../gulp-util/node_modules/vinyl/README.md | 123 + .../gulp-util/node_modules/vinyl/index.js | 128 + .../node_modules/vinyl/lib/cloneBuffer.js | 7 + .../node_modules/vinyl/lib/inspectStream.js | 12 + .../node_modules/vinyl/lib/isBuffer.js | 7 + .../node_modules/vinyl/lib/isNull.js | 3 + .../node_modules/vinyl/lib/isStream.js | 5 + .../vinyl/node_modules/clone-stats/LICENSE.md | 21 + .../vinyl/node_modules/clone-stats/README.md | 17 + .../vinyl/node_modules/clone-stats/index.js | 13 + .../node_modules/clone-stats/package.json | 43 + .../vinyl/node_modules/clone-stats/test.js | 36 + .../gulp-util/node_modules/vinyl/package.json | 55 + .../gulp-util/node_modules/vinyl/test/File.js | 540 + .../node_modules/vinyl/test/cloneBuffer.js | 28 + .../node_modules/vinyl/test/inspectStream.js | 53 + .../node_modules/vinyl/test/isBuffer.js | 29 + .../node_modules/vinyl/test/isNull.js | 23 + .../node_modules/vinyl/test/isStream.js | 29 + .../gulp/node_modules/gulp-util/package.json | 62 + .../gulp/node_modules/gulp-util/test/File.js | 46 + .../gulp-util/test/PluginError.js | 70 + .../gulp/node_modules/gulp-util/test/beep.js | 23 + .../node_modules/gulp-util/test/buffer.js | 36 + .../node_modules/gulp-util/test/colors.js | 11 + .../node_modules/gulp-util/test/combine.js | 38 + .../gulp/node_modules/gulp-util/test/date.js | 17 + .../gulp/node_modules/gulp-util/test/env.js | 12 + .../node_modules/gulp-util/test/isBuffer.js | 16 + .../node_modules/gulp-util/test/isNull.js | 20 + .../node_modules/gulp-util/test/isStream.js | 16 + .../node_modules/gulp-util/test/linefeed.js | 5 + .../gulp/node_modules/gulp-util/test/log.js | 23 + .../gulp/node_modules/gulp-util/test/noop.js | 24 + .../gulp-util/test/replaceExtension.js | 34 + .../node_modules/gulp-util/test/template.js | 99 + .../gulp/node_modules/minimist/.travis.yml | 4 + .../gulp/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../gulp/node_modules/minimist/index.js | 187 + .../gulp/node_modules/minimist/package.json | 54 + .../node_modules/minimist/readme.markdown | 73 + .../gulp/node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../gulp/node_modules/minimist/test/dotted.js | 16 + .../gulp/node_modules/minimist/test/long.js | 31 + .../gulp/node_modules/minimist/test/parse.js | 297 + .../minimist/test/parse_modified.js | 9 + .../gulp/node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../gulp/node_modules/orchestrator/.npmignore | 10 + .../gulp/node_modules/orchestrator/LICENSE | 20 + .../gulp/node_modules/orchestrator/README.md | 286 + .../gulp/node_modules/orchestrator/index.js | 304 + .../node_modules/orchestrator/lib/runTask.js | 66 + .../node_modules/sequencify/.npmignore | 9 + .../node_modules/sequencify/.travis.yml | 6 + .../node_modules/sequencify/LICENSE | 20 + .../node_modules/sequencify/README.md | 68 + .../node_modules/sequencify/index.js | 46 + .../node_modules/sequencify/package.json | 48 + .../node_modules/orchestrator/package.json | 54 + .../node_modules/pretty-hrtime/.npmignore | 10 + .../gulp/node_modules/pretty-hrtime/LICENSE | 20 + .../gulp/node_modules/pretty-hrtime/README.md | 54 + .../gulp/node_modules/pretty-hrtime/index.js | 75 + .../node_modules/pretty-hrtime/package.json | 46 + .../gulp/node_modules/resolve/.travis.yml | 4 + .../gulp/node_modules/resolve/LICENSE | 18 + .../node_modules/resolve/example/async.js | 5 + .../gulp/node_modules/resolve/example/sync.js | 3 + .../gulp/node_modules/resolve/index.js | 5 + .../gulp/node_modules/resolve/lib/async.js | 124 + .../gulp/node_modules/resolve/lib/caller.js | 8 + .../gulp/node_modules/resolve/lib/core.js | 4 + .../gulp/node_modules/resolve/lib/core.json | 38 + .../resolve/lib/node-modules-paths.js | 25 + .../gulp/node_modules/resolve/lib/sync.js | 80 + .../gulp/node_modules/resolve/package.json | 36 + .../gulp/node_modules/resolve/readme.markdown | 144 + .../gulp/node_modules/resolve/test/core.js | 12 + .../gulp/node_modules/resolve/test/filter.js | 18 + .../node_modules/resolve/test/filter_sync.js | 15 + .../gulp/node_modules/resolve/test/mock.js | 142 + .../node_modules/resolve/test/mock_sync.js | 68 + .../node_modules/resolve/test/resolver.js | 281 + .../resolver/bar/node_modules/foo/index.js | 1 + .../resolve/test/resolver/baz/doom.js | 0 .../resolve/test/resolver/baz/package.json | 3 + .../resolve/test/resolver/baz/quux.js | 1 + .../biz/node_modules/garply/lib/index.js | 1 + .../biz/node_modules/garply/package.json | 3 + .../resolver/biz/node_modules/grux/index.js | 1 + .../resolver/biz/node_modules/tiv/index.js | 1 + .../resolve/test/resolver/cup.coffee | 1 + .../node_modules/resolve/test/resolver/foo.js | 1 + .../test/resolver/incorrect_main/index.js | 2 + .../test/resolver/incorrect_main/package.json | 3 + .../resolve/test/resolver/mug.coffee | 0 .../node_modules/resolve/test/resolver/mug.js | 0 .../test/resolver/other_path/lib/other-lib.js | 0 .../resolve/test/resolver/other_path/root.js | 0 .../punycode/node_modules/punycode/index.js | 0 .../resolve/test/resolver/quux/foo/index.js | 1 + .../test/resolver/without_basedir/main.js | 6 + .../without_basedir/node_modules/mymodule.js | 1 + .../resolve/test/resolver_sync.js | 180 + .../gulp/node_modules/semver/.npmignore | 1 + node_modules/gulp/node_modules/semver/LICENSE | 27 + .../gulp/node_modules/semver/Makefile | 24 + .../gulp/node_modules/semver/README.md | 142 + .../gulp/node_modules/semver/bin/semver | 124 + node_modules/gulp/node_modules/semver/foot.js | 6 + node_modules/gulp/node_modules/semver/head.js | 2 + .../gulp/node_modules/semver/package.json | 36 + .../node_modules/semver/semver.browser.js | 1007 + .../node_modules/semver/semver.browser.js.gz | Bin 0 -> 6903 bytes .../gulp/node_modules/semver/semver.js | 1011 + .../gulp/node_modules/semver/semver.min.js | 1 + .../gulp/node_modules/semver/semver.min.js.gz | Bin 0 -> 3231 bytes .../gulp/node_modules/semver/test/amd.js | 15 + .../gulp/node_modules/semver/test/gtr.js | 173 + .../gulp/node_modules/semver/test/index.js | 556 + .../gulp/node_modules/semver/test/ltr.js | 174 + .../node_modules/semver/test/no-module.js | 19 + .../gulp/node_modules/vinyl-fs/.npmignore | 7 + .../gulp/node_modules/vinyl-fs/.travis.yml | 6 + .../gulp/node_modules/vinyl-fs/LICENSE | 20 + .../gulp/node_modules/vinyl-fs/README.md | 85 + .../gulp/node_modules/vinyl-fs/index.js | 5 + .../node_modules/vinyl-fs/lib/dest/index.js | 31 + .../vinyl-fs/lib/dest/writeBuffer.js | 5 + .../vinyl-fs/lib/dest/writeContents.js | 30 + .../vinyl-fs/lib/dest/writeDir.js | 5 + .../vinyl-fs/lib/dest/writeStream.js | 10 + .../vinyl-fs/lib/src/bufferFile.js | 10 + .../vinyl-fs/lib/src/getContents.js | 22 + .../node_modules/vinyl-fs/lib/src/getStats.js | 13 + .../node_modules/vinyl-fs/lib/src/index.js | 25 + .../node_modules/vinyl-fs/lib/src/readDir.js | 4 + .../vinyl-fs/lib/src/streamFile.js | 6 + .../node_modules/glob-stream/.npmignore | 6 + .../node_modules/glob-stream/.travis.yml | 6 + .../vinyl-fs/node_modules/glob-stream/LICENSE | 20 + .../node_modules/glob-stream/README.md | 67 + .../node_modules/glob-stream/index.js | 118 + .../glob-stream/node_modules/glob/.npmignore | 2 + .../glob-stream/node_modules/glob/.travis.yml | 3 + .../glob-stream/node_modules/glob/LICENSE | 27 + .../glob-stream/node_modules/glob/README.md | 250 + .../node_modules/glob/examples/g.js | 9 + .../node_modules/glob/examples/usr-local.js | 9 + .../glob-stream/node_modules/glob/glob.js | 690 + .../glob/node_modules/inherits/LICENSE | 16 + .../glob/node_modules/inherits/README.md | 42 + .../glob/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../glob/node_modules/inherits/package.json | 33 + .../glob/node_modules/inherits/test.js | 25 + .../node_modules/glob/package.json | 43 + .../node_modules/glob/test/00-setup.js | 176 + .../node_modules/glob/test/bash-comparison.js | 63 + .../node_modules/glob/test/bash-results.json | 350 + .../node_modules/glob/test/cwd-test.js | 55 + .../node_modules/glob/test/globstar-match.js | 19 + .../node_modules/glob/test/mark.js | 82 + .../glob/test/new-glob-optional-options.js | 10 + .../node_modules/glob/test/nocase-nomagic.js | 113 + .../node_modules/glob/test/pause-resume.js | 73 + .../node_modules/glob/test/root-nomount.js | 39 + .../node_modules/glob/test/root.js | 46 + .../node_modules/glob/test/stat.js | 32 + .../node_modules/glob/test/zz-cleanup.js | 11 + .../node_modules/glob2base/.npmignore | 6 + .../node_modules/glob2base/.travis.yml | 7 + .../node_modules/glob2base/LICENSE | 20 + .../node_modules/glob2base/README.md | 56 + .../node_modules/glob2base/index.js | 51 + .../node_modules/glob2base/package.json | 45 + .../node_modules/glob2base/test/main.js | 50 + .../node_modules/minimatch/.npmignore | 1 + .../node_modules/minimatch/LICENSE | 23 + .../node_modules/minimatch/README.md | 218 + .../node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../node_modules/minimatch/package.json | 40 + .../node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../ordered-read-streams/.npmignore | 16 + .../ordered-read-streams/.travis.yml | 5 + .../node_modules/ordered-read-streams/LICENSE | 20 + .../ordered-read-streams/README.md | 65 + .../ordered-read-streams/index.js | 65 + .../ordered-read-streams/package.json | 36 + .../ordered-read-streams/test/main.js | 160 + .../node_modules/through/.travis.yml | 5 + .../node_modules/through/LICENSE.APACHE2 | 15 + .../node_modules/through/LICENSE.MIT | 24 + .../glob-stream/node_modules/through/index.js | 108 + .../node_modules/through/package.json | 46 + .../node_modules/through/readme.markdown | 63 + .../node_modules/through/test/auto-destroy.js | 30 + .../node_modules/through/test/buffering.js | 71 + .../node_modules/through/test/end.js | 45 + .../node_modules/through/test/index.js | 114 + .../node_modules/unique-stream/.npmignore | 3 + .../node_modules/unique-stream/.travis.yml | 4 + .../node_modules/unique-stream/README.md | 89 + .../node_modules/unique-stream/index.js | 54 + .../node_modules/unique-stream/package.json | 42 + .../node_modules/unique-stream/test/index.js | 108 + .../node_modules/glob-stream/package.json | 58 + .../glob-stream/test/fixtures/stuff/run.dmc | 0 .../glob-stream/test/fixtures/stuff/test.dmc | 0 .../glob-stream/test/fixtures/test.coffee | 1 + .../hey/isaidhey/whatsgoingon/test.txt | 1 + .../test/fixtures/whatsgoingon/test.js | 1 + .../node_modules/glob-stream/test/main.js | 381 + .../node_modules/glob-watcher/.npmignore | 6 + .../node_modules/glob-watcher/.travis.yml | 6 + .../node_modules/glob-watcher/LICENSE | 20 + .../node_modules/glob-watcher/README.md | 53 + .../node_modules/glob-watcher/index.js | 40 + .../node_modules/gaze/.editorconfig | 13 + .../glob-watcher/node_modules/gaze/.jshintrc | 13 + .../glob-watcher/node_modules/gaze/.npmignore | 1 + .../node_modules/gaze/.travis.yml | 6 + .../glob-watcher/node_modules/gaze/AUTHORS | 10 + .../node_modules/gaze/Gruntfile.js | 32 + .../node_modules/gaze/LICENSE-MIT | 22 + .../glob-watcher/node_modules/gaze/README.md | 177 + .../node_modules/gaze/benchmarks/gaze100s.js | 46 + .../node_modules/gaze/lib/gaze.js | 417 + .../node_modules/gaze/lib/helper.js | 67 + .../gaze/node_modules/globule/.jshintrc | 15 + .../gaze/node_modules/globule/.npmignore | 1 + .../gaze/node_modules/globule/.travis.yml | 6 + .../gaze/node_modules/globule/Gruntfile.js | 48 + .../gaze/node_modules/globule/LICENSE-MIT | 22 + .../gaze/node_modules/globule/README.md | 117 + .../gaze/node_modules/globule/lib/globule.js | 172 + .../globule/node_modules/glob/.npmignore | 2 + .../globule/node_modules/glob/.travis.yml | 3 + .../globule/node_modules/glob/LICENSE | 27 + .../globule/node_modules/glob/README.md | 233 + .../globule/node_modules/glob/examples/g.js | 9 + .../node_modules/glob/examples/usr-local.js | 9 + .../globule/node_modules/glob/glob.js | 643 + .../glob/node_modules/graceful-fs/.npmignore | 1 + .../glob/node_modules/graceful-fs/LICENSE | 27 + .../glob/node_modules/graceful-fs/README.md | 33 + .../node_modules/graceful-fs/graceful-fs.js | 442 + .../node_modules/graceful-fs/package.json | 49 + .../node_modules/graceful-fs/test/open.js | 46 + .../node_modules/graceful-fs/test/ulimit.js | 158 + .../glob/node_modules/inherits/README.md | 51 + .../glob/node_modules/inherits/inherits.js | 29 + .../glob/node_modules/inherits/package.json | 31 + .../globule/node_modules/glob/package.json | 40 + .../node_modules/glob/test/00-setup.js | 176 + .../node_modules/glob/test/bash-comparison.js | 63 + .../node_modules/glob/test/bash-results.json | 348 + .../node_modules/glob/test/cwd-test.js | 55 + .../globule/node_modules/glob/test/mark.js | 74 + .../node_modules/glob/test/nocase-nomagic.js | 113 + .../node_modules/glob/test/pause-resume.js | 73 + .../node_modules/glob/test/root-nomount.js | 39 + .../globule/node_modules/glob/test/root.js | 46 + .../node_modules/glob/test/zz-cleanup.js | 11 + .../globule/node_modules/lodash/README.md | 164 + .../node_modules/lodash/dist/lodash.compat.js | 5152 ++++ .../lodash/dist/lodash.compat.min.js | 42 + .../node_modules/lodash/dist/lodash.js | 4983 ++++ .../node_modules/lodash/dist/lodash.min.js | 40 + .../lodash/dist/lodash.underscore.js | 4307 +++ .../lodash/dist/lodash.underscore.min.js | 34 + .../globule/node_modules/lodash/package.json | 63 + .../globule/node_modules/minimatch/.npmignore | 1 + .../globule/node_modules/minimatch/LICENSE | 23 + .../globule/node_modules/minimatch/README.md | 218 + .../node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../node_modules/minimatch/package.json | 40 + .../node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../gaze/node_modules/globule/package.json | 60 + .../globule/test/fixtures/expand/README.md | 0 .../globule/test/fixtures/expand/css/baz.css | 0 .../globule/test/fixtures/expand/css/qux.css | 0 .../test/fixtures/expand/deep/deep.txt | 0 .../fixtures/expand/deep/deeper/deeper.txt | 0 .../expand/deep/deeper/deepest/deepest.txt | 0 .../globule/test/fixtures/expand/js/bar.js | 0 .../globule/test/fixtures/expand/js/foo.js | 0 .../node_modules/globule/test/globule_test.js | 486 + .../node_modules/gaze/package.json | 92 + .../node_modules/gaze/test/add_test.js | 69 + .../node_modules/gaze/test/api_test.js | 38 + .../node_modules/gaze/test/file_poller.js | 27 + .../gaze/test/fixtures/Project (LO)/one.js | 1 + .../gaze/test/fixtures/nested/one.js | 1 + .../gaze/test/fixtures/nested/sub/two.js | 1 + .../gaze/test/fixtures/nested/sub2/two.js | 1 + .../gaze/test/fixtures/nested/three.js | 1 + .../node_modules/gaze/test/fixtures/one.js | 1 + .../gaze/test/fixtures/sub/one.js | 1 + .../gaze/test/fixtures/sub/two.js | 1 + .../node_modules/gaze/test/helper.js | 21 + .../node_modules/gaze/test/matching_test.js | 95 + .../node_modules/gaze/test/patterns_test.js | 42 + .../node_modules/gaze/test/relative_test.js | 28 + .../node_modules/gaze/test/rename_test.js | 40 + .../node_modules/gaze/test/safewrite_test.js | 58 + .../node_modules/gaze/test/watch_race_test.js | 84 + .../node_modules/gaze/test/watch_test.js | 314 + .../node_modules/glob-watcher/package.json | 52 + .../glob-watcher/test/fixtures/test.coffee | 1 + .../node_modules/glob-watcher/test/main.js | 74 + .../node_modules/graceful-fs/.npmignore | 1 + .../vinyl-fs/node_modules/graceful-fs/LICENSE | 27 + .../node_modules/graceful-fs/README.md | 26 + .../node_modules/graceful-fs/graceful-fs.js | 159 + .../node_modules/graceful-fs/package.json | 49 + .../node_modules/graceful-fs/polyfills.js | 228 + .../node_modules/graceful-fs/test/open.js | 39 + .../node_modules/map-stream/.npmignore | 3 + .../node_modules/map-stream/.travis.yml | 4 + .../vinyl-fs/node_modules/map-stream/LICENCE | 22 + .../map-stream/examples/pretty.js | 26 + .../vinyl-fs/node_modules/map-stream/index.js | 145 + .../node_modules/map-stream/package.json | 38 + .../node_modules/map-stream/readme.markdown | 37 + .../map-stream/test/simple-map.asynct.js | 318 + .../vinyl-fs/node_modules/mkdirp/.npmignore | 2 + .../vinyl-fs/node_modules/mkdirp/.travis.yml | 5 + .../vinyl-fs/node_modules/mkdirp/LICENSE | 21 + .../node_modules/mkdirp/examples/pow.js | 6 + .../vinyl-fs/node_modules/mkdirp/index.js | 82 + .../vinyl-fs/node_modules/mkdirp/package.json | 34 + .../node_modules/mkdirp/readme.markdown | 63 + .../node_modules/mkdirp/test/chmod.js | 38 + .../node_modules/mkdirp/test/clobber.js | 37 + .../node_modules/mkdirp/test/mkdirp.js | 28 + .../vinyl-fs/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../vinyl-fs/node_modules/mkdirp/test/race.js | 41 + .../vinyl-fs/node_modules/mkdirp/test/rel.js | 32 + .../node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../vinyl-fs/node_modules/mkdirp/test/root.js | 18 + .../vinyl-fs/node_modules/mkdirp/test/sync.js | 32 + .../node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 32 + .../vinyl-fs/node_modules/vinyl/.npmignore | 6 + .../vinyl-fs/node_modules/vinyl/.travis.yml | 6 + .../vinyl-fs/node_modules/vinyl/LICENSE | 20 + .../vinyl-fs/node_modules/vinyl/README.md | 123 + .../vinyl-fs/node_modules/vinyl/index.js | 128 + .../node_modules/vinyl/lib/cloneBuffer.js | 7 + .../node_modules/vinyl/lib/inspectStream.js | 12 + .../node_modules/vinyl/lib/isBuffer.js | 7 + .../vinyl-fs/node_modules/vinyl/lib/isNull.js | 3 + .../node_modules/vinyl/lib/isStream.js | 5 + .../vinyl/node_modules/clone-stats/LICENSE.md | 21 + .../vinyl/node_modules/clone-stats/README.md | 17 + .../vinyl/node_modules/clone-stats/index.js | 13 + .../node_modules/clone-stats/package.json | 43 + .../vinyl/node_modules/clone-stats/test.js | 36 + .../vinyl-fs/node_modules/vinyl/package.json | 55 + .../vinyl-fs/node_modules/vinyl/test/File.js | 540 + .../node_modules/vinyl/test/cloneBuffer.js | 28 + .../node_modules/vinyl/test/inspectStream.js | 53 + .../node_modules/vinyl/test/isBuffer.js | 29 + .../node_modules/vinyl/test/isNull.js | 23 + .../node_modules/vinyl/test/isStream.js | 29 + .../gulp/node_modules/vinyl-fs/package.json | 59 + .../gulp/node_modules/vinyl-fs/test/dest.js | 261 + .../vinyl-fs/test/fixtures/test.coffee | 1 + .../vinyl-fs/test/fixtures/wow/suchempty | 1 + .../gulp/node_modules/vinyl-fs/test/src.js | 154 + node_modules/gulp/package.json | 74 + node_modules/gulp/test/dest.js | 132 + .../gulp/test/fixtures/copy/example.txt | 1 + node_modules/gulp/test/fixtures/stuff/run.dmc | 0 .../gulp/test/fixtures/stuff/test.dmc | 0 node_modules/gulp/test/fixtures/test.coffee | 1 + node_modules/gulp/test/fixtures/test/run.jade | 1 + node_modules/gulp/test/src.js | 174 + node_modules/gulp/test/taskTree.js | 43 + node_modules/gulp/test/tasks.js | 157 + node_modules/gulp/test/watch.js | 111 + node_modules/jade/.npmignore | 14 + node_modules/jade/LICENSE | 22 + node_modules/jade/README.md | 161 + node_modules/jade/Readme_zh-cn.md | 1285 + node_modules/jade/bin/jade.js | 179 + node_modules/jade/component.json | 16 + node_modules/jade/index.js | 4 + node_modules/jade/jade-language.md | 1023 + node_modules/jade/jade.js | 22894 ++++++++++++++++ node_modules/jade/jade.md | 510 + node_modules/jade/lib/compiler.js | 672 + node_modules/jade/lib/doctypes.js | 12 + node_modules/jade/lib/filters-client.js | 14 + node_modules/jade/lib/filters.js | 18 + node_modules/jade/lib/inline-tags.js | 23 + node_modules/jade/lib/jade.js | 323 + node_modules/jade/lib/lexer.js | 865 + node_modules/jade/lib/nodes/attrs.js | 79 + node_modules/jade/lib/nodes/block-comment.js | 24 + node_modules/jade/lib/nodes/block.js | 112 + node_modules/jade/lib/nodes/case.js | 33 + node_modules/jade/lib/nodes/code.js | 26 + node_modules/jade/lib/nodes/comment.js | 23 + node_modules/jade/lib/nodes/doctype.js | 20 + node_modules/jade/lib/nodes/each.js | 26 + node_modules/jade/lib/nodes/filter.js | 25 + node_modules/jade/lib/nodes/index.js | 16 + node_modules/jade/lib/nodes/literal.js | 20 + node_modules/jade/lib/nodes/mixin-block.js | 18 + node_modules/jade/lib/nodes/mixin.js | 27 + node_modules/jade/lib/nodes/node.js | 16 + node_modules/jade/lib/nodes/tag.js | 87 + node_modules/jade/lib/nodes/text.js | 27 + node_modules/jade/lib/parser.js | 790 + node_modules/jade/lib/runtime.js | 203 + node_modules/jade/lib/self-closing.js | 22 + node_modules/jade/lib/utils.js | 16 + .../node_modules/character-parser/.npmignore | 2 + .../node_modules/character-parser/LICENSE | 19 + .../node_modules/character-parser/README.md | 142 + .../node_modules/character-parser/index.js | 217 + .../character-parser/package.json | 43 + .../jade/node_modules/commander/Readme.md | 195 + .../jade/node_modules/commander/index.js | 851 + .../jade/node_modules/commander/package.json | 45 + .../constantinople/.gitattributes | 22 + .../node_modules/constantinople/.npmignore | 13 + .../node_modules/constantinople/.travis.yml | 4 + .../jade/node_modules/constantinople/LICENSE | 19 + .../node_modules/constantinople/README.md | 35 + .../jade/node_modules/constantinople/index.js | 35 + .../constantinople/node_modules/.bin/uglifyjs | 1 + .../node_modules/uglify-js/.npmignore | 2 + .../node_modules/uglify-js/.travis.yml | 6 + .../node_modules/uglify-js/LICENSE | 29 + .../node_modules/uglify-js/README.md | 636 + .../node_modules/uglify-js/bin/uglifyjs | 445 + .../node_modules/uglify-js/lib/ast.js | 984 + .../node_modules/uglify-js/lib/compress.js | 2358 ++ .../node_modules/uglify-js/lib/mozilla-ast.js | 267 + .../node_modules/uglify-js/lib/output.js | 1300 + .../node_modules/uglify-js/lib/parse.js | 1457 + .../node_modules/uglify-js/lib/scope.js | 563 + .../node_modules/uglify-js/lib/sourcemap.js | 84 + .../node_modules/uglify-js/lib/transform.js | 218 + .../node_modules/uglify-js/lib/utils.js | 302 + .../uglify-js/node_modules/async/LICENSE | 19 + .../uglify-js/node_modules/async/README.md | 1425 + .../node_modules/async/component.json | 11 + .../uglify-js/node_modules/async/lib/async.js | 958 + .../uglify-js/node_modules/async/package.json | 43 + .../node_modules/optimist/.travis.yml | 4 + .../uglify-js/node_modules/optimist/LICENSE | 21 + .../node_modules/optimist/example/bool.js | 10 + .../optimist/example/boolean_double.js | 7 + .../optimist/example/boolean_single.js | 7 + .../optimist/example/default_hash.js | 8 + .../optimist/example/default_singles.js | 7 + .../node_modules/optimist/example/divide.js | 8 + .../optimist/example/line_count.js | 20 + .../optimist/example/line_count_options.js | 29 + .../optimist/example/line_count_wrap.js | 29 + .../node_modules/optimist/example/nonopt.js | 4 + .../node_modules/optimist/example/reflect.js | 2 + .../node_modules/optimist/example/short.js | 3 + .../node_modules/optimist/example/string.js | 11 + .../optimist/example/usage-options.js | 19 + .../node_modules/optimist/example/xup.js | 10 + .../uglify-js/node_modules/optimist/index.js | 478 + .../optimist/node_modules/wordwrap/.npmignore | 1 + .../node_modules/wordwrap/README.markdown | 70 + .../node_modules/wordwrap/example/center.js | 10 + .../node_modules/wordwrap/example/meat.js | 3 + .../optimist/node_modules/wordwrap/index.js | 76 + .../node_modules/wordwrap/package.json | 45 + .../node_modules/wordwrap/test/break.js | 30 + .../node_modules/wordwrap/test/idleness.txt | 63 + .../node_modules/wordwrap/test/wrap.js | 31 + .../node_modules/optimist/package.json | 46 + .../node_modules/optimist/readme.markdown | 487 + .../uglify-js/node_modules/optimist/test/_.js | 71 + .../node_modules/optimist/test/_/argv.js | 2 + .../node_modules/optimist/test/_/bin.js | 3 + .../node_modules/optimist/test/parse.js | 446 + .../node_modules/optimist/test/usage.js | 292 + .../node_modules/source-map/.npmignore | 2 + .../node_modules/source-map/.travis.yml | 4 + .../node_modules/source-map/CHANGELOG.md | 112 + .../uglify-js/node_modules/source-map/LICENSE | 28 + .../source-map/Makefile.dryice.js | 166 + .../node_modules/source-map/README.md | 434 + .../source-map/build/assert-shim.js | 56 + .../source-map/build/mini-require.js | 152 + .../source-map/build/prefix-source-map.jsm | 20 + .../source-map/build/prefix-utils.jsm | 18 + .../source-map/build/suffix-browser.js | 8 + .../source-map/build/suffix-source-map.jsm | 6 + .../source-map/build/suffix-utils.jsm | 21 + .../source-map/build/test-prefix.js | 8 + .../source-map/build/test-suffix.js | 3 + .../node_modules/source-map/lib/source-map.js | 8 + .../source-map/lib/source-map/array-set.js | 97 + .../source-map/lib/source-map/base64-vlq.js | 144 + .../source-map/lib/source-map/base64.js | 42 + .../lib/source-map/binary-search.js | 81 + .../lib/source-map/source-map-consumer.js | 477 + .../lib/source-map/source-map-generator.js | 380 + .../source-map/lib/source-map/source-node.js | 371 + .../source-map/lib/source-map/util.js | 205 + .../source-map/node_modules/amdefine/LICENSE | 58 + .../node_modules/amdefine/README.md | 171 + .../node_modules/amdefine/amdefine.js | 299 + .../node_modules/amdefine/intercept.js | 36 + .../node_modules/amdefine/package.json | 37 + .../node_modules/source-map/package.json | 110 + .../node_modules/source-map/test/run-tests.js | 71 + .../source-map/test/source-map/test-api.js | 26 + .../test/source-map/test-array-set.js | 104 + .../test/source-map/test-base64-vlq.js | 24 + .../source-map/test/source-map/test-base64.js | 35 + .../test/source-map/test-binary-search.js | 54 + .../test/source-map/test-dog-fooding.js | 72 + .../source-map/test-source-map-consumer.js | 451 + .../source-map/test-source-map-generator.js | 417 + .../test/source-map/test-source-node.js | 365 + .../source-map/test/source-map/util.js | 161 + .../uglify-to-browserify/.npmignore | 14 + .../uglify-to-browserify/.travis.yml | 3 + .../node_modules/uglify-to-browserify/LICENSE | 19 + .../uglify-to-browserify/README.md | 15 + .../uglify-to-browserify/index.js | 49 + .../uglify-to-browserify/package.json | 34 + .../uglify-to-browserify/test/index.js | 22 + .../node_modules/uglify-js/package.json | 45 + .../uglify-js/test/compress/arrays.js | 74 + .../uglify-js/test/compress/blocks.js | 49 + .../uglify-js/test/compress/concat-strings.js | 22 + .../uglify-js/test/compress/conditionals.js | 207 + .../uglify-js/test/compress/dead-code.js | 89 + .../uglify-js/test/compress/debugger.js | 24 + .../uglify-js/test/compress/drop-unused.js | 165 + .../uglify-js/test/compress/issue-105.js | 25 + .../uglify-js/test/compress/issue-12.js | 11 + .../uglify-js/test/compress/issue-126.js | 24 + .../uglify-js/test/compress/issue-143.js | 48 + .../uglify-js/test/compress/issue-22.js | 17 + .../uglify-js/test/compress/issue-267.js | 11 + .../uglify-js/test/compress/issue-269.js | 66 + .../uglify-js/test/compress/issue-44.js | 31 + .../uglify-js/test/compress/issue-59.js | 30 + .../uglify-js/test/compress/labels.js | 163 + .../uglify-js/test/compress/loops.js | 123 + .../uglify-js/test/compress/negate-iife.js | 76 + .../uglify-js/test/compress/properties.js | 54 + .../uglify-js/test/compress/sequences.js | 163 + .../uglify-js/test/compress/switch.js | 260 + .../uglify-js/test/compress/typeof.js | 25 + .../node_modules/uglify-js/test/run-tests.js | 179 + .../node_modules/uglify-js/tools/node.js | 172 + .../node_modules/constantinople/package.json | 31 + .../node_modules/constantinople/test/index.js | 51 + .../jade/node_modules/mkdirp/.npmignore | 2 + .../jade/node_modules/mkdirp/.travis.yml | 5 + node_modules/jade/node_modules/mkdirp/LICENSE | 21 + .../jade/node_modules/mkdirp/examples/pow.js | 6 + .../jade/node_modules/mkdirp/index.js | 82 + .../jade/node_modules/mkdirp/package.json | 34 + .../jade/node_modules/mkdirp/readme.markdown | 63 + .../jade/node_modules/mkdirp/test/chmod.js | 38 + .../jade/node_modules/mkdirp/test/clobber.js | 37 + .../jade/node_modules/mkdirp/test/mkdirp.js | 28 + .../jade/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../jade/node_modules/mkdirp/test/race.js | 41 + .../jade/node_modules/mkdirp/test/rel.js | 32 + .../jade/node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../jade/node_modules/mkdirp/test/root.js | 18 + .../jade/node_modules/mkdirp/test/sync.js | 32 + .../jade/node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 32 + .../jade/node_modules/monocle/.npmignore | 3 + .../jade/node_modules/monocle/LICENSE | 23 + .../jade/node_modules/monocle/README.md | 84 + .../jade/node_modules/monocle/monocle.js | 187 + .../monocle/node_modules/readdirp/.npmignore | 15 + .../monocle/node_modules/readdirp/.travis.yml | 5 + .../monocle/node_modules/readdirp/LICENSE | 18 + .../monocle/node_modules/readdirp/README.md | 227 + .../node_modules/readdirp/examples/Readme.md | 37 + .../readdirp/examples/callback-api.js | 10 + .../node_modules/readdirp/examples/grep.js | 73 + .../node_modules/event-stream/.npmignore | 3 + .../node_modules/event-stream/.travis.yml | 4 + .../node_modules/event-stream/LICENCE | 22 + .../event-stream/examples/pretty.js | 25 + .../node_modules/event-stream/index.js | 341 + .../node_modules/duplexer/.npmignore | 3 + .../node_modules/duplexer/.travis.yml | 3 + .../node_modules/duplexer/LICENCE | 19 + .../node_modules/duplexer/Makefile | 4 + .../node_modules/duplexer/README.md | 36 + .../node_modules/duplexer/index.js | 87 + .../node_modules/duplexer/package.json | 41 + .../node_modules/duplexer/test.js | 27 + .../node_modules/from/LICENSE.APACHE2 | 15 + .../node_modules/from/LICENSE.MIT | 24 + .../event-stream/node_modules/from/index.js | 62 + .../node_modules/from/package.json | 33 + .../node_modules/from/readme.markdown | 6 + .../node_modules/from/test/index.js | 141 + .../node_modules/map-stream/.npmignore | 3 + .../node_modules/map-stream/.travis.yml | 4 + .../node_modules/map-stream/LICENCE | 22 + .../map-stream/examples/pretty.js | 25 + .../node_modules/map-stream/index.js | 105 + .../node_modules/map-stream/package.json | 30 + .../node_modules/map-stream/readme.markdown | 35 + .../map-stream/test/simple-map.asynct.js | 295 + .../node_modules/optimist/.npmignore | 4 + .../node_modules/optimist/LICENSE | 21 + .../node_modules/optimist/README.markdown | 474 + .../node_modules/optimist/examples/bool.js | 10 + .../optimist/examples/boolean_double.js | 7 + .../optimist/examples/boolean_single.js | 7 + .../optimist/examples/default_hash.js | 8 + .../optimist/examples/default_singles.js | 7 + .../node_modules/optimist/examples/divide.js | 8 + .../optimist/examples/line_count.js | 20 + .../optimist/examples/line_count_options.js | 29 + .../optimist/examples/line_count_wrap.js | 29 + .../node_modules/optimist/examples/nonopt.js | 4 + .../node_modules/optimist/examples/reflect.js | 2 + .../node_modules/optimist/examples/short.js | 3 + .../node_modules/optimist/examples/string.js | 11 + .../optimist/examples/usage-options.js | 19 + .../node_modules/optimist/examples/xup.js | 10 + .../node_modules/optimist/index.js | 457 + .../optimist/node_modules/wordwrap/.npmignore | 1 + .../node_modules/wordwrap/README.markdown | 70 + .../node_modules/wordwrap/example/center.js | 10 + .../node_modules/wordwrap/example/meat.js | 3 + .../optimist/node_modules/wordwrap/index.js | 76 + .../node_modules/wordwrap/package.json | 40 + .../node_modules/wordwrap/test/break.js | 30 + .../node_modules/wordwrap/test/idleness.txt | 63 + .../node_modules/wordwrap/test/wrap.js | 31 + .../node_modules/optimist/package.json | 46 + .../node_modules/optimist/test/_.js | 66 + .../node_modules/optimist/test/_/argv.js | 2 + .../node_modules/optimist/test/_/bin.js | 3 + .../node_modules/optimist/test/parse.js | 304 + .../node_modules/optimist/test/usage.js | 256 + .../node_modules/pause-stream/.npmignore | 3 + .../node_modules/pause-stream/index.js | 76 + .../node_modules/pause-stream/package.json | 38 + .../node_modules/pause-stream/readme.markdown | 24 + .../node_modules/pause-stream/test/index.js | 17 + .../pause-stream/test/pause-end.js | 33 + .../node_modules/split/.npmignore | 3 + .../node_modules/split/.travis.yml | 4 + .../event-stream/node_modules/split/LICENCE | 22 + .../node_modules/split/examples/pretty.js | 25 + .../event-stream/node_modules/split/index.js | 35 + .../split/node_modules/through/.travis.yml | 4 + .../node_modules/through/LICENSE.APACHE2 | 15 + .../split/node_modules/through/LICENSE.MIT | 24 + .../split/node_modules/through/index.js | 65 + .../split/node_modules/through/package.json | 29 + .../node_modules/through/readme.markdown | 26 + .../split/node_modules/through/test/index.js | 113 + .../node_modules/split/package.json | 35 + .../node_modules/split/readme.markdown | 20 + .../node_modules/split/test/split.asynct.js | 47 + .../node_modules/through/.travis.yml | 4 + .../node_modules/through/LICENSE.APACHE2 | 15 + .../node_modules/through/LICENSE.MIT | 24 + .../node_modules/through/index.js | 100 + .../node_modules/through/package.json | 34 + .../node_modules/through/readme.markdown | 44 + .../node_modules/through/test/buffering.js | 37 + .../node_modules/through/test/end.js | 27 + .../node_modules/through/test/index.js | 113 + .../node_modules/event-stream/package.json | 40 + .../node_modules/event-stream/readme.markdown | 286 + .../event-stream/test/connect.asynct.js | 82 + .../event-stream/test/merge.asynct.js | 20 + .../event-stream/test/pause.asynct.js | 38 + .../event-stream/test/pipeline.asynct.js | 51 + .../event-stream/test/readArray.asynct.js | 88 + .../event-stream/test/readable.asynct.js | 167 + .../event-stream/test/replace.asynct.js | 50 + .../event-stream/test/simple-map.asynct.js | 342 + .../event-stream/test/spec.asynct.js | 85 + .../event-stream/test/split.asynct.js | 46 + .../event-stream/test/stringify.js | 14 + .../event-stream/test/writeArray.asynct.js | 30 + .../node_modules/tap-stream/.npmignore | 1 + .../node_modules/tap-stream/.travis.yml | 5 + .../node_modules/tap-stream/README.md | 98 + .../tap-stream/examples/tap-nested-objects.js | 38 + .../examples/node_modules/tap-stream/index.js | 56 + .../node_modules/through/.travis.yml | 4 + .../node_modules/through/LICENSE.APACHE2 | 15 + .../node_modules/through/LICENSE.MIT | 24 + .../tap-stream/node_modules/through/index.js | 100 + .../node_modules/through/package.json | 34 + .../node_modules/through/readme.markdown | 44 + .../node_modules/through/test/buffering.js | 37 + .../node_modules/through/test/end.js | 27 + .../node_modules/through/test/index.js | 113 + .../node_modules/tap-stream/package.json | 38 + .../tap-stream/test/tap-stream.js | 104 + .../readdirp/examples/package.json | 9 + .../readdirp/examples/stream-api-pipe.js | 13 + .../readdirp/examples/stream-api.js | 15 + .../node_modules/minimatch/.npmignore | 1 + .../readdirp/node_modules/minimatch/LICENSE | 23 + .../readdirp/node_modules/minimatch/README.md | 218 + .../node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../node_modules/minimatch/package.json | 40 + .../node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../node_modules/readdirp/package.json | 49 + .../monocle/node_modules/readdirp/readdirp.js | 276 + .../node_modules/readdirp/stream-api.js | 86 + .../test/bed/root_dir1/root_dir1_file1.ext1 | 0 .../test/bed/root_dir1/root_dir1_file2.ext2 | 0 .../test/bed/root_dir1/root_dir1_file3.ext3 | 0 .../root1_dir1_subdir1_file1.ext1 | 0 .../test/bed/root_dir2/root_dir2_file1.ext1 | 0 .../test/bed/root_dir2/root_dir2_file2.ext2 | 0 .../readdirp/test/bed/root_file1.ext1 | 0 .../readdirp/test/bed/root_file2.ext2 | 0 .../readdirp/test/bed/root_file3.ext3 | 0 .../readdirp/test/readdirp-stream.js | 215 + .../node_modules/readdirp/test/readdirp.js | 252 + .../jade/node_modules/monocle/package.json | 44 + .../jade/node_modules/transformers/.npmignore | 2 + .../jade/node_modules/transformers/README.md | 141 + .../jade/node_modules/transformers/history.md | 77 + .../node_modules/transformers/lib/shared.js | 162 + .../transformers/lib/transformers.js | 604 + .../transformers/node_modules/.bin/uglifyjs | 1 + .../transformers/node_modules/css/.npmignore | 4 + .../transformers/node_modules/css/History.md | 20 + .../transformers/node_modules/css/Makefile | 8 + .../transformers/node_modules/css/Readme.md | 77 + .../node_modules/css/benchmark.js | 36 + .../node_modules/css/component.json | 13 + .../transformers/node_modules/css/index.js | 3 + .../css/node_modules/css-parse/.npmignore | 6 + .../css/node_modules/css-parse/History.md | 30 + .../css/node_modules/css-parse/Makefile | 7 + .../css/node_modules/css-parse/Readme.md | 62 + .../css/node_modules/css-parse/component.json | 8 + .../css/node_modules/css-parse/index.js | 265 + .../css/node_modules/css-parse/package.json | 27 + .../css/node_modules/css-stringify/.npmignore | 6 + .../css/node_modules/css-stringify/History.md | 30 + .../css/node_modules/css-stringify/Makefile | 7 + .../css/node_modules/css-stringify/Readme.md | 33 + .../node_modules/css-stringify/component.json | 8 + .../css/node_modules/css-stringify/index.js | 182 + .../node_modules/css-stringify/package.json | 28 + .../node_modules/css/package.json | 23 + .../transformers/node_modules/css/test.js | 6 + .../node_modules/promise/.npmignore | 6 + .../node_modules/promise/Readme.md | 85 + .../node_modules/promise/index.js | 164 + .../node_modules/is-promise/.npmignore | 6 + .../promise/node_modules/is-promise/index.js | 5 + .../node_modules/is-promise/package.json | 29 + .../promise/node_modules/is-promise/readme.md | 29 + .../node_modules/promise/package.json | 33 + .../node_modules/uglify-js/.npmignore | 2 + .../node_modules/uglify-js/README.md | 544 + .../node_modules/uglify-js/bin/uglifyjs | 370 + .../node_modules/uglify-js/lib/ast.js | 964 + .../node_modules/uglify-js/lib/compress.js | 1968 ++ .../node_modules/uglify-js/lib/mozilla-ast.js | 265 + .../node_modules/uglify-js/lib/output.js | 1220 + .../node_modules/uglify-js/lib/parse.js | 1407 + .../node_modules/uglify-js/lib/scope.js | 580 + .../node_modules/uglify-js/lib/sourcemap.js | 81 + .../node_modules/uglify-js/lib/transform.js | 218 + .../node_modules/uglify-js/lib/utils.js | 288 + .../node_modules/optimist/.travis.yml | 4 + .../uglify-js/node_modules/optimist/LICENSE | 21 + .../node_modules/optimist/example/bool.js | 10 + .../optimist/example/boolean_double.js | 7 + .../optimist/example/boolean_single.js | 7 + .../optimist/example/default_hash.js | 8 + .../optimist/example/default_singles.js | 7 + .../node_modules/optimist/example/divide.js | 8 + .../optimist/example/line_count.js | 20 + .../optimist/example/line_count_options.js | 29 + .../optimist/example/line_count_wrap.js | 29 + .../node_modules/optimist/example/nonopt.js | 4 + .../node_modules/optimist/example/reflect.js | 2 + .../node_modules/optimist/example/short.js | 3 + .../node_modules/optimist/example/string.js | 11 + .../optimist/example/usage-options.js | 19 + .../node_modules/optimist/example/xup.js | 10 + .../uglify-js/node_modules/optimist/index.js | 478 + .../optimist/node_modules/wordwrap/.npmignore | 1 + .../node_modules/wordwrap/README.markdown | 70 + .../node_modules/wordwrap/example/center.js | 10 + .../node_modules/wordwrap/example/meat.js | 3 + .../optimist/node_modules/wordwrap/index.js | 76 + .../node_modules/wordwrap/package.json | 45 + .../node_modules/wordwrap/test/break.js | 30 + .../node_modules/wordwrap/test/idleness.txt | 63 + .../node_modules/wordwrap/test/wrap.js | 31 + .../node_modules/optimist/package.json | 46 + .../node_modules/optimist/readme.markdown | 487 + .../uglify-js/node_modules/optimist/test/_.js | 71 + .../node_modules/optimist/test/_/argv.js | 2 + .../node_modules/optimist/test/_/bin.js | 3 + .../node_modules/optimist/test/parse.js | 446 + .../node_modules/optimist/test/usage.js | 292 + .../node_modules/source-map/.npmignore | 2 + .../node_modules/source-map/.travis.yml | 4 + .../node_modules/source-map/CHANGELOG.md | 112 + .../uglify-js/node_modules/source-map/LICENSE | 28 + .../source-map/Makefile.dryice.js | 166 + .../node_modules/source-map/README.md | 434 + .../source-map/build/assert-shim.js | 56 + .../source-map/build/mini-require.js | 152 + .../source-map/build/prefix-source-map.jsm | 20 + .../source-map/build/prefix-utils.jsm | 18 + .../source-map/build/suffix-browser.js | 8 + .../source-map/build/suffix-source-map.jsm | 6 + .../source-map/build/suffix-utils.jsm | 21 + .../source-map/build/test-prefix.js | 8 + .../source-map/build/test-suffix.js | 3 + .../node_modules/source-map/lib/source-map.js | 8 + .../source-map/lib/source-map/array-set.js | 97 + .../source-map/lib/source-map/base64-vlq.js | 144 + .../source-map/lib/source-map/base64.js | 42 + .../lib/source-map/binary-search.js | 81 + .../lib/source-map/source-map-consumer.js | 477 + .../lib/source-map/source-map-generator.js | 380 + .../source-map/lib/source-map/source-node.js | 371 + .../source-map/lib/source-map/util.js | 205 + .../source-map/node_modules/amdefine/LICENSE | 58 + .../node_modules/amdefine/README.md | 171 + .../node_modules/amdefine/amdefine.js | 299 + .../node_modules/amdefine/intercept.js | 36 + .../node_modules/amdefine/package.json | 36 + .../node_modules/source-map/package.json | 110 + .../node_modules/source-map/test/run-tests.js | 71 + .../source-map/test/source-map/test-api.js | 26 + .../test/source-map/test-array-set.js | 104 + .../test/source-map/test-base64-vlq.js | 24 + .../source-map/test/source-map/test-base64.js | 35 + .../test/source-map/test-binary-search.js | 54 + .../test/source-map/test-dog-fooding.js | 72 + .../source-map/test-source-map-consumer.js | 451 + .../source-map/test-source-map-generator.js | 417 + .../test/source-map/test-source-node.js | 365 + .../source-map/test/source-map/util.js | 161 + .../node_modules/uglify-js/package.json | 44 + .../uglify-js/test/compress/arrays.js | 12 + .../uglify-js/test/compress/blocks.js | 49 + .../uglify-js/test/compress/conditionals.js | 143 + .../uglify-js/test/compress/dead-code.js | 89 + .../uglify-js/test/compress/debugger.js | 24 + .../uglify-js/test/compress/drop-unused.js | 97 + .../uglify-js/test/compress/issue-105.js | 17 + .../uglify-js/test/compress/issue-12.js | 11 + .../uglify-js/test/compress/issue-22.js | 17 + .../uglify-js/test/compress/issue-44.js | 31 + .../uglify-js/test/compress/issue-59.js | 30 + .../uglify-js/test/compress/labels.js | 163 + .../uglify-js/test/compress/loops.js | 123 + .../uglify-js/test/compress/properties.js | 25 + .../uglify-js/test/compress/sequences.js | 161 + .../uglify-js/test/compress/switch.js | 210 + .../node_modules/uglify-js/test/run-tests.js | 170 + .../node_modules/uglify-js/tools/node.js | 164 + .../node_modules/transformers/package.json | 81 + .../jade/node_modules/with/.npmignore | 2 + node_modules/jade/node_modules/with/LICENSE | 19 + node_modules/jade/node_modules/with/README.md | 61 + node_modules/jade/node_modules/with/index.js | 46 + .../with/node_modules/.bin/uglifyjs | 1 + .../with/node_modules/uglify-js/.npmignore | 2 + .../with/node_modules/uglify-js/.travis.yml | 7 + .../with/node_modules/uglify-js/LICENSE | 29 + .../with/node_modules/uglify-js/README.md | 593 + .../with/node_modules/uglify-js/bin/uglifyjs | 421 + .../with/node_modules/uglify-js/lib/ast.js | 988 + .../node_modules/uglify-js/lib/compress.js | 2068 ++ .../node_modules/uglify-js/lib/mozilla-ast.js | 267 + .../with/node_modules/uglify-js/lib/output.js | 1229 + .../with/node_modules/uglify-js/lib/parse.js | 1410 + .../with/node_modules/uglify-js/lib/scope.js | 581 + .../node_modules/uglify-js/lib/sourcemap.js | 81 + .../node_modules/uglify-js/lib/transform.js | 218 + .../with/node_modules/uglify-js/lib/utils.js | 295 + .../uglify-js/node_modules/async/LICENSE | 19 + .../uglify-js/node_modules/async/README.md | 1425 + .../node_modules/async/component.json | 11 + .../uglify-js/node_modules/async/lib/async.js | 958 + .../uglify-js/node_modules/async/package.json | 43 + .../node_modules/optimist/.travis.yml | 4 + .../uglify-js/node_modules/optimist/LICENSE | 21 + .../node_modules/optimist/example/bool.js | 10 + .../optimist/example/boolean_double.js | 7 + .../optimist/example/boolean_single.js | 7 + .../optimist/example/default_hash.js | 8 + .../optimist/example/default_singles.js | 7 + .../node_modules/optimist/example/divide.js | 8 + .../optimist/example/line_count.js | 20 + .../optimist/example/line_count_options.js | 29 + .../optimist/example/line_count_wrap.js | 29 + .../node_modules/optimist/example/nonopt.js | 4 + .../node_modules/optimist/example/reflect.js | 2 + .../node_modules/optimist/example/short.js | 3 + .../node_modules/optimist/example/string.js | 11 + .../optimist/example/usage-options.js | 19 + .../node_modules/optimist/example/xup.js | 10 + .../uglify-js/node_modules/optimist/index.js | 478 + .../optimist/node_modules/wordwrap/.npmignore | 1 + .../node_modules/wordwrap/README.markdown | 70 + .../node_modules/wordwrap/example/center.js | 10 + .../node_modules/wordwrap/example/meat.js | 3 + .../optimist/node_modules/wordwrap/index.js | 76 + .../node_modules/wordwrap/package.json | 45 + .../node_modules/wordwrap/test/break.js | 30 + .../node_modules/wordwrap/test/idleness.txt | 63 + .../node_modules/wordwrap/test/wrap.js | 31 + .../node_modules/optimist/package.json | 46 + .../node_modules/optimist/readme.markdown | 487 + .../uglify-js/node_modules/optimist/test/_.js | 71 + .../node_modules/optimist/test/_/argv.js | 2 + .../node_modules/optimist/test/_/bin.js | 3 + .../node_modules/optimist/test/parse.js | 446 + .../node_modules/optimist/test/usage.js | 292 + .../node_modules/source-map/.npmignore | 2 + .../node_modules/source-map/.travis.yml | 4 + .../node_modules/source-map/CHANGELOG.md | 112 + .../uglify-js/node_modules/source-map/LICENSE | 28 + .../source-map/Makefile.dryice.js | 166 + .../node_modules/source-map/README.md | 434 + .../source-map/build/assert-shim.js | 56 + .../source-map/build/mini-require.js | 152 + .../source-map/build/prefix-source-map.jsm | 20 + .../source-map/build/prefix-utils.jsm | 18 + .../source-map/build/suffix-browser.js | 8 + .../source-map/build/suffix-source-map.jsm | 6 + .../source-map/build/suffix-utils.jsm | 21 + .../source-map/build/test-prefix.js | 8 + .../source-map/build/test-suffix.js | 3 + .../node_modules/source-map/lib/source-map.js | 8 + .../source-map/lib/source-map/array-set.js | 97 + .../source-map/lib/source-map/base64-vlq.js | 144 + .../source-map/lib/source-map/base64.js | 42 + .../lib/source-map/binary-search.js | 81 + .../lib/source-map/source-map-consumer.js | 477 + .../lib/source-map/source-map-generator.js | 380 + .../source-map/lib/source-map/source-node.js | 371 + .../source-map/lib/source-map/util.js | 205 + .../source-map/node_modules/amdefine/LICENSE | 58 + .../node_modules/amdefine/README.md | 171 + .../node_modules/amdefine/amdefine.js | 299 + .../node_modules/amdefine/intercept.js | 36 + .../node_modules/amdefine/package.json | 37 + .../node_modules/source-map/package.json | 110 + .../node_modules/source-map/test/run-tests.js | 71 + .../source-map/test/source-map/test-api.js | 26 + .../test/source-map/test-array-set.js | 104 + .../test/source-map/test-base64-vlq.js | 24 + .../source-map/test/source-map/test-base64.js | 35 + .../test/source-map/test-binary-search.js | 54 + .../test/source-map/test-dog-fooding.js | 72 + .../source-map/test-source-map-consumer.js | 451 + .../source-map/test-source-map-generator.js | 417 + .../test/source-map/test-source-node.js | 365 + .../source-map/test/source-map/util.js | 161 + .../uglify-to-browserify/.npmignore | 14 + .../uglify-to-browserify/.travis.yml | 3 + .../node_modules/uglify-to-browserify/LICENSE | 19 + .../uglify-to-browserify/README.md | 15 + .../uglify-to-browserify/index.js | 49 + .../uglify-to-browserify/package.json | 34 + .../uglify-to-browserify/test/index.js | 22 + .../with/node_modules/uglify-js/package.json | 49 + .../uglify-js/test/compress/arrays.js | 14 + .../uglify-js/test/compress/blocks.js | 49 + .../uglify-js/test/compress/conditionals.js | 143 + .../uglify-js/test/compress/dead-code.js | 89 + .../uglify-js/test/compress/debugger.js | 24 + .../uglify-js/test/compress/drop-unused.js | 121 + .../uglify-js/test/compress/issue-105.js | 25 + .../uglify-js/test/compress/issue-12.js | 11 + .../uglify-js/test/compress/issue-143.js | 48 + .../uglify-js/test/compress/issue-22.js | 17 + .../uglify-js/test/compress/issue-44.js | 31 + .../uglify-js/test/compress/issue-59.js | 30 + .../uglify-js/test/compress/labels.js | 163 + .../uglify-js/test/compress/loops.js | 123 + .../uglify-js/test/compress/negate-iife.js | 76 + .../uglify-js/test/compress/properties.js | 54 + .../uglify-js/test/compress/sequences.js | 161 + .../uglify-js/test/compress/switch.js | 260 + .../uglify-js/test/compress/typeof.js | 25 + .../node_modules/uglify-js/test/run-tests.js | 170 + .../with/node_modules/uglify-js/tools/node.js | 167 + .../jade/node_modules/with/package.json | 35 + node_modules/jade/node_modules/with/vars.js | 587 + node_modules/jade/package.json | 68 + node_modules/jade/runtime.js | 210 + node_modules/mocha/Readme.md | 172 + node_modules/mocha/bin/_mocha | 467 + node_modules/mocha/bin/mocha | 51 + node_modules/mocha/images/error.png | Bin 0 -> 412 bytes node_modules/mocha/images/ok.png | Bin 0 -> 388 bytes node_modules/mocha/index.js | 4 + node_modules/mocha/lib/browser/debug.js | 5 + node_modules/mocha/lib/browser/diff.js | 354 + node_modules/mocha/lib/browser/events.js | 178 + node_modules/mocha/lib/browser/fs.js | 0 node_modules/mocha/lib/browser/path.js | 0 node_modules/mocha/lib/browser/progress.js | 125 + node_modules/mocha/lib/browser/tty.js | 13 + node_modules/mocha/lib/context.js | 69 + node_modules/mocha/lib/hook.js | 49 + node_modules/mocha/lib/interfaces/bdd.js | 137 + node_modules/mocha/lib/interfaces/exports.js | 60 + node_modules/mocha/lib/interfaces/index.js | 5 + node_modules/mocha/lib/interfaces/qunit.js | 122 + node_modules/mocha/lib/interfaces/tdd.js | 138 + node_modules/mocha/lib/mocha.js | 369 + node_modules/mocha/lib/ms.js | 109 + node_modules/mocha/lib/reporters/base.js | 507 + node_modules/mocha/lib/reporters/doc.js | 56 + node_modules/mocha/lib/reporters/dot.js | 62 + node_modules/mocha/lib/reporters/html-cov.js | 51 + node_modules/mocha/lib/reporters/html.js | 274 + node_modules/mocha/lib/reporters/index.js | 18 + node_modules/mocha/lib/reporters/json-cov.js | 153 + .../mocha/lib/reporters/json-stream.js | 61 + node_modules/mocha/lib/reporters/json.js | 70 + node_modules/mocha/lib/reporters/landing.js | 97 + node_modules/mocha/lib/reporters/list.js | 64 + node_modules/mocha/lib/reporters/markdown.js | 91 + node_modules/mocha/lib/reporters/min.js | 38 + node_modules/mocha/lib/reporters/nyan.js | 260 + node_modules/mocha/lib/reporters/progress.js | 86 + node_modules/mocha/lib/reporters/spec.js | 83 + node_modules/mocha/lib/reporters/tap.js | 73 + .../lib/reporters/templates/coverage.jade | 50 + .../mocha/lib/reporters/templates/menu.jade | 13 + .../mocha/lib/reporters/templates/script.html | 34 + .../mocha/lib/reporters/templates/style.html | 320 + node_modules/mocha/lib/reporters/xunit.js | 119 + node_modules/mocha/lib/runnable.js | 227 + node_modules/mocha/lib/runner.js | 661 + node_modules/mocha/lib/suite.js | 296 + node_modules/mocha/lib/template.html | 18 + node_modules/mocha/lib/test.js | 32 + node_modules/mocha/lib/utils.js | 299 + node_modules/mocha/mocha.css | 270 + node_modules/mocha/mocha.js | 5812 ++++ node_modules/mocha/node_modules/.bin/jade | 1 + .../mocha/node_modules/commander/History.md | 179 + .../mocha/node_modules/commander/Readme.md | 195 + .../mocha/node_modules/commander/index.js | 847 + .../mocha/node_modules/commander/package.json | 38 + .../mocha/node_modules/debug/Readme.md | 115 + .../mocha/node_modules/debug/debug.js | 137 + .../mocha/node_modules/debug/index.js | 5 + .../mocha/node_modules/debug/lib/debug.js | 147 + .../mocha/node_modules/debug/package.json | 46 + .../mocha/node_modules/diff/README.md | 101 + node_modules/mocha/node_modules/diff/diff.js | 354 + .../mocha/node_modules/diff/package.json | 51 + .../mocha/node_modules/glob/.npmignore | 2 + .../mocha/node_modules/glob/.travis.yml | 3 + node_modules/mocha/node_modules/glob/LICENSE | 27 + .../mocha/node_modules/glob/README.md | 250 + .../mocha/node_modules/glob/examples/g.js | 9 + .../node_modules/glob/examples/usr-local.js | 9 + node_modules/mocha/node_modules/glob/glob.js | 675 + .../glob/node_modules/graceful-fs/.npmignore | 1 + .../glob/node_modules/graceful-fs/LICENSE | 27 + .../glob/node_modules/graceful-fs/README.md | 26 + .../node_modules/graceful-fs/graceful-fs.js | 159 + .../node_modules/graceful-fs/package.json | 49 + .../node_modules/graceful-fs/polyfills.js | 228 + .../node_modules/graceful-fs/test/open.js | 39 + .../glob/node_modules/inherits/LICENSE | 16 + .../glob/node_modules/inherits/README.md | 42 + .../glob/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../glob/node_modules/inherits/package.json | 33 + .../glob/node_modules/inherits/test.js | 25 + .../glob/node_modules/minimatch/.npmignore | 1 + .../glob/node_modules/minimatch/LICENSE | 23 + .../glob/node_modules/minimatch/README.md | 218 + .../glob/node_modules/minimatch/minimatch.js | 1055 + .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 33 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 42 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../glob/node_modules/minimatch/package.json | 40 + .../glob/node_modules/minimatch/test/basic.js | 399 + .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../mocha/node_modules/glob/package.json | 40 + .../mocha/node_modules/glob/test/00-setup.js | 176 + .../node_modules/glob/test/bash-comparison.js | 63 + .../node_modules/glob/test/bash-results.json | 350 + .../mocha/node_modules/glob/test/cwd-test.js | 55 + .../node_modules/glob/test/globstar-match.js | 19 + .../mocha/node_modules/glob/test/mark.js | 74 + .../node_modules/glob/test/nocase-nomagic.js | 113 + .../node_modules/glob/test/pause-resume.js | 73 + .../node_modules/glob/test/root-nomount.js | 39 + .../mocha/node_modules/glob/test/root.js | 46 + .../mocha/node_modules/glob/test/stat.js | 32 + .../node_modules/glob/test/zz-cleanup.js | 11 + .../mocha/node_modules/growl/History.md | 63 + .../mocha/node_modules/growl/Readme.md | 99 + .../mocha/node_modules/growl/lib/growl.js | 234 + .../mocha/node_modules/growl/package.json | 14 + node_modules/mocha/node_modules/growl/test.js | 20 + .../mocha/node_modules/jade/.npmignore | 15 + node_modules/mocha/node_modules/jade/LICENSE | 22 + node_modules/mocha/node_modules/jade/bin/jade | 147 + node_modules/mocha/node_modules/jade/index.js | 4 + node_modules/mocha/node_modules/jade/jade.js | 3586 +++ node_modules/mocha/node_modules/jade/jade.md | 510 + .../mocha/node_modules/jade/jade.min.js | 2 + .../mocha/node_modules/jade/lib/compiler.js | 642 + .../mocha/node_modules/jade/lib/doctypes.js | 18 + .../mocha/node_modules/jade/lib/filters.js | 97 + .../node_modules/jade/lib/inline-tags.js | 28 + .../mocha/node_modules/jade/lib/jade.js | 237 + .../mocha/node_modules/jade/lib/lexer.js | 771 + .../node_modules/jade/lib/nodes/attrs.js | 77 + .../jade/lib/nodes/block-comment.js | 33 + .../node_modules/jade/lib/nodes/block.js | 121 + .../mocha/node_modules/jade/lib/nodes/case.js | 43 + .../mocha/node_modules/jade/lib/nodes/code.js | 35 + .../node_modules/jade/lib/nodes/comment.js | 32 + .../node_modules/jade/lib/nodes/doctype.js | 29 + .../mocha/node_modules/jade/lib/nodes/each.js | 35 + .../node_modules/jade/lib/nodes/filter.js | 35 + .../node_modules/jade/lib/nodes/index.js | 20 + .../node_modules/jade/lib/nodes/literal.js | 32 + .../node_modules/jade/lib/nodes/mixin.js | 36 + .../mocha/node_modules/jade/lib/nodes/node.js | 25 + .../mocha/node_modules/jade/lib/nodes/tag.js | 95 + .../mocha/node_modules/jade/lib/nodes/text.js | 36 + .../mocha/node_modules/jade/lib/parser.js | 710 + .../mocha/node_modules/jade/lib/runtime.js | 174 + .../node_modules/jade/lib/self-closing.js | 19 + .../mocha/node_modules/jade/lib/utils.js | 49 + .../jade/node_modules/commander/.npmignore | 4 + .../jade/node_modules/commander/.travis.yml | 4 + .../jade/node_modules/commander/History.md | 107 + .../jade/node_modules/commander/Makefile | 7 + .../jade/node_modules/commander/Readme.md | 262 + .../jade/node_modules/commander/index.js | 2 + .../node_modules/commander/lib/commander.js | 1026 + .../jade/node_modules/commander/package.json | 39 + .../jade/node_modules/mkdirp/.gitignore.orig | 2 + .../jade/node_modules/mkdirp/.gitignore.rej | 5 + .../jade/node_modules/mkdirp/.npmignore | 2 + .../jade/node_modules/mkdirp/LICENSE | 21 + .../jade/node_modules/mkdirp/README.markdown | 54 + .../jade/node_modules/mkdirp/examples/pow.js | 6 + .../node_modules/mkdirp/examples/pow.js.orig | 6 + .../node_modules/mkdirp/examples/pow.js.rej | 19 + .../jade/node_modules/mkdirp/index.js | 79 + .../jade/node_modules/mkdirp/package.json | 37 + .../jade/node_modules/mkdirp/test/chmod.js | 38 + .../jade/node_modules/mkdirp/test/clobber.js | 37 + .../jade/node_modules/mkdirp/test/mkdirp.js | 28 + .../jade/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../jade/node_modules/mkdirp/test/race.js | 41 + .../jade/node_modules/mkdirp/test/rel.js | 32 + .../jade/node_modules/mkdirp/test/sync.js | 27 + .../jade/node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 27 + .../mocha/node_modules/jade/package.json | 48 + .../mocha/node_modules/jade/runtime.js | 179 + .../mocha/node_modules/jade/runtime.min.js | 1 + .../mocha/node_modules/jade/test.jade | 7 + .../mocha/node_modules/jade/testing/head.jade | 5 + .../node_modules/jade/testing/index.jade | 22 + .../mocha/node_modules/jade/testing/index.js | 11 + .../node_modules/jade/testing/layout.jade | 6 + .../mocha/node_modules/jade/testing/user.jade | 7 + .../mocha/node_modules/jade/testing/user.js | 27 + .../mocha/node_modules/mkdirp/.npmignore | 2 + .../mocha/node_modules/mkdirp/.travis.yml | 5 + .../mocha/node_modules/mkdirp/LICENSE | 21 + .../mocha/node_modules/mkdirp/examples/pow.js | 6 + .../mocha/node_modules/mkdirp/index.js | 82 + .../mocha/node_modules/mkdirp/package.json | 34 + .../mocha/node_modules/mkdirp/readme.markdown | 63 + .../mocha/node_modules/mkdirp/test/chmod.js | 38 + .../mocha/node_modules/mkdirp/test/clobber.js | 37 + .../mocha/node_modules/mkdirp/test/mkdirp.js | 28 + .../mocha/node_modules/mkdirp/test/perm.js | 32 + .../node_modules/mkdirp/test/perm_sync.js | 39 + .../mocha/node_modules/mkdirp/test/race.js | 41 + .../mocha/node_modules/mkdirp/test/rel.js | 32 + .../mocha/node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../mocha/node_modules/mkdirp/test/root.js | 18 + .../mocha/node_modules/mkdirp/test/sync.js | 32 + .../mocha/node_modules/mkdirp/test/umask.js | 28 + .../node_modules/mkdirp/test/umask_sync.js | 32 + node_modules/mocha/package.json | 60 + node_modules/should/.idea/.name | 1 + .../should/.idea/codeStyleSettings.xml | 29 + node_modules/should/.idea/encodings.xml | 5 + .../inspectionProfiles/Project_Default.xml | 7 + .../inspectionProfiles/profiles_settings.xml | 7 + .../should/.idea/jsLibraryMappings.xml | 7 + .../should/.idea/jsLinters/jshint.xml | 68 + .../Node_js_Dependencies_for_should_js.xml | 13 + node_modules/should/.idea/misc.xml | 5 + node_modules/should/.idea/modules.xml | 9 + .../should/.idea/scopes/scope_settings.xml | 5 + node_modules/should/.idea/should.js.iml | 12 + node_modules/should/.idea/vcs.xml | 7 + node_modules/should/.idea/workspace.xml | 763 + node_modules/should/.npmignore | 2 + node_modules/should/History.md | 222 + node_modules/should/Makefile | 10 + node_modules/should/Readme.md | 644 + node_modules/should/index.js | 2 + node_modules/should/lib/browser.js | 23 + node_modules/should/lib/eql.js | 102 + node_modules/should/lib/ext/assert.js | 57 + node_modules/should/lib/ext/bool.js | 21 + node_modules/should/lib/ext/browser/jquery.js | 229 + node_modules/should/lib/ext/chain.js | 18 + node_modules/should/lib/ext/deprecated.js | 33 + node_modules/should/lib/ext/eql.js | 23 + node_modules/should/lib/ext/error.js | 51 + node_modules/should/lib/ext/http.js | 33 + node_modules/should/lib/ext/match.js | 112 + node_modules/should/lib/ext/number.js | 50 + node_modules/should/lib/ext/property.js | 215 + node_modules/should/lib/ext/string.js | 19 + node_modules/should/lib/ext/type.js | 77 + node_modules/should/lib/node.js | 23 + node_modules/should/lib/should.js | 169 + node_modules/should/lib/util.js | 119 + node_modules/should/package.json | 38 + node_modules/should/should.js | 2321 ++ node_modules/should/should.js.for-tests | 2321 ++ node_modules/should/should.min.js | 55 + package.json | 29 + pages/docs/docs.jade | 119 + pages/docs/docs.json | 31 + pages/document/display.jade | 15 + pages/document/document.jade | 16 + pages/layout.jade | 11 + pages/main/main.jade | 4 + pages/menu.jade | 10 + routers/doc.router.js | 50 + routers/route.js | 134 + server.js | 26 + view/docs.scss | 57 + view/document.scss | 57 + view/main.scss | 69 + 3159 files changed, 349702 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 gulpfile.js create mode 120000 node_modules/.bin/_mocha create mode 120000 node_modules/.bin/express create mode 120000 node_modules/.bin/gulp create mode 120000 node_modules/.bin/jade create mode 120000 node_modules/.bin/mocha create mode 100644 node_modules/consolidate/.npmignore create mode 100644 node_modules/consolidate/History.md create mode 100644 node_modules/consolidate/Makefile create mode 100644 node_modules/consolidate/Readme.md create mode 100644 node_modules/consolidate/index.js create mode 100644 node_modules/consolidate/lib/consolidate.js create mode 100644 node_modules/consolidate/package.json create mode 100644 node_modules/express/.npmignore create mode 100644 node_modules/express/.travis.yml create mode 100644 node_modules/express/History.md create mode 100644 node_modules/express/LICENSE create mode 100644 node_modules/express/Makefile create mode 100644 node_modules/express/Readme.md create mode 100644 node_modules/express/benchmarks/Makefile create mode 100644 node_modules/express/benchmarks/middleware.js create mode 100755 node_modules/express/benchmarks/run create mode 100755 node_modules/express/bin/express create mode 100644 node_modules/express/index.js create mode 100644 node_modules/express/lib/application.js create mode 100644 node_modules/express/lib/express.js create mode 100644 node_modules/express/lib/middleware.js create mode 100644 node_modules/express/lib/request.js create mode 100644 node_modules/express/lib/response.js create mode 100644 node_modules/express/lib/router/index.js create mode 100644 node_modules/express/lib/router/route.js create mode 100644 node_modules/express/lib/utils.js create mode 100644 node_modules/express/lib/view.js create mode 100644 node_modules/express/node_modules/buffer-crc32/.npmignore create mode 100644 node_modules/express/node_modules/buffer-crc32/.travis.yml create mode 100644 node_modules/express/node_modules/buffer-crc32/README.md create mode 100644 node_modules/express/node_modules/buffer-crc32/index.js create mode 100644 node_modules/express/node_modules/buffer-crc32/package.json create mode 100644 node_modules/express/node_modules/buffer-crc32/tests/crc.test.js create mode 100644 node_modules/express/node_modules/commander/History.md create mode 100644 node_modules/express/node_modules/commander/Readme.md create mode 100644 node_modules/express/node_modules/commander/index.js create mode 100644 node_modules/express/node_modules/commander/node_modules/keypress/README.md create mode 100644 node_modules/express/node_modules/commander/node_modules/keypress/index.js create mode 100644 node_modules/express/node_modules/commander/node_modules/keypress/package.json create mode 100644 node_modules/express/node_modules/commander/node_modules/keypress/test.js create mode 100644 node_modules/express/node_modules/commander/package.json create mode 100644 node_modules/express/node_modules/connect/.npmignore create mode 100644 node_modules/express/node_modules/connect/.travis.yml create mode 100644 node_modules/express/node_modules/connect/LICENSE create mode 100644 node_modules/express/node_modules/connect/Readme.md create mode 100644 node_modules/express/node_modules/connect/index.js create mode 100644 node_modules/express/node_modules/connect/lib/cache.js create mode 100644 node_modules/express/node_modules/connect/lib/connect.js create mode 100644 node_modules/express/node_modules/connect/lib/index.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/basicAuth.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/bodyParser.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/compress.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieParser.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieSession.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/csrf.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/directory.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/errorHandler.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/favicon.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/json.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/limit.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/logger.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/methodOverride.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/multipart.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/query.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/responseTime.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/session.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/cookie.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/memory.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/session.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/store.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/static.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/staticCache.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/timeout.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/urlencoded.js create mode 100644 node_modules/express/node_modules/connect/lib/middleware/vhost.js create mode 100644 node_modules/express/node_modules/connect/lib/patch.js create mode 100644 node_modules/express/node_modules/connect/lib/proto.js create mode 100644 node_modules/express/node_modules/connect/lib/public/directory.html create mode 100644 node_modules/express/node_modules/connect/lib/public/error.html create mode 100644 node_modules/express/node_modules/connect/lib/public/favicon.ico create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/folder.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_add.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_attach.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_code.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_copy.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_delete.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_edit.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_error.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_excel.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_find.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_gear.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_go.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_green.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_key.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_link.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paste.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_red.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_save.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_word.png create mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_world.png create mode 100644 node_modules/express/node_modules/connect/lib/public/style.css create mode 100644 node_modules/express/node_modules/connect/lib/utils.js create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/History.md create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/Makefile create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/Readme.md create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/component.json create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/batch/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/History.md create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Makefile create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Readme.md create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/component.json create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/.jshintrc create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/.travis.yml create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/CHANGELOG.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/LICENSE create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/examples/azureblobstorage.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/examples/s3.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/examples/upload.js create mode 100755 node_modules/express/node_modules/connect/node_modules/multiparty/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/LICENSE create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/duplex.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/float.patch create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/float.patch create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/lib/util.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/util.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/LICENSE create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/debuglog.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/readable.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/transform.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/writable.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.txt create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/bench-multipart-parser.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/beta-sticker-1.png create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/binaryfile.tar.gz create mode 100755 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/blank.gif create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/funkyfilename.txt create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/menu_separator.png create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/pf1y5.png create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/plain.txt create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/beta-sticker-1.png.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/binaryfile.tar.gz.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/blank.gif.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/menu_seperator.png.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/pf1y5.png.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/plain.txt.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/filename-name.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/generic.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/crlf.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/preamble.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/info.md create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-chrome-13.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-safari-5.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-chrome-12.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-7.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-8.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-safari-5.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens1.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens2.http create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/encoding.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/no-filename.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/preamble.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/special-chars-in-filename.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/workarounds.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/multi_video.upload create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/multipart.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/record.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-connection-aborted.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-content-transfer-encoding.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-invalid.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-15.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-19.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-21.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-4.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-46.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-5.js create mode 100644 node_modules/express/node_modules/connect/node_modules/multiparty/test/test.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/LICENSE create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/examples/accept.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/examples/charset.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/examples/encoding.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/examples/language.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/lib/charset.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/lib/encoding.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/lib/language.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/lib/mediaType.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/lib/negotiator.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/readme.md create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/test/charset.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/test/encoding.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/test/language.js create mode 100644 node_modules/express/node_modules/connect/node_modules/negotiator/test/mediaType.js create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/History.md create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Makefile create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Readme.md create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/pause/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.gitmodules create mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/qs/Readme.md create mode 100644 node_modules/express/node_modules/connect/node_modules/qs/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/qs/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/.npmignore create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/.travis.yml create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/Makefile create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/README.md create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/raw-body/package.json create mode 100644 node_modules/express/node_modules/connect/node_modules/uid2/LICENSE create mode 100644 node_modules/express/node_modules/connect/node_modules/uid2/index.js create mode 100644 node_modules/express/node_modules/connect/node_modules/uid2/package.json create mode 100644 node_modules/express/node_modules/connect/package.json create mode 100644 node_modules/express/node_modules/cookie-signature/.npmignore create mode 100644 node_modules/express/node_modules/cookie-signature/History.md create mode 100644 node_modules/express/node_modules/cookie-signature/Makefile create mode 100644 node_modules/express/node_modules/cookie-signature/Readme.md create mode 100644 node_modules/express/node_modules/cookie-signature/index.js create mode 100644 node_modules/express/node_modules/cookie-signature/package.json create mode 100644 node_modules/express/node_modules/cookie/.npmignore create mode 100644 node_modules/express/node_modules/cookie/.travis.yml create mode 100644 node_modules/express/node_modules/cookie/LICENSE create mode 100644 node_modules/express/node_modules/cookie/README.md create mode 100644 node_modules/express/node_modules/cookie/index.js create mode 100644 node_modules/express/node_modules/cookie/package.json create mode 100644 node_modules/express/node_modules/cookie/test/mocha.opts create mode 100644 node_modules/express/node_modules/cookie/test/parse.js create mode 100644 node_modules/express/node_modules/cookie/test/serialize.js create mode 100644 node_modules/express/node_modules/debug/Readme.md create mode 100644 node_modules/express/node_modules/debug/debug.js create mode 100644 node_modules/express/node_modules/debug/index.js create mode 100644 node_modules/express/node_modules/debug/lib/debug.js create mode 100644 node_modules/express/node_modules/debug/package.json create mode 100644 node_modules/express/node_modules/fresh/.npmignore create mode 100644 node_modules/express/node_modules/fresh/History.md create mode 100644 node_modules/express/node_modules/fresh/Makefile create mode 100644 node_modules/express/node_modules/fresh/Readme.md create mode 100644 node_modules/express/node_modules/fresh/index.js create mode 100644 node_modules/express/node_modules/fresh/package.json create mode 100644 node_modules/express/node_modules/merge-descriptors/.npmignore create mode 100644 node_modules/express/node_modules/merge-descriptors/README.md create mode 100644 node_modules/express/node_modules/merge-descriptors/component.json create mode 100644 node_modules/express/node_modules/merge-descriptors/index.js create mode 100644 node_modules/express/node_modules/merge-descriptors/package.json create mode 100644 node_modules/express/node_modules/methods/History.md create mode 100644 node_modules/express/node_modules/methods/Readme.md create mode 100644 node_modules/express/node_modules/methods/index.js create mode 100644 node_modules/express/node_modules/methods/package.json create mode 100644 node_modules/express/node_modules/mkdirp/.npmignore create mode 100644 node_modules/express/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/express/node_modules/mkdirp/LICENSE create mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/express/node_modules/mkdirp/index.js create mode 100644 node_modules/express/node_modules/mkdirp/package.json create mode 100644 node_modules/express/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/express/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/express/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/express/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/express/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/express/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/express/node_modules/mkdirp/test/race.js create mode 100644 node_modules/express/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/express/node_modules/mkdirp/test/return.js create mode 100644 node_modules/express/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/express/node_modules/mkdirp/test/root.js create mode 100644 node_modules/express/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/express/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/express/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/express/node_modules/range-parser/.npmignore create mode 100644 node_modules/express/node_modules/range-parser/History.md create mode 100644 node_modules/express/node_modules/range-parser/Makefile create mode 100644 node_modules/express/node_modules/range-parser/Readme.md create mode 100644 node_modules/express/node_modules/range-parser/index.js create mode 100644 node_modules/express/node_modules/range-parser/package.json create mode 100644 node_modules/express/node_modules/send/.npmignore create mode 100644 node_modules/express/node_modules/send/History.md create mode 100644 node_modules/express/node_modules/send/Makefile create mode 100644 node_modules/express/node_modules/send/Readme.md create mode 100644 node_modules/express/node_modules/send/index.js create mode 100644 node_modules/express/node_modules/send/lib/send.js create mode 100644 node_modules/express/node_modules/send/lib/utils.js create mode 100644 node_modules/express/node_modules/send/node_modules/mime/LICENSE create mode 100644 node_modules/express/node_modules/send/node_modules/mime/README.md create mode 100644 node_modules/express/node_modules/send/node_modules/mime/mime.js create mode 100644 node_modules/express/node_modules/send/node_modules/mime/package.json create mode 100644 node_modules/express/node_modules/send/node_modules/mime/test.js create mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/mime.types create mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/node.types create mode 100644 node_modules/express/node_modules/send/package.json create mode 100644 node_modules/express/package.json create mode 100644 node_modules/gulp-minify-css/.npmignore create mode 100644 node_modules/gulp-minify-css/.travis.yml create mode 100755 node_modules/gulp-minify-css/LICENSE create mode 100644 node_modules/gulp-minify-css/README.md create mode 100644 node_modules/gulp-minify-css/index.js create mode 120000 node_modules/gulp-minify-css/node_modules/.bin/cleancss create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/.npmignore create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/.travis.yml create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/LICENCE create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/README.md create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/bufferstreams/src/index.js create mode 100755 node_modules/gulp-minify-css/node_modules/bufferstreams/tests/index.mocha.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/History.md create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/README.md create mode 100755 node_modules/gulp-minify-css/node_modules/clean-css/bin/cleancss create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/clean.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/hsl-to-hex.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/long-to-short-hex.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/rgb-to-hex.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/shortener.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rebase.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rewriter.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/imports/inliner.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/optimizer.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/shorthand-notations.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/empty-removal.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/optimizer.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/tokenizer.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/text/comments.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/text/escape-store.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/text/expressions.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/text/free.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/lib/text/urls.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/History.md create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/Readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/clean-css/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/clone/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/clone/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/clone/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/clone/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/clone/clone.js create mode 100644 node_modules/gulp-minify-css/node_modules/clone/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/clone/test.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/LICENCE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/examples/pretty.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/LICENCE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.APACHE2 create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.MIT create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/LICENCE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/examples/pretty.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/test/simple-map.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/pause-end.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/LICENCE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/examples/pretty.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/partitioned_unicode.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/split.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/try_catch.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.MIT create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/auto-destroy.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/buffering.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/end.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/connect.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/helper/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/merge.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/pause.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/pipeline.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/readArray.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/readable.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/replace.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/simple-map.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/spec.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/split.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/stringify.js create mode 100644 node_modules/gulp-minify-css/node_modules/event-stream/test/writeArray.asynct.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/.travis.yml create mode 100755 node_modules/gulp-minify-css/node_modules/gulp-util/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/File.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/PluginError.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/beep.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/buffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/colors.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/combine.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/date.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/env.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/isBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/isNull.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/isStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/linefeed.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/log.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/noop.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/replaceExtension.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/lib/template.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/index.js create mode 120000 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md create mode 100755 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/Readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/lib/dateformat.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/test/basic.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/test/test_dayofweek.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.sh create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash._reinterpolate/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash._reinterpolate/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash._reinterpolate/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash._reinterpolate/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/LICENSE.txt create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/lodash.template/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/example/parse.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/readme.markdown create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/dash.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/dotted.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/long.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/parse.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/short.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/History.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/Makefile create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/Readme.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/LICENSE.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/README.md create mode 100755 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/example.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/test/tests.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/multipipe/test/multipipe.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/.jshintrc create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/float.patch create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/.npmignore create mode 100755 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/build.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/files.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/test-replacements.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/common.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder-end.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/readable.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/transform.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/writable.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/LICENCE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/Makefile create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/has-keys.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/mutable.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.travis.yml create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/foreach.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/isArguments.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/shim.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/foreach.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/isArguments.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/shim.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/node_modules/xtend/test.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/test/basic-test.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/test/bench.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/test/sauce.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/test/test.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/through2/through2.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/.npmignore create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/.travis.yml create mode 100755 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/LICENSE create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/lib/cloneBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/lib/inspectStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/lib/isBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/lib/isNull.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/lib/isStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/LICENSE.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/README.md create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/index.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/test.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/File.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/cloneBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/inspectStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/isBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/isNull.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/vinyl/test/isStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/package.json create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/File.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/PluginError.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/beep.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/buffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/colors.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/combine.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/date.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/env.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/isBuffer.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/isNull.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/isStream.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/linefeed.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/log.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/noop.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/replaceExtension.js create mode 100644 node_modules/gulp-minify-css/node_modules/gulp-util/test/template.js create mode 100644 node_modules/gulp-minify-css/package.json create mode 100644 node_modules/gulp-minify-css/test/fixture/index.css create mode 100644 node_modules/gulp-minify-css/test/minify.js create mode 100644 node_modules/gulp-sass/.npmignore create mode 100644 node_modules/gulp-sass/.travis.yml create mode 100644 node_modules/gulp-sass/LICENSE create mode 100644 node_modules/gulp-sass/README.md create mode 100644 node_modules/gulp-sass/index.js create mode 120000 node_modules/gulp-sass/node_modules/.bin/node-sass create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/.travis.yml create mode 100755 node_modules/gulp-sass/node_modules/gulp-util/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/File.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/PluginError.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/beep.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/buffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/colors.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/combine.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/date.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/env.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/isBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/isNull.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/isStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/linefeed.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/log.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/noop.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/replaceExtension.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/lib/template.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/index.js create mode 120000 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md create mode 100755 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/chalk/readme.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/lib/dateformat.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/test/basic.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/test/test_dayofweek.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.sh create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash._reinterpolate/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash._reinterpolate/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash._reinterpolate/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash._reinterpolate/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/LICENSE.txt create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/lodash.template/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/example/parse.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/readme.markdown create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/dash.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/dotted.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/long.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/parse.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/short.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/History.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/Makefile create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/LICENSE.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/README.md create mode 100755 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/example.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/test/tests.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/multipipe/test/multipipe.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/.jshintrc create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/float.patch create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/.npmignore create mode 100755 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/build.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/files.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/test-replacements.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/common.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder-end.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/readable.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/transform.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/writable.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/LICENCE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/Makefile create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/has-keys.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/mutable.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/foreach.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/isArguments.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/shim.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/foreach.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/isArguments.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/shim.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/node_modules/xtend/test.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/test/basic-test.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/test/bench.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/test/sauce.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/test/test.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/through2/through2.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/.travis.yml create mode 100755 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/lib/cloneBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/lib/inspectStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/lib/isBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/lib/isNull.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/lib/isStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/LICENSE.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/README.md create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/index.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/test.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/File.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/cloneBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/inspectStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/isBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/isNull.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/node_modules/vinyl/test/isStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/package.json create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/File.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/PluginError.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/beep.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/buffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/colors.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/combine.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/date.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/env.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/isBuffer.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/isNull.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/isStream.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/linefeed.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/log.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/noop.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/replaceExtension.js create mode 100644 node_modules/gulp-sass/node_modules/gulp-util/test/template.js create mode 100644 node_modules/gulp-sass/node_modules/map-stream/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/map-stream/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/map-stream/LICENCE create mode 100644 node_modules/gulp-sass/node_modules/map-stream/examples/pretty.js create mode 100644 node_modules/gulp-sass/node_modules/map-stream/index.js create mode 100644 node_modules/gulp-sass/node_modules/map-stream/package.json create mode 100644 node_modules/gulp-sass/node_modules/map-stream/readme.markdown create mode 100644 node_modules/gulp-sass/node_modules/map-stream/test/simple-map.asynct.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.editorconfig create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.gitmodules create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.jshintignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.jshintrc create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/CONTRIBUTING.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/README.md create mode 100755 node_modules/gulp-sass/node_modules/node-sass/bin/darwin-x64-v8-3.14/binding.node create mode 100755 node_modules/gulp-sass/node_modules/node-sass/bin/darwin-x64-v8-3.22/binding.node create mode 100644 node_modules/gulp-sass/node_modules/node-sass/bin/linux-ia32-v8-3.14/binding.node create mode 100644 node_modules/gulp-sass/node_modules/node-sass/bin/linux-x64-v8-3.14/binding.node create mode 100755 node_modules/gulp-sass/node_modules/node-sass/bin/node-sass create mode 100644 node_modules/gulp-sass/node_modules/node-sass/bin/win32-ia32-v8-3.14/binding.node create mode 100644 node_modules/gulp-sass/node_modules/node-sass/bin/win32-x64-v8-3.14/binding.node create mode 100644 node_modules/gulp-sass/node_modules/node-sass/binding.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/binding.gyp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Makefile create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/binding.node.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/binding.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/ast.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/base64vlq.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/bind.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/constants.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/context.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/contextualize.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/copy_c_str.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/error_handling.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/eval.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/expand.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/extend.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/file.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/functions.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/inspect.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/output_compressed.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/output_nested.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/parser.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/prelexer.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/sass.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/sass_interface.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/source_map.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/to_c.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/to_string.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/libsass/units.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/.deps/Release/obj.target/binding/sass_context_wrapper.o.d create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/linker.lock create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/binding.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/ast.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/base64vlq.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/bind.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/constants.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/context.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/contextualize.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/copy_c_str.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/error_handling.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/eval.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/expand.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/extend.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/file.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/functions.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/inspect.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/output_compressed.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/output_nested.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/parser.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/prelexer.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/sass.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/sass_interface.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/source_map.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/to_c.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/to_string.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/libsass/units.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/Release/obj.target/binding/sass_context_wrapper.o create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/binding.Makefile create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/binding.target.mk create mode 100644 node_modules/gulp-sass/node_modules/node-sass/build/config.gypi create mode 100755 node_modules/gulp-sass/node_modules/node-sass/build/gyp-mac-tool create mode 100644 node_modules/gulp-sass/node_modules/node-sass/examples/middleware.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/examples/public/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/examples/test.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/lib/cli.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/lib/middleware.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/lib/render.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/COPYING create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/INSTALL create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/Makefile create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/Makefile.am create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/ast.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/ast.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/ast_def_macros.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/ast_factory.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/ast_fwd_decl.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/backtrace.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/base64vlq.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/base64vlq.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/bind.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/bind.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/color_names.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/configure.ac create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/constants.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/constants.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/context.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/context.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/contextualize.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/contextualize.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/copy_c_str.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/copy_c_str.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/environment.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/error_handling.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/error_handling.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/eval.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/eval.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/expand.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/expand.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/extconf.rb create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/extend.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/extend.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/file.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/file.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/functions.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/functions.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/inspect.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/inspect.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/kwd_arg_macros.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/m4/.gitkeep create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/mapping.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/memory_manager.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/operation.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/output_compressed.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/output_compressed.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/output_nested.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/output_nested.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/parser.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/parser.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/position.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/prelexer.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/prelexer.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/sass.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/sass.h create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/sass_interface.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/sass_interface.h create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/sassc++.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/source_map.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/source_map.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/support/libsass.pc.in create mode 100755 node_modules/gulp-sass/node_modules/node-sass/libsass/test-driver create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/to_c.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/to_c.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/to_string.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/to_string.hpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/token.hpp create mode 100755 node_modules/gulp-sass/node_modules/node-sass/libsass/travis.sh create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/units.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/libsass/units.hpp create mode 120000 node_modules/gulp-sass/node_modules/node-sass/node_modules/.bin/_mocha create mode 120000 node_modules/gulp-sass/node_modules/node-sass/node_modules/.bin/mocha create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/chalk.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/has-color/has-color.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/has-color/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/node_modules/has-color/readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/chalk/readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/race.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/return.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/root.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/Readme.md create mode 100755 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/bin/_mocha create mode 100755 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/bin/mocha create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/images/error.png create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/images/ok.png create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/debug.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/events.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/fs.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/path.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/progress.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/browser/tty.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/context.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/hook.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/interfaces/bdd.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/interfaces/exports.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/interfaces/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/interfaces/qunit.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/interfaces/tdd.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/mocha.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/ms.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/base.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/doc.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/dot.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/html-cov.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/html.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/json-cov.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/json-stream.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/json.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/landing.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/list.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/markdown.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/min.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/nyan.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/progress.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/spec.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/tap.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/teamcity.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/templates/coverage.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/templates/menu.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/templates/script.html create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/templates/style.html create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/xunit.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runnable.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runner.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/suite.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/template.html create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/test.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/utils.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.css create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.js create mode 120000 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/.bin/jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/History.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Makefile create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/lib/commander.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/debug.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/lib/debug.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/diff.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/g.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/usr-local.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/glob.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/00-setup.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-comparison.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-results.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/cwd-test.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/globstar-match.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/mark.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/pause-resume.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root-nomount.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/stat.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/zz-cleanup.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/History.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/Readme.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/lib/growl.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/test.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/LICENSE create mode 100755 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/bin/jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.min.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/compiler.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/doctypes.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/filters.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/inline-tags.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/jade.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/lexer.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/case.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/code.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/comment.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/each.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/filter.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/literal.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/node.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/tag.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/text.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/parser.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/runtime.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/self-closing.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/utils.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.min.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/test.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/head.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/layout.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.jade create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/build/config.gypi create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/include_dirs.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/nan.h create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/README.md create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/lib/watch.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/bool.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_double.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_single.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_hash.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_singles.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/divide.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_options.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_wrap.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/nonopt.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/reflect.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/short.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/string.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/usage-options.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/xup.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/.travis.yml create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/LICENSE create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/example/parse.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/readme.markdown create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dash.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dotted.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/long.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/short.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/.npmignore create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/README.markdown create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/center.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/meat.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/index.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/break.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/idleness.txt create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/wrap.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/readme.markdown create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/argv.js create mode 100755 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/bin.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/dash.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse_modified.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/short.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/usage.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/whitespace.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/package.json create mode 100644 node_modules/gulp-sass/node_modules/node-sass/sass.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.cpp create mode 100644 node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.h create mode 100755 node_modules/gulp-sass/node_modules/node-sass/scripts/prepublish.sh create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/cli.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/functions/colorBlue.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/include_path.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/large_test.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/lib/vars.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/mem_test_render.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/mem_test_renderSync.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/sample.scss create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/source_comments_spec.js create mode 100644 node_modules/gulp-sass/node_modules/node-sass/test/test.js create mode 100644 node_modules/gulp-sass/package.json create mode 100644 node_modules/gulp-sass/test/ref/inheritance.css create mode 100644 node_modules/gulp-sass/test/ref/mixins.css create mode 100644 node_modules/gulp-sass/test/ref/nesting.css create mode 100644 node_modules/gulp-sass/test/ref/variables.css create mode 100644 node_modules/gulp-sass/test/scss/includes/_cats.scss create mode 100644 node_modules/gulp-sass/test/scss/inheritance.scss create mode 100644 node_modules/gulp-sass/test/scss/mixins.scss create mode 100644 node_modules/gulp-sass/test/scss/nesting.scss create mode 100644 node_modules/gulp-sass/test/scss/variables.scss create mode 100644 node_modules/gulp-sass/test/test.js create mode 100644 node_modules/gulp/.jshintrc create mode 100644 node_modules/gulp/.npmignore create mode 100644 node_modules/gulp/.travis.yml create mode 100644 node_modules/gulp/CHANGELOG.md create mode 100755 node_modules/gulp/LICENSE create mode 100644 node_modules/gulp/README.md create mode 100755 node_modules/gulp/bin/gulp.js create mode 100644 node_modules/gulp/completion/README.md create mode 100644 node_modules/gulp/completion/bash create mode 100644 node_modules/gulp/completion/zsh create mode 100644 node_modules/gulp/docs/API.md create mode 100644 node_modules/gulp/docs/CLI.md create mode 100644 node_modules/gulp/docs/FAQ.md create mode 100644 node_modules/gulp/docs/README.md create mode 100644 node_modules/gulp/docs/getting-started.md create mode 100644 node_modules/gulp/docs/recipes/combining-streams-to-handle-errors.md create mode 100644 node_modules/gulp/docs/recipes/mocha-test-runner-with-gulp.md create mode 100644 node_modules/gulp/docs/recipes/only-pass-through-changed-files.md create mode 100644 node_modules/gulp/docs/recipes/pass-params-from-cli.md create mode 100644 node_modules/gulp/docs/recipes/rebuild-only-files-that-change.md create mode 100644 node_modules/gulp/docs/recipes/running-tasks-in-series.md create mode 100644 node_modules/gulp/docs/recipes/specifying-a-cwd.md create mode 100644 node_modules/gulp/docs/recipes/using-coffee-script-for-gulpfile.md create mode 100644 node_modules/gulp/docs/recipes/using-external-config-file.md create mode 100644 node_modules/gulp/docs/recipes/using-multiple-sources-in-one-task.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/README.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/dealing-with-streams.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/guidelines.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/readme-conventions.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/testing.md create mode 100644 node_modules/gulp/docs/writing-a-plugin/using-buffers.md create mode 100644 node_modules/gulp/gulpfile.js create mode 100644 node_modules/gulp/index.js create mode 100644 node_modules/gulp/lib/completion.js create mode 100644 node_modules/gulp/lib/taskTree.js create mode 120000 node_modules/gulp/node_modules/.bin/semver create mode 100644 node_modules/gulp/node_modules/archy/.travis.yml create mode 100644 node_modules/gulp/node_modules/archy/README.markdown create mode 100644 node_modules/gulp/node_modules/archy/examples/beep.js create mode 100644 node_modules/gulp/node_modules/archy/examples/multi_line.js create mode 100644 node_modules/gulp/node_modules/archy/index.js create mode 100644 node_modules/gulp/node_modules/archy/package.json create mode 100644 node_modules/gulp/node_modules/archy/test/beep.js create mode 100644 node_modules/gulp/node_modules/archy/test/multi_line.js create mode 100644 node_modules/gulp/node_modules/archy/test/non_unicode.js create mode 100644 node_modules/gulp/node_modules/deprecated/.npmignore create mode 100644 node_modules/gulp/node_modules/deprecated/.travis.yml create mode 100755 node_modules/gulp/node_modules/deprecated/LICENSE create mode 100644 node_modules/gulp/node_modules/deprecated/README.md create mode 100644 node_modules/gulp/node_modules/deprecated/index.js create mode 100644 node_modules/gulp/node_modules/deprecated/package.json create mode 100644 node_modules/gulp/node_modules/deprecated/test/field.js create mode 100644 node_modules/gulp/node_modules/deprecated/test/method.js create mode 100644 node_modules/gulp/node_modules/findup-sync/.jshintrc create mode 100644 node_modules/gulp/node_modules/findup-sync/.npmignore create mode 100644 node_modules/gulp/node_modules/findup-sync/Gruntfile.js create mode 100644 node_modules/gulp/node_modules/findup-sync/LICENSE-MIT create mode 100644 node_modules/gulp/node_modules/findup-sync/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/lib/findup-sync.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/.npmignore create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/.travis.yml create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/LICENSE create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/g.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/usr-local.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/glob.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/ulimit.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/.npmignore create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/LICENSE create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/minimatch.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/basic.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/caching.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/00-setup.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-comparison.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-results.json create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/cwd-test.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/mark.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/nocase-nomagic.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/pause-resume.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root-nomount.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/zz-cleanup.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/README.md create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.min.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.min.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.min.js create mode 100644 node_modules/gulp/node_modules/findup-sync/node_modules/lodash/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/package.json create mode 100644 node_modules/gulp/node_modules/findup-sync/test/findup-sync_test.js create mode 100644 node_modules/gulp/node_modules/findup-sync/test/fixtures/a.txt create mode 100644 node_modules/gulp/node_modules/findup-sync/test/fixtures/a/b/bar.txt create mode 100644 node_modules/gulp/node_modules/findup-sync/test/fixtures/a/foo.txt create mode 100644 node_modules/gulp/node_modules/findup-sync/test/fixtures/aaa.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/.travis.yml create mode 100755 node_modules/gulp/node_modules/gulp-util/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/File.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/PluginError.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/beep.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/buffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/colors.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/combine.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/date.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/env.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/isBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/isNull.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/isStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/linefeed.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/log.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/noop.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/replaceExtension.js create mode 100644 node_modules/gulp/node_modules/gulp-util/lib/template.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/index.js create mode 120000 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md create mode 100755 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/chalk/readme.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/Readme.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/lib/dateformat.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/test/basic.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/test/test_dayofweek.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/dateformat/test/test_weekofyear.sh create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash._reinterpolate/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash._reinterpolate/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash._reinterpolate/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash._reinterpolate/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash._escapestringchar/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.defaults/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._escapehtmlchar/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/node_modules/lodash._htmlescapes/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/node_modules/lodash._reunescapedhtml/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.escape/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._isnative/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash._shimkeys/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/node_modules/lodash._objecttypes/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/node_modules/lodash.isobject/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.keys/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.templatesettings/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/LICENSE.txt create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/node_modules/lodash.values/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/lodash.template/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/.travis.yml create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/History.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/Makefile create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/Readme.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/.travis.yml create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/LICENSE.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/README.md create mode 100755 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/example.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/node_modules/duplexer2/test/tests.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/multipipe/test/multipipe.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/.jshintrc create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/.travis.yml create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/float.patch create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/.npmignore create mode 100755 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/build.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/files.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/build/test-replacements.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/common.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder-end.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/node_modules/string_decoder/test/simple/test-string-decoder.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/readable.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/transform.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/readable-stream/writable.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/LICENCE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/Makefile create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/has-keys.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/mutable.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/.travis.yml create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/foreach.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/isArguments.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/shim.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/foreach.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/isArguments.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/node_modules/object-keys/test/shim.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/node_modules/xtend/test.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/test/basic-test.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/test/bench.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/test/sauce.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/test/test.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/through2/through2.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/.npmignore create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/.travis.yml create mode 100755 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/LICENSE create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/lib/cloneBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/lib/inspectStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/lib/isBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/lib/isNull.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/lib/isStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/LICENSE.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/README.md create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/index.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/node_modules/clone-stats/test.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/File.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/cloneBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/inspectStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/isBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/isNull.js create mode 100644 node_modules/gulp/node_modules/gulp-util/node_modules/vinyl/test/isStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/package.json create mode 100644 node_modules/gulp/node_modules/gulp-util/test/File.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/PluginError.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/beep.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/buffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/colors.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/combine.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/date.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/env.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/isBuffer.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/isNull.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/isStream.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/linefeed.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/log.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/noop.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/replaceExtension.js create mode 100644 node_modules/gulp/node_modules/gulp-util/test/template.js create mode 100644 node_modules/gulp/node_modules/minimist/.travis.yml create mode 100644 node_modules/gulp/node_modules/minimist/LICENSE create mode 100644 node_modules/gulp/node_modules/minimist/example/parse.js create mode 100644 node_modules/gulp/node_modules/minimist/index.js create mode 100644 node_modules/gulp/node_modules/minimist/package.json create mode 100644 node_modules/gulp/node_modules/minimist/readme.markdown create mode 100644 node_modules/gulp/node_modules/minimist/test/dash.js create mode 100644 node_modules/gulp/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/gulp/node_modules/minimist/test/dotted.js create mode 100644 node_modules/gulp/node_modules/minimist/test/long.js create mode 100644 node_modules/gulp/node_modules/minimist/test/parse.js create mode 100644 node_modules/gulp/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/gulp/node_modules/minimist/test/short.js create mode 100644 node_modules/gulp/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/gulp/node_modules/orchestrator/.npmignore create mode 100644 node_modules/gulp/node_modules/orchestrator/LICENSE create mode 100644 node_modules/gulp/node_modules/orchestrator/README.md create mode 100644 node_modules/gulp/node_modules/orchestrator/index.js create mode 100644 node_modules/gulp/node_modules/orchestrator/lib/runTask.js create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/.npmignore create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/.travis.yml create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/LICENSE create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/README.md create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/index.js create mode 100644 node_modules/gulp/node_modules/orchestrator/node_modules/sequencify/package.json create mode 100644 node_modules/gulp/node_modules/orchestrator/package.json create mode 100644 node_modules/gulp/node_modules/pretty-hrtime/.npmignore create mode 100644 node_modules/gulp/node_modules/pretty-hrtime/LICENSE create mode 100644 node_modules/gulp/node_modules/pretty-hrtime/README.md create mode 100644 node_modules/gulp/node_modules/pretty-hrtime/index.js create mode 100644 node_modules/gulp/node_modules/pretty-hrtime/package.json create mode 100644 node_modules/gulp/node_modules/resolve/.travis.yml create mode 100644 node_modules/gulp/node_modules/resolve/LICENSE create mode 100644 node_modules/gulp/node_modules/resolve/example/async.js create mode 100644 node_modules/gulp/node_modules/resolve/example/sync.js create mode 100644 node_modules/gulp/node_modules/resolve/index.js create mode 100644 node_modules/gulp/node_modules/resolve/lib/async.js create mode 100644 node_modules/gulp/node_modules/resolve/lib/caller.js create mode 100644 node_modules/gulp/node_modules/resolve/lib/core.js create mode 100644 node_modules/gulp/node_modules/resolve/lib/core.json create mode 100644 node_modules/gulp/node_modules/resolve/lib/node-modules-paths.js create mode 100644 node_modules/gulp/node_modules/resolve/lib/sync.js create mode 100644 node_modules/gulp/node_modules/resolve/package.json create mode 100644 node_modules/gulp/node_modules/resolve/readme.markdown create mode 100644 node_modules/gulp/node_modules/resolve/test/core.js create mode 100644 node_modules/gulp/node_modules/resolve/test/filter.js create mode 100644 node_modules/gulp/node_modules/resolve/test/filter_sync.js create mode 100644 node_modules/gulp/node_modules/resolve/test/mock.js create mode 100644 node_modules/gulp/node_modules/resolve/test/mock_sync.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/baz/doom.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/baz/package.json create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/baz/quux.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/cup.coffee create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/foo.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/incorrect_main/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/incorrect_main/package.json create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/mug.coffee create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/mug.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/other_path/lib/other-lib.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/other_path/root.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/punycode/node_modules/punycode/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/quux/foo/index.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/without_basedir/main.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js create mode 100644 node_modules/gulp/node_modules/resolve/test/resolver_sync.js create mode 100644 node_modules/gulp/node_modules/semver/.npmignore create mode 100644 node_modules/gulp/node_modules/semver/LICENSE create mode 100644 node_modules/gulp/node_modules/semver/Makefile create mode 100644 node_modules/gulp/node_modules/semver/README.md create mode 100755 node_modules/gulp/node_modules/semver/bin/semver create mode 100644 node_modules/gulp/node_modules/semver/foot.js create mode 100644 node_modules/gulp/node_modules/semver/head.js create mode 100644 node_modules/gulp/node_modules/semver/package.json create mode 100644 node_modules/gulp/node_modules/semver/semver.browser.js create mode 100644 node_modules/gulp/node_modules/semver/semver.browser.js.gz create mode 100644 node_modules/gulp/node_modules/semver/semver.js create mode 100644 node_modules/gulp/node_modules/semver/semver.min.js create mode 100644 node_modules/gulp/node_modules/semver/semver.min.js.gz create mode 100644 node_modules/gulp/node_modules/semver/test/amd.js create mode 100644 node_modules/gulp/node_modules/semver/test/gtr.js create mode 100644 node_modules/gulp/node_modules/semver/test/index.js create mode 100644 node_modules/gulp/node_modules/semver/test/ltr.js create mode 100644 node_modules/gulp/node_modules/semver/test/no-module.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/.travis.yml create mode 100755 node_modules/gulp/node_modules/vinyl-fs/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/dest/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/dest/writeBuffer.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/dest/writeContents.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/dest/writeDir.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/dest/writeStream.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/bufferFile.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/getContents.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/getStats.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/readDir.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/lib/src/streamFile.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/.travis.yml create mode 100755 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/examples/g.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/examples/usr-local.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/glob.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/node_modules/inherits/test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/00-setup.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/bash-comparison.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/bash-results.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/cwd-test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/globstar-match.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/mark.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/new-glob-optional-options.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/nocase-nomagic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/pause-resume.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/root-nomount.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/root.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/stat.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob/test/zz-cleanup.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/.travis.yml create mode 100755 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/glob2base/test/main.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/minimatch.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/test/caching.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/ordered-read-streams/test/main.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/LICENSE.MIT create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/readme.markdown create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/test/auto-destroy.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/test/buffering.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/test/end.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through/test/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/unique-stream/test/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/fixtures/stuff/run.dmc create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/fixtures/stuff/test.dmc create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/fixtures/test.coffee create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/fixtures/whatsgoingon/hey/isaidhey/whatsgoingon/test.txt create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/fixtures/whatsgoingon/test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-stream/test/main.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/.travis.yml create mode 100755 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/.editorconfig create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/.jshintrc create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/AUTHORS create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/Gruntfile.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/LICENSE-MIT create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/benchmarks/gaze100s.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/lib/gaze.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/lib/helper.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/.jshintrc create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/Gruntfile.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/LICENSE-MIT create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/lib/globule.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/examples/g.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/examples/usr-local.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/glob.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/graceful-fs/test/ulimit.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/00-setup.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/bash-comparison.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/bash-results.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/cwd-test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/mark.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/nocase-nomagic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/pause-resume.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/root-nomount.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/root.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/glob/test/zz-cleanup.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.compat.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.compat.min.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.min.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.underscore.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/dist/lodash.underscore.min.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/lodash/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/minimatch.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/test/basic.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/test/caching.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/css/baz.css create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/css/qux.css create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/deep/deep.txt create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/deep/deeper/deeper.txt create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/deep/deeper/deepest/deepest.txt create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/js/bar.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/fixtures/expand/js/foo.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/node_modules/globule/test/globule_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/add_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/api_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/file_poller.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/Project (LO)/one.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/nested/one.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/nested/sub/two.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/nested/sub2/two.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/nested/three.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/one.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/sub/one.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/fixtures/sub/two.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/helper.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/matching_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/patterns_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/relative_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/rename_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/safewrite_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/watch_race_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/node_modules/gaze/test/watch_test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/test/fixtures/test.coffee create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/glob-watcher/test/main.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/LICENCE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/examples/pretty.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/readme.markdown create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/map-stream/test/simple-map.asynct.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/race.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/return.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/root.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/.npmignore create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/.travis.yml create mode 100755 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/LICENSE create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/lib/cloneBuffer.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/lib/inspectStream.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/lib/isBuffer.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/lib/isNull.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/lib/isStream.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/node_modules/clone-stats/LICENSE.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/node_modules/clone-stats/README.md create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/node_modules/clone-stats/index.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/node_modules/clone-stats/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/node_modules/clone-stats/test.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/File.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/cloneBuffer.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/inspectStream.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/isBuffer.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/isNull.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/node_modules/vinyl/test/isStream.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/package.json create mode 100644 node_modules/gulp/node_modules/vinyl-fs/test/dest.js create mode 100644 node_modules/gulp/node_modules/vinyl-fs/test/fixtures/test.coffee create mode 100644 node_modules/gulp/node_modules/vinyl-fs/test/fixtures/wow/suchempty create mode 100644 node_modules/gulp/node_modules/vinyl-fs/test/src.js create mode 100644 node_modules/gulp/package.json create mode 100644 node_modules/gulp/test/dest.js create mode 100644 node_modules/gulp/test/fixtures/copy/example.txt create mode 100644 node_modules/gulp/test/fixtures/stuff/run.dmc create mode 100644 node_modules/gulp/test/fixtures/stuff/test.dmc create mode 100644 node_modules/gulp/test/fixtures/test.coffee create mode 100644 node_modules/gulp/test/fixtures/test/run.jade create mode 100644 node_modules/gulp/test/src.js create mode 100644 node_modules/gulp/test/taskTree.js create mode 100644 node_modules/gulp/test/tasks.js create mode 100644 node_modules/gulp/test/watch.js create mode 100644 node_modules/jade/.npmignore create mode 100644 node_modules/jade/LICENSE create mode 100644 node_modules/jade/README.md create mode 100644 node_modules/jade/Readme_zh-cn.md create mode 100755 node_modules/jade/bin/jade.js create mode 100644 node_modules/jade/component.json create mode 100644 node_modules/jade/index.js create mode 100644 node_modules/jade/jade-language.md create mode 100644 node_modules/jade/jade.js create mode 100644 node_modules/jade/jade.md create mode 100644 node_modules/jade/lib/compiler.js create mode 100644 node_modules/jade/lib/doctypes.js create mode 100644 node_modules/jade/lib/filters-client.js create mode 100644 node_modules/jade/lib/filters.js create mode 100644 node_modules/jade/lib/inline-tags.js create mode 100644 node_modules/jade/lib/jade.js create mode 100644 node_modules/jade/lib/lexer.js create mode 100644 node_modules/jade/lib/nodes/attrs.js create mode 100644 node_modules/jade/lib/nodes/block-comment.js create mode 100644 node_modules/jade/lib/nodes/block.js create mode 100644 node_modules/jade/lib/nodes/case.js create mode 100644 node_modules/jade/lib/nodes/code.js create mode 100644 node_modules/jade/lib/nodes/comment.js create mode 100644 node_modules/jade/lib/nodes/doctype.js create mode 100644 node_modules/jade/lib/nodes/each.js create mode 100644 node_modules/jade/lib/nodes/filter.js create mode 100644 node_modules/jade/lib/nodes/index.js create mode 100644 node_modules/jade/lib/nodes/literal.js create mode 100644 node_modules/jade/lib/nodes/mixin-block.js create mode 100644 node_modules/jade/lib/nodes/mixin.js create mode 100644 node_modules/jade/lib/nodes/node.js create mode 100644 node_modules/jade/lib/nodes/tag.js create mode 100644 node_modules/jade/lib/nodes/text.js create mode 100644 node_modules/jade/lib/parser.js create mode 100644 node_modules/jade/lib/runtime.js create mode 100644 node_modules/jade/lib/self-closing.js create mode 100644 node_modules/jade/lib/utils.js create mode 100644 node_modules/jade/node_modules/character-parser/.npmignore create mode 100644 node_modules/jade/node_modules/character-parser/LICENSE create mode 100644 node_modules/jade/node_modules/character-parser/README.md create mode 100644 node_modules/jade/node_modules/character-parser/index.js create mode 100644 node_modules/jade/node_modules/character-parser/package.json create mode 100644 node_modules/jade/node_modules/commander/Readme.md create mode 100644 node_modules/jade/node_modules/commander/index.js create mode 100644 node_modules/jade/node_modules/commander/package.json create mode 100644 node_modules/jade/node_modules/constantinople/.gitattributes create mode 100644 node_modules/jade/node_modules/constantinople/.npmignore create mode 100644 node_modules/jade/node_modules/constantinople/.travis.yml create mode 100644 node_modules/jade/node_modules/constantinople/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/README.md create mode 100644 node_modules/jade/node_modules/constantinople/index.js create mode 120000 node_modules/jade/node_modules/constantinople/node_modules/.bin/uglifyjs create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/.npmignore create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/.travis.yml create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/README.md create mode 100755 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/bin/uglifyjs create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/ast.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/compress.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/mozilla-ast.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/output.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/parse.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/scope.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/sourcemap.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/transform.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/lib/utils.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/async/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/async/README.md create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/async/component.json create mode 100755 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/async/lib/async.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/async/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/.travis.yml create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/bool.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/boolean_double.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/boolean_single.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/default_hash.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/default_singles.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/divide.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/line_count.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/line_count_options.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/line_count_wrap.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/nonopt.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/reflect.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/short.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/string.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/usage-options.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/example/xup.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/index.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/.npmignore create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/README.markdown create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/center.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/meat.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/index.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/break.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/idleness.txt create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/wrap.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/readme.markdown create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/test/_.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/test/_/argv.js create mode 100755 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/test/_/bin.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/test/parse.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/optimist/test/usage.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/.npmignore create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/.travis.yml create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/Makefile.dryice.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/README.md create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/assert-shim.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/mini-require.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/prefix-source-map.jsm create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/prefix-utils.jsm create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/suffix-browser.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/suffix-source-map.jsm create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/suffix-utils.jsm create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/test-prefix.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/build/test-suffix.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/array-set.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64-vlq.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/binary-search.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-generator.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-node.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/lib/source-map/util.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/README.md create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/amdefine.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/intercept.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/package.json create mode 100755 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/run-tests.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-api.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-array-set.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64-vlq.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-binary-search.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-dog-fooding.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-generator.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-node.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/source-map/test/source-map/util.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/.npmignore create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/.travis.yml create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/LICENSE create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/README.md create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/index.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/node_modules/uglify-to-browserify/test/index.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/package.json create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/arrays.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/blocks.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/concat-strings.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/conditionals.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/dead-code.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/debugger.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/drop-unused.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-105.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-12.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-126.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-143.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-22.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-267.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-269.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-44.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/issue-59.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/labels.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/loops.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/negate-iife.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/properties.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/sequences.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/switch.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/compress/typeof.js create mode 100755 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/test/run-tests.js create mode 100644 node_modules/jade/node_modules/constantinople/node_modules/uglify-js/tools/node.js create mode 100644 node_modules/jade/node_modules/constantinople/package.json create mode 100644 node_modules/jade/node_modules/constantinople/test/index.js create mode 100644 node_modules/jade/node_modules/mkdirp/.npmignore create mode 100644 node_modules/jade/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/jade/node_modules/mkdirp/LICENSE create mode 100644 node_modules/jade/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/jade/node_modules/mkdirp/index.js create mode 100644 node_modules/jade/node_modules/mkdirp/package.json create mode 100644 node_modules/jade/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/jade/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/race.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/return.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/root.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/jade/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/jade/node_modules/monocle/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/README.md create mode 100644 node_modules/jade/node_modules/monocle/monocle.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/Readme.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/callback-api.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/grep.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/LICENCE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/examples/pretty.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/LICENCE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/Makefile create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/duplexer/test.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/LICENSE.APACHE2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/LICENSE.MIT create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/from/test/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/LICENCE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/examples/pretty.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/map-stream/test/simple-map.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/README.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/bool.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/boolean_double.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/boolean_single.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/default_hash.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/default_singles.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/divide.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/line_count.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/line_count_options.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/line_count_wrap.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/nonopt.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/reflect.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/short.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/string.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/usage-options.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/examples/xup.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/README.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/example/center.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/example/meat.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/test/break.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/test/idleness.txt create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/node_modules/wordwrap/test/wrap.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/test/_.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/test/_/argv.js create mode 100755 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/test/_/bin.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/test/parse.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/optimist/test/usage.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/test/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/pause-stream/test/pause-end.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/LICENCE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/examples/pretty.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/LICENSE.MIT create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/node_modules/through/test/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/split/test/split.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/LICENSE.MIT create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/test/buffering.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/test/end.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/node_modules/through/test/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/connect.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/merge.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/pause.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/pipeline.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/readArray.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/readable.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/replace.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/simple-map.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/spec.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/split.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/stringify.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/event-stream/test/writeArray.asynct.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/examples/tap-nested-objects.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/.travis.yml create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/LICENSE.MIT create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/readme.markdown create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/test/buffering.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/test/end.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/node_modules/through/test/index.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/node_modules/tap-stream/test/tap-stream.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/stream-api-pipe.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/examples/stream-api.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/minimatch.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/test/basic.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/test/caching.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/package.json create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/readdirp.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/stream-api.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir1/root_dir1_file1.ext1 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir1/root_dir1_file2.ext2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir1/root_dir1_file3.ext3 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir1/root_dir1_subdir1/root1_dir1_subdir1_file1.ext1 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir2/root_dir2_file1.ext1 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_dir2/root_dir2_file2.ext2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_file1.ext1 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_file2.ext2 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/bed/root_file3.ext3 create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/readdirp-stream.js create mode 100644 node_modules/jade/node_modules/monocle/node_modules/readdirp/test/readdirp.js create mode 100644 node_modules/jade/node_modules/monocle/package.json create mode 100644 node_modules/jade/node_modules/transformers/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/README.md create mode 100644 node_modules/jade/node_modules/transformers/history.md create mode 100644 node_modules/jade/node_modules/transformers/lib/shared.js create mode 100644 node_modules/jade/node_modules/transformers/lib/transformers.js create mode 120000 node_modules/jade/node_modules/transformers/node_modules/.bin/uglifyjs create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/History.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/Makefile create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/Readme.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/benchmark.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/component.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/History.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/Makefile create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/Readme.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/component.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-parse/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/History.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/Makefile create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/Readme.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/component.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/node_modules/css-stringify/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/css/test.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/Readme.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/node_modules/is-promise/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/node_modules/is-promise/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/node_modules/is-promise/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/node_modules/is-promise/readme.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/promise/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/README.md create mode 100755 node_modules/jade/node_modules/transformers/node_modules/uglify-js/bin/uglifyjs create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/ast.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/compress.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/mozilla-ast.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/output.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/parse.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/scope.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/sourcemap.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/transform.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/lib/utils.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/.travis.yml create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/LICENSE create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/bool.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/boolean_double.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/boolean_single.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/default_hash.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/default_singles.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/divide.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/line_count.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/line_count_options.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/line_count_wrap.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/nonopt.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/reflect.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/short.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/string.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/usage-options.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/example/xup.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/README.markdown create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/center.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/meat.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/index.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/break.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/idleness.txt create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/wrap.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/readme.markdown create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/test/_.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/test/_/argv.js create mode 100755 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/test/_/bin.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/test/parse.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/optimist/test/usage.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/.npmignore create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/.travis.yml create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/LICENSE create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/Makefile.dryice.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/README.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/assert-shim.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/mini-require.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/prefix-source-map.jsm create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/prefix-utils.jsm create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/suffix-browser.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/suffix-source-map.jsm create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/suffix-utils.jsm create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/test-prefix.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/build/test-suffix.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/array-set.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64-vlq.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/binary-search.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-generator.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-node.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/lib/source-map/util.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/LICENSE create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/README.md create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/amdefine.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/intercept.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/package.json create mode 100755 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/run-tests.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-api.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-array-set.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64-vlq.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-binary-search.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-dog-fooding.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-generator.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-node.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/node_modules/source-map/test/source-map/util.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/package.json create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/arrays.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/blocks.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/conditionals.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/dead-code.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/debugger.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/drop-unused.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/issue-105.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/issue-12.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/issue-22.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/issue-44.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/issue-59.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/labels.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/loops.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/properties.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/sequences.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/compress/switch.js create mode 100755 node_modules/jade/node_modules/transformers/node_modules/uglify-js/test/run-tests.js create mode 100644 node_modules/jade/node_modules/transformers/node_modules/uglify-js/tools/node.js create mode 100644 node_modules/jade/node_modules/transformers/package.json create mode 100644 node_modules/jade/node_modules/with/.npmignore create mode 100644 node_modules/jade/node_modules/with/LICENSE create mode 100644 node_modules/jade/node_modules/with/README.md create mode 100644 node_modules/jade/node_modules/with/index.js create mode 120000 node_modules/jade/node_modules/with/node_modules/.bin/uglifyjs create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/.npmignore create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/.travis.yml create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/README.md create mode 100755 node_modules/jade/node_modules/with/node_modules/uglify-js/bin/uglifyjs create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/ast.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/compress.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/mozilla-ast.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/output.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/parse.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/scope.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/sourcemap.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/transform.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/lib/utils.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/async/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/async/README.md create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/async/component.json create mode 100755 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/async/lib/async.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/async/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/.travis.yml create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/bool.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/boolean_double.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/boolean_single.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/default_hash.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/default_singles.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/divide.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/line_count.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/line_count_options.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/line_count_wrap.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/nonopt.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/reflect.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/short.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/string.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/usage-options.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/example/xup.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/index.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/.npmignore create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/README.markdown create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/center.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/meat.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/index.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/break.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/idleness.txt create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/wrap.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/readme.markdown create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/test/_.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/test/_/argv.js create mode 100755 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/test/_/bin.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/test/parse.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/optimist/test/usage.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/.npmignore create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/.travis.yml create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/Makefile.dryice.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/README.md create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/assert-shim.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/mini-require.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/prefix-source-map.jsm create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/prefix-utils.jsm create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/suffix-browser.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/suffix-source-map.jsm create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/suffix-utils.jsm create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/test-prefix.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/build/test-suffix.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/array-set.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64-vlq.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/binary-search.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-generator.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-node.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/lib/source-map/util.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/README.md create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/amdefine.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/intercept.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/package.json create mode 100755 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/run-tests.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-api.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-array-set.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64-vlq.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-binary-search.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-dog-fooding.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-generator.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-node.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/source-map/test/source-map/util.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/.npmignore create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/.travis.yml create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/LICENSE create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/README.md create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/index.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/node_modules/uglify-to-browserify/test/index.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/package.json create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/arrays.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/blocks.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/conditionals.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/dead-code.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/debugger.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/drop-unused.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-105.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-12.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-143.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-22.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-44.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/issue-59.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/labels.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/loops.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/negate-iife.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/properties.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/sequences.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/switch.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/test/compress/typeof.js create mode 100755 node_modules/jade/node_modules/with/node_modules/uglify-js/test/run-tests.js create mode 100644 node_modules/jade/node_modules/with/node_modules/uglify-js/tools/node.js create mode 100644 node_modules/jade/node_modules/with/package.json create mode 100644 node_modules/jade/node_modules/with/vars.js create mode 100644 node_modules/jade/package.json create mode 100644 node_modules/jade/runtime.js create mode 100644 node_modules/mocha/Readme.md create mode 100755 node_modules/mocha/bin/_mocha create mode 100755 node_modules/mocha/bin/mocha create mode 100644 node_modules/mocha/images/error.png create mode 100644 node_modules/mocha/images/ok.png create mode 100644 node_modules/mocha/index.js create mode 100644 node_modules/mocha/lib/browser/debug.js create mode 100644 node_modules/mocha/lib/browser/diff.js create mode 100644 node_modules/mocha/lib/browser/events.js create mode 100644 node_modules/mocha/lib/browser/fs.js create mode 100644 node_modules/mocha/lib/browser/path.js create mode 100644 node_modules/mocha/lib/browser/progress.js create mode 100644 node_modules/mocha/lib/browser/tty.js create mode 100644 node_modules/mocha/lib/context.js create mode 100644 node_modules/mocha/lib/hook.js create mode 100644 node_modules/mocha/lib/interfaces/bdd.js create mode 100644 node_modules/mocha/lib/interfaces/exports.js create mode 100644 node_modules/mocha/lib/interfaces/index.js create mode 100644 node_modules/mocha/lib/interfaces/qunit.js create mode 100644 node_modules/mocha/lib/interfaces/tdd.js create mode 100644 node_modules/mocha/lib/mocha.js create mode 100644 node_modules/mocha/lib/ms.js create mode 100644 node_modules/mocha/lib/reporters/base.js create mode 100644 node_modules/mocha/lib/reporters/doc.js create mode 100644 node_modules/mocha/lib/reporters/dot.js create mode 100644 node_modules/mocha/lib/reporters/html-cov.js create mode 100644 node_modules/mocha/lib/reporters/html.js create mode 100644 node_modules/mocha/lib/reporters/index.js create mode 100644 node_modules/mocha/lib/reporters/json-cov.js create mode 100644 node_modules/mocha/lib/reporters/json-stream.js create mode 100644 node_modules/mocha/lib/reporters/json.js create mode 100644 node_modules/mocha/lib/reporters/landing.js create mode 100644 node_modules/mocha/lib/reporters/list.js create mode 100644 node_modules/mocha/lib/reporters/markdown.js create mode 100644 node_modules/mocha/lib/reporters/min.js create mode 100644 node_modules/mocha/lib/reporters/nyan.js create mode 100644 node_modules/mocha/lib/reporters/progress.js create mode 100644 node_modules/mocha/lib/reporters/spec.js create mode 100644 node_modules/mocha/lib/reporters/tap.js create mode 100644 node_modules/mocha/lib/reporters/templates/coverage.jade create mode 100644 node_modules/mocha/lib/reporters/templates/menu.jade create mode 100644 node_modules/mocha/lib/reporters/templates/script.html create mode 100644 node_modules/mocha/lib/reporters/templates/style.html create mode 100644 node_modules/mocha/lib/reporters/xunit.js create mode 100644 node_modules/mocha/lib/runnable.js create mode 100644 node_modules/mocha/lib/runner.js create mode 100644 node_modules/mocha/lib/suite.js create mode 100644 node_modules/mocha/lib/template.html create mode 100644 node_modules/mocha/lib/test.js create mode 100644 node_modules/mocha/lib/utils.js create mode 100644 node_modules/mocha/mocha.css create mode 100644 node_modules/mocha/mocha.js create mode 120000 node_modules/mocha/node_modules/.bin/jade create mode 100644 node_modules/mocha/node_modules/commander/History.md create mode 100644 node_modules/mocha/node_modules/commander/Readme.md create mode 100644 node_modules/mocha/node_modules/commander/index.js create mode 100644 node_modules/mocha/node_modules/commander/package.json create mode 100644 node_modules/mocha/node_modules/debug/Readme.md create mode 100644 node_modules/mocha/node_modules/debug/debug.js create mode 100644 node_modules/mocha/node_modules/debug/index.js create mode 100644 node_modules/mocha/node_modules/debug/lib/debug.js create mode 100644 node_modules/mocha/node_modules/debug/package.json create mode 100644 node_modules/mocha/node_modules/diff/README.md create mode 100644 node_modules/mocha/node_modules/diff/diff.js create mode 100644 node_modules/mocha/node_modules/diff/package.json create mode 100644 node_modules/mocha/node_modules/glob/.npmignore create mode 100644 node_modules/mocha/node_modules/glob/.travis.yml create mode 100644 node_modules/mocha/node_modules/glob/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/README.md create mode 100644 node_modules/mocha/node_modules/glob/examples/g.js create mode 100644 node_modules/mocha/node_modules/glob/examples/usr-local.js create mode 100644 node_modules/mocha/node_modules/glob/glob.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/mocha/node_modules/glob/node_modules/inherits/test.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/mocha/node_modules/glob/package.json create mode 100644 node_modules/mocha/node_modules/glob/test/00-setup.js create mode 100644 node_modules/mocha/node_modules/glob/test/bash-comparison.js create mode 100644 node_modules/mocha/node_modules/glob/test/bash-results.json create mode 100644 node_modules/mocha/node_modules/glob/test/cwd-test.js create mode 100644 node_modules/mocha/node_modules/glob/test/globstar-match.js create mode 100644 node_modules/mocha/node_modules/glob/test/mark.js create mode 100644 node_modules/mocha/node_modules/glob/test/nocase-nomagic.js create mode 100644 node_modules/mocha/node_modules/glob/test/pause-resume.js create mode 100644 node_modules/mocha/node_modules/glob/test/root-nomount.js create mode 100644 node_modules/mocha/node_modules/glob/test/root.js create mode 100644 node_modules/mocha/node_modules/glob/test/stat.js create mode 100644 node_modules/mocha/node_modules/glob/test/zz-cleanup.js create mode 100644 node_modules/mocha/node_modules/growl/History.md create mode 100644 node_modules/mocha/node_modules/growl/Readme.md create mode 100644 node_modules/mocha/node_modules/growl/lib/growl.js create mode 100644 node_modules/mocha/node_modules/growl/package.json create mode 100644 node_modules/mocha/node_modules/growl/test.js create mode 100644 node_modules/mocha/node_modules/jade/.npmignore create mode 100644 node_modules/mocha/node_modules/jade/LICENSE create mode 100755 node_modules/mocha/node_modules/jade/bin/jade create mode 100644 node_modules/mocha/node_modules/jade/index.js create mode 100644 node_modules/mocha/node_modules/jade/jade.js create mode 100644 node_modules/mocha/node_modules/jade/jade.md create mode 100644 node_modules/mocha/node_modules/jade/jade.min.js create mode 100644 node_modules/mocha/node_modules/jade/lib/compiler.js create mode 100644 node_modules/mocha/node_modules/jade/lib/doctypes.js create mode 100644 node_modules/mocha/node_modules/jade/lib/filters.js create mode 100644 node_modules/mocha/node_modules/jade/lib/inline-tags.js create mode 100644 node_modules/mocha/node_modules/jade/lib/jade.js create mode 100644 node_modules/mocha/node_modules/jade/lib/lexer.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/attrs.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/block.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/case.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/code.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/comment.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/doctype.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/each.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/filter.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/index.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/literal.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/mixin.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/node.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/tag.js create mode 100644 node_modules/mocha/node_modules/jade/lib/nodes/text.js create mode 100644 node_modules/mocha/node_modules/jade/lib/parser.js create mode 100644 node_modules/mocha/node_modules/jade/lib/runtime.js create mode 100644 node_modules/mocha/node_modules/jade/lib/self-closing.js create mode 100644 node_modules/mocha/node_modules/jade/lib/utils.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/.npmignore create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/.travis.yml create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/History.md create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/Makefile create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/Readme.md create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/index.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/lib/commander.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/commander/package.json create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/mocha/node_modules/jade/package.json create mode 100644 node_modules/mocha/node_modules/jade/runtime.js create mode 100644 node_modules/mocha/node_modules/jade/runtime.min.js create mode 100644 node_modules/mocha/node_modules/jade/test.jade create mode 100644 node_modules/mocha/node_modules/jade/testing/head.jade create mode 100644 node_modules/mocha/node_modules/jade/testing/index.jade create mode 100644 node_modules/mocha/node_modules/jade/testing/index.js create mode 100644 node_modules/mocha/node_modules/jade/testing/layout.jade create mode 100644 node_modules/mocha/node_modules/jade/testing/user.jade create mode 100644 node_modules/mocha/node_modules/jade/testing/user.js create mode 100644 node_modules/mocha/node_modules/mkdirp/.npmignore create mode 100644 node_modules/mocha/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/mocha/node_modules/mkdirp/LICENSE create mode 100644 node_modules/mocha/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/mocha/node_modules/mkdirp/index.js create mode 100644 node_modules/mocha/node_modules/mkdirp/package.json create mode 100644 node_modules/mocha/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/mocha/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/race.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/return.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/root.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/mocha/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/mocha/package.json create mode 100644 node_modules/should/.idea/.name create mode 100644 node_modules/should/.idea/codeStyleSettings.xml create mode 100644 node_modules/should/.idea/encodings.xml create mode 100644 node_modules/should/.idea/inspectionProfiles/Project_Default.xml create mode 100644 node_modules/should/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 node_modules/should/.idea/jsLibraryMappings.xml create mode 100644 node_modules/should/.idea/jsLinters/jshint.xml create mode 100644 node_modules/should/.idea/libraries/Node_js_Dependencies_for_should_js.xml create mode 100644 node_modules/should/.idea/misc.xml create mode 100644 node_modules/should/.idea/modules.xml create mode 100644 node_modules/should/.idea/scopes/scope_settings.xml create mode 100644 node_modules/should/.idea/should.js.iml create mode 100644 node_modules/should/.idea/vcs.xml create mode 100644 node_modules/should/.idea/workspace.xml create mode 100644 node_modules/should/.npmignore create mode 100644 node_modules/should/History.md create mode 100644 node_modules/should/Makefile create mode 100644 node_modules/should/Readme.md create mode 100644 node_modules/should/index.js create mode 100644 node_modules/should/lib/browser.js create mode 100644 node_modules/should/lib/eql.js create mode 100644 node_modules/should/lib/ext/assert.js create mode 100644 node_modules/should/lib/ext/bool.js create mode 100644 node_modules/should/lib/ext/browser/jquery.js create mode 100644 node_modules/should/lib/ext/chain.js create mode 100644 node_modules/should/lib/ext/deprecated.js create mode 100644 node_modules/should/lib/ext/eql.js create mode 100644 node_modules/should/lib/ext/error.js create mode 100644 node_modules/should/lib/ext/http.js create mode 100644 node_modules/should/lib/ext/match.js create mode 100644 node_modules/should/lib/ext/number.js create mode 100644 node_modules/should/lib/ext/property.js create mode 100644 node_modules/should/lib/ext/string.js create mode 100644 node_modules/should/lib/ext/type.js create mode 100644 node_modules/should/lib/node.js create mode 100644 node_modules/should/lib/should.js create mode 100644 node_modules/should/lib/util.js create mode 100644 node_modules/should/package.json create mode 100644 node_modules/should/should.js create mode 100644 node_modules/should/should.js.for-tests create mode 100644 node_modules/should/should.min.js create mode 100644 package.json create mode 100644 pages/docs/docs.jade create mode 100644 pages/docs/docs.json create mode 100644 pages/document/display.jade create mode 100644 pages/document/document.jade create mode 100644 pages/layout.jade create mode 100644 pages/main/main.jade create mode 100644 pages/menu.jade create mode 100644 routers/doc.router.js create mode 100644 routers/route.js create mode 100644 server.js create mode 100644 view/docs.scss create mode 100644 view/document.scss create mode 100644 view/main.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..de0cb06f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +*.sublime* diff --git a/README.md b/README.md new file mode 100644 index 00000000..9a1d70b2 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# WWW.HUDOZKA.SU +THE SITE OF ART SCHOOL OF **SHLISSELBURG** +Visit [www.hudozka.su](www.hudozka.su) + +### Used technologies: +- node.js +- express.js +- jade template language + +## Contribute +- Roman Timashev [roman@tmshv.ru](mailto:roman@tmshv.ru) \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..9d4cd038 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,20 @@ +var gulp = require("gulp"); +var sass = require("gulp-sass"); +var minifyCSS = require("gulp-minify-css"); + +var pub = "~/Dropbox/Dev/Hud school/public/"; + +var list = []; +task("sass", function () { + gulp.src("./view/*.scss") + .pipe(sass()) + .pipe(minifyCSS()) + .pipe(gulp.dest(pub+"s")); +}); + +function task(name, f){ + list.push(name); + gulp.task(name, f); +} + +gulp.task("default", list); \ No newline at end of file diff --git a/node_modules/.bin/_mocha b/node_modules/.bin/_mocha new file mode 120000 index 00000000..f2a54ffd --- /dev/null +++ b/node_modules/.bin/_mocha @@ -0,0 +1 @@ +../mocha/bin/_mocha \ No newline at end of file diff --git a/node_modules/.bin/express b/node_modules/.bin/express new file mode 120000 index 00000000..b741d99c --- /dev/null +++ b/node_modules/.bin/express @@ -0,0 +1 @@ +../express/bin/express \ No newline at end of file diff --git a/node_modules/.bin/gulp b/node_modules/.bin/gulp new file mode 120000 index 00000000..5de73328 --- /dev/null +++ b/node_modules/.bin/gulp @@ -0,0 +1 @@ +../gulp/bin/gulp.js \ No newline at end of file diff --git a/node_modules/.bin/jade b/node_modules/.bin/jade new file mode 120000 index 00000000..65a3bac6 --- /dev/null +++ b/node_modules/.bin/jade @@ -0,0 +1 @@ +../jade/bin/jade.js \ No newline at end of file diff --git a/node_modules/.bin/mocha b/node_modules/.bin/mocha new file mode 120000 index 00000000..43c668d9 --- /dev/null +++ b/node_modules/.bin/mocha @@ -0,0 +1 @@ +../mocha/bin/mocha \ No newline at end of file diff --git a/node_modules/consolidate/.npmignore b/node_modules/consolidate/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/consolidate/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/consolidate/History.md b/node_modules/consolidate/History.md new file mode 100644 index 00000000..66908b31 --- /dev/null +++ b/node_modules/consolidate/History.md @@ -0,0 +1,86 @@ + +0.10.0 / 2013-11-23 +================== + + * add lodash support + * add nunjucks support + +0.9.1 / 2013-04-29 +================== + + * Update ECT version + * Added support for Handlebars helpers with test. + * Invalidates built-in dust cache if caching disabled + +0.9.0 / 2013-03-28 +================== + + * dust-helpers support, latest version of dust + * Re-add doT - global leaks fixed + * improving templayed support + +0.8.0 / 2013-01-23 +================== + + * add templayed support + * add `then-jade` as an alternative to `jade` + +0.7.0 / 2012-12-28 +================== + + * add atpl support + +0.6.0 2012-12-22 +================== + + * add partials support + * add support for toffee templates + * remove dot it still leaks and the author has not fixed it + +0.5.0 / 2012-10-29 +================== + + * add `mote` support + * add support to `dust` partials + * add support for `ECT` + * add support for rendering without file + * add support for `JUST` + * improve Haml-Coffee caching. + +0.4.0 / 2012-07-30 +================== + + * add doT support [sannis] + * add mustache support [ForbesLindesay] + * add walrus support [kagd] + +0.3.1 / 2012-06-28 +================== + + * add QEJS support + * add underscore support + * change whiskers to use pre-defined `.__express` + * remove engines. Closes #37 + * remove kernel, cannot comply with our caching + +0.3.0 / 2012-04-18 +================== + + * Added partials loading for whiskers [gsf] + * Added dustjs-linkedin support + +0.2.0 / 2012-04-04 +================== + + * Added support for dust [fatjonny] + * Added handlebars support [jstewmon] + +0.1.0 / 2012-01-03 +================== + + * Added support for several more engines + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/consolidate/Makefile b/node_modules/consolidate/Makefile new file mode 100644 index 00000000..2bc56b4c --- /dev/null +++ b/node_modules/consolidate/Makefile @@ -0,0 +1,9 @@ + +REPORTER = spec + +test: + @./node_modules/.bin/mocha \ + --slow 30 \ + --reporter $(REPORTER) + +.PHONY: test \ No newline at end of file diff --git a/node_modules/consolidate/Readme.md b/node_modules/consolidate/Readme.md new file mode 100644 index 00000000..d43647e1 --- /dev/null +++ b/node_modules/consolidate/Readme.md @@ -0,0 +1,155 @@ +# Consolidate.js + + Template engine consolidation library. + +## Installation + + $ npm install consolidate + +## Supported template engines + + - [atpl](https://github.com/soywiz/atpl.js) + - [dust](https://github.com/akdubya/dustjs) [(website)](http://akdubya.github.com/dustjs/) + - [eco](https://github.com/sstephenson/eco) + - [ect](https://github.com/baryshev/ect) [(website)](http://ectjs.com/) + - [ejs](https://github.com/visionmedia/ejs) + - [haml](https://github.com/visionmedia/haml.js) [(website)](http://haml-lang.com/) + - [haml-coffee](https://github.com/9elements/haml-coffee) [(website)](http://haml-lang.com/) + - [handlebars](https://github.com/wycats/handlebars.js/) [(website)](http://handlebarsjs.com/) + - [hogan](https://github.com/twitter/hogan.js) [(website)](http://twitter.github.com/hogan.js/) + - [jade](https://github.com/visionmedia/jade) [(website)](http://jade-lang.com/) + - [jazz](https://github.com/shinetech/jazz) + - [jqtpl](https://github.com/kof/node-jqtpl) [(website)](http://api.jquery.com/category/plugins/templates/) + - [JUST](https://github.com/baryshev/just) + - [liquor](https://github.com/chjj/liquor) + - [lodash](https://github.com/bestiejs/lodash) [(website)](http://lodash.com/) + - [mustache](https://github.com/janl/mustache.js) + - [QEJS](https://github.com/jepso/QEJS) + - [ractive](https://github.com/Rich-Harris/Ractive) + - [swig](https://github.com/paularmstrong/swig) [(website)](http://paularmstrong.github.com/swig/) + - [templayed](http://archan937.github.com/templayed.js/) + - [toffee](https://github.com/malgorithms/toffee) + - [underscore](https://github.com/documentcloud/underscore) [(website)](http://documentcloud.github.com/underscore/) + - [walrus](https://github.com/jeremyruppel/walrus) [(website)](http://documentup.com/jeremyruppel/walrus/) + - [whiskers](https://github.com/gsf/whiskers.js/tree/) + +__NOTE__: you must still install the engines you wish to use, add them to your package.json dependencies. + +## API + + All templates supported by this library may be rendered using the signature `(path[, locals], callback)` as shown below, which happens to be the signature that Express 3.x supports so any of these engines may be used within Express. + +__NOTE__: All this example code uses cons.swig for the swig template engine. Replace swig with whatever templating you are using. For example, use cons.hogan for hogan.js, cons.jade for jade, etc. `console.log(cons)` for the full list of identifiers. + +```js +var cons = require('consolidate'); +cons.swig('views/page.html', { user: 'tobi' }, function(err, html){ + if (err) throw err; + console.log(html); +}); +``` + + Or without options / local variables: + +```js +var cons = require('consolidate'); +cons.swig('views/page.html', function(err, html){ + if (err) throw err; + console.log(html); +}); +``` + + To dynamically pass the engine, simply use the subscript operator and a variable: + +```js +var cons = require('consolidate') + , name = 'swig'; + +cons[name]('views/page.html', { user: 'tobi' }, function(err, html){ + if (err) throw err; + console.log(html); +}); +``` + +## Caching + + To enable caching simply pass `{ cache: true }`. Engines _may_ use this option to cache things reading the file contents, compiled `Function`s etc. Engines which do _not_ support this may simply ignore it. All engines that consolidate.js implements I/O for will cache the file contents, ideal for production environments. + +```js +var cons = require('consolidate'); +cons.swig('views/page.html', { user: 'tobi' }, function(err, html){ + if (err) throw err; + console.log(html); +}); +``` + +## Express 3.x example + +```js +var express = require('express') + , cons = require('consolidate') + , app = express(); + +// assign the swig engine to .html files +app.engine('html', cons.swig); + +// set .html as the default extension +app.set('view engine', 'html'); +app.set('views', __dirname + '/views'); + +var users = []; +users.push({ name: 'tobi' }); +users.push({ name: 'loki' }); +users.push({ name: 'jane' }); + +app.get('/', function(req, res){ + res.render('index', { + title: 'Consolidate.js' + }); +}); + +app.get('/users', function(req, res){ + res.render('users', { + title: 'Users', + users: users + }); +}); + +app.listen(3000); +console.log('Express server listening on port 3000'); +``` + +## Running tests + + Install dev deps: + + $ npm install -d + + Run the tests: + + $ make test + +## License + +(The MIT License) + +Copyright (c) 2011 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/consolidate/index.js b/node_modules/consolidate/index.js new file mode 100644 index 00000000..4a0df174 --- /dev/null +++ b/node_modules/consolidate/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/consolidate'); \ No newline at end of file diff --git a/node_modules/consolidate/lib/consolidate.js b/node_modules/consolidate/lib/consolidate.js new file mode 100644 index 00000000..279b7f46 --- /dev/null +++ b/node_modules/consolidate/lib/consolidate.js @@ -0,0 +1,764 @@ +/*! + * consolidate + * Copyright(c) 2012 TJ Holowaychuk + * MIT Licensed + * + * Engines which do not support caching of their file contents + * should use the `read()` function defined in consolidate.js + * On top of this, when an engine compiles to a `Function`, + * these functions should either be cached within consolidate.js + * or the engine itself via `options.cache`. This will allow + * users and frameworks to pass `options.cache = true` for + * `NODE_ENV=production`, however edit the file(s) without + * re-loading the application in development. + */ + +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , join = path.join + , extname = path.extname + , dirname = path.dirname; + +var readCache = {}; + +/** + * Require cache. + */ + +var cacheStore = {}; + +/** + * Require cache. + */ + +var requires = {}; + +/** + * Clear the cache. + * + * @api public + */ + +exports.clearCache = function(){ + cacheStore = {}; +}; + +/** + * Conditionally cache `compiled` template based + * on the `options` filename and `.cache` boolean. + * + * @param {Object} options + * @param {Function} compiled + * @return {Function} + * @api private + */ + +function cache(options, compiled) { + // cachable + if (compiled && options.filename && options.cache) { + delete readCache[options.filename]; + cacheStore[options.filename] = compiled; + return compiled; + } + + // check cache + if (options.filename && options.cache) { + return cacheStore[options.filename]; + } + + return compiled; +} + +/** + * Read `path` with `options` with + * callback `(err, str)`. When `options.cache` + * is true the template string will be cached. + * + * @param {String} options + * @param {Function} fn + * @api private + */ + +function read(path, options, fn) { + var str = readCache[path]; + var cached = options.cache && str && 'string' == typeof str; + + // cached (only if cached is a string and not a compiled template function) + if (cached) return fn(null, str); + + // read + fs.readFile(path, 'utf8', function(err, str){ + if (err) return fn(err); + // remove extraneous utf8 BOM marker + str = str.replace(/^\uFEFF/, ''); + if (options.cache) readCache[path] = str; + fn(null, str); + }); +} + +/** + * Read `path` with `options` with + * callback `(err, str)`. When `options.cache` + * is true the partial string will be cached. + * + * @param {String} options + * @param {Function} fn + * @api private + */ + +function readPartials(path, options, fn) { + if (!options.partials) return fn(); + var partials = options.partials; + var keys = Object.keys(partials); + + function next(index) { + if (index == keys.length) return fn(null); + var key = keys[index]; + var file = join(dirname(path), partials[key] + extname(path)); + read(file, options, function(err, str){ + if (err) return fn(err); + options.partials[key] = str; + next(++index); + }); + } + + next(0); +} + +/** + * fromStringRenderer + */ + +function fromStringRenderer(name) { + return function(path, options, fn){ + options.filename = path; + readPartials(path, options, function (err) { + if (err) return fn(err); + if (cache(options)) { + exports[name].render('', options, fn); + } else { + read(path, options, function(err, str){ + if (err) return fn(err); + exports[name].render(str, options, fn); + }); + } + }); + }; +} + +/** + * Jade support. + */ + +exports.jade = function(path, options, fn){ + var engine = requires.jade; + if (!engine) { + try { + engine = requires.jade = require('jade'); + } catch (err) { + engine = requires.jade = require('then-jade'); + } + } + engine.renderFile(path, options, fn); +}; + +/** + * Jade string support. + */ + +exports.jade.render = function(str, options, fn){ + var engine = requires.jade; + if (!engine) { + try { + engine = requires.jade = require('jade'); + } catch (err) { + engine = requires.jade = require('then-jade'); + } + } + engine.render(str, options, fn); +}; + +/** + * Dust support. + */ + +exports.dust = fromStringRenderer('dust'); + +/** + * Dust string support. + */ + +exports.dust.render = function(str, options, fn){ + var engine = requires.dust; + if (!engine) { + try { + engine = requires.dust = require('dust'); + } catch (err) { + try { + engine = requires.dust = require('dustjs-helpers'); + } catch (err) { + engine = requires.dust = require('dustjs-linkedin'); + } + } + } + + var ext = 'dust' + , views = '.'; + + if (options) { + if (options.ext) ext = options.ext; + if (options.views) views = options.views; + if (options.settings && options.settings.views) views = options.settings.views; + } + if (!options || (options && !options.cache)) engine.cache = {}; + + engine.onLoad = function(path, callback){ + if ('' == extname(path)) path += '.' + ext; + if ('/' !== path[0]) path = views + '/' + path; + read(path, options, callback); + }; + + try { + var tmpl = cache(options) || cache(options, engine.compileFn(str)); + tmpl(options, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Swig support. + */ + +exports.swig = fromStringRenderer('swig'); + +/** + * Swig string support. + */ + +exports.swig.render = function(str, options, fn){ + var engine = requires.swig || (requires.swig = require('swig')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Atpl support. + */ + +exports.atpl = fromStringRenderer('atpl'); + +/** + * Atpl string support. + */ + +exports.atpl.render = function(str, options, fn){ + var engine = requires.atpl || (requires.atpl = require('atpl')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Liquor support, + */ + +exports.liquor = fromStringRenderer('liquor'); + +/** + * Liquor string support. + */ + +exports.liquor.render = function(str, options, fn){ + var engine = requires.liquor || (requires.liquor = require('liquor')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * EJS support. + */ + +exports.ejs = fromStringRenderer('ejs'); + +/** + * EJS string support. + */ + +exports.ejs.render = function(str, options, fn){ + var engine = requires.ejs || (requires.ejs = require('ejs')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + + +/** + * Eco support. + */ + +exports.eco = fromStringRenderer('eco'); + +/** + * Eco string support. + */ + +exports.eco.render = function(str, options, fn){ + var engine = requires.eco || (requires.eco = require('eco')); + try { + fn(null, engine.render(str, options)); + } catch (err) { + fn(err); + } +}; + +/** + * Jazz support. + */ + +exports.jazz = fromStringRenderer('jazz'); + +/** + * Jazz string support. + */ + +exports.jazz.render = function(str, options, fn){ + var engine = requires.jazz || (requires.jazz = require('jazz')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + tmpl.eval(options, function(str){ + fn(null, str); + }); + } catch (err) { + fn(err); + } +}; + +/** + * JQTPL support. + */ + +exports.jqtpl = fromStringRenderer('jqtpl'); + +/** + * JQTPL string support. + */ + +exports.jqtpl.render = function(str, options, fn){ + var engine = requires.jqtpl || (requires.jqtpl = require('jqtpl')); + try { + engine.template(str, str); + fn(null, engine.tmpl(str, options)); + } catch (err) { + fn(err); + } +}; + +/** + * Haml support. + */ + +exports.haml = fromStringRenderer('haml'); + +/** + * Haml string support. + */ + +exports.haml.render = function(str, options, fn){ + var engine = requires.hamljs || (requires.hamljs = require('hamljs')); + try { + options.locals = options; + fn(null, engine.render(str, options).trimLeft()); + } catch (err) { + fn(err); + } +}; + +/** + * Whiskers support. + */ + +exports.whiskers = function(path, options, fn){ + var engine = requires.whiskers || (requires.whiskers = require('whiskers')); + engine.__express(path, options, fn); +}; + +/** + * Whiskers string support. + */ + +exports.whiskers.render = function(str, options, fn){ + var engine = requires.whiskers || (requires.whiskers = require('whiskers')); + try { + fn(null, engine.render(str, options)); + } catch (err) { + fn(err); + } +}; + +/** + * Coffee-HAML support. + */ + +exports['haml-coffee'] = fromStringRenderer('haml-coffee'); + +/** + * Coffee-HAML string support. + */ + +exports['haml-coffee'].render = function(str, options, fn){ + var engine = requires.HAMLCoffee || (requires.HAMLCoffee = require('haml-coffee')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Hogan support. + */ + +exports.hogan = fromStringRenderer('hogan'); + +/** + * Hogan string support. + */ + +exports.hogan.render = function(str, options, fn){ + var engine = requires.hogan || (requires.hogan = require('hogan.js')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl.render(options, options.partials)); + } catch (err) { + fn(err); + } +}; + +/** + * templayed.js support. + */ + +exports.templayed = fromStringRenderer('templayed'); + +/** + * templayed.js string support. + */ + +exports.templayed.render = function(str, options, fn){ + var engine = requires.templayed || (requires.templayed = require('templayed')); + try { + var tmpl = cache(options) || cache(options, engine(str)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Handlebars support. + */ + +exports.handlebars = fromStringRenderer('handlebars'); + +/** + * Handlebars string support. + */ + +exports.handlebars.render = function(str, options, fn) { + var engine = requires.handlebars || (requires.handlebars = require('handlebars')); + try { + for (var partial in options.partials) { + engine.registerPartial(partial, options.partials[partial]); + } + for (var helper in options.helpers) { + engine.registerHelper(helper, options.helpers[helper]); + } + var tmpl = cache(options) || cache(options, engine.compile(str, options)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +} + +/** + * Underscore support. + */ + +exports.underscore = fromStringRenderer('underscore'); + +/** + * Underscore string support. + */ + +exports.underscore.render = function(str, options, fn) { + var engine = requires.underscore || (requires.underscore = require('underscore')); + try { + var tmpl = cache(options) || cache(options, engine.template(str, null, options)); + fn(null, tmpl(options).replace(/\n$/, '')); + } catch (err) { + fn(err); + } +}; + + +/** + * Lodash support. + */ + +exports.lodash = fromStringRenderer('lodash'); + +/** + * Lodash string support. + */ + +exports.lodash.render = function(str, options, fn) { + var engine = requires.lodash || (requires.lodash = require('lodash')); + try { + var tmpl = cache(options) || cache(options, engine.template(str, null, options)); + fn(null, tmpl(options).replace(/\n$/, '')); + } catch (err) { + fn(err); + } +}; + + +/** + * QEJS support. + */ + +exports.qejs = function (path, options, fn) { + try { + var engine = requires.qejs || (requires.qejs = require('qejs')); + engine.renderFile(path, options).nodeify(fn); + } catch (err) { + fn(err); + } +}; + +/** + * QEJS string support. + */ + +exports.qejs.render = function (str, options, fn) { + try { + var engine = requires.qejs || (requires.qejs = require('qejs')); + engine.render(str, options).then(function (result) { + fn(null, result); + }, function (err) { + fn(err); + }).end(); + } catch (err) { + fn(err); + } +}; + + +/** + * Walrus support. + */ + +exports.walrus = fromStringRenderer('walrus'); + +/** + * Walrus string support. + */ + +exports.walrus.render = function (str, options, fn) { + var engine = requires.walrus || (requires.walrus = require('walrus')); + try { + var tmpl = cache(options) || cache(options, engine.parse(str)); + fn(null, tmpl.compile(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Mustache support. + */ + +exports.mustache = fromStringRenderer('mustache'); + +/** + * Mustache string support. + */ + +exports.mustache.render = function(str, options, fn) { + var engine = requires.mustache || (requires.mustache = require('mustache')); + try { + fn(null, engine.to_html(str, options, options.partials)); + } catch (err) { + fn(err); + } +}; + +/** + * Just support. + */ + +exports.just = function(path, options, fn){ + var engine = requires.just; + if (!engine) { + var JUST = require('just'); + engine = requires.just = new JUST(); + } + engine.configure({ useCache: options.cache }); + engine.render(path, options, fn); +}; + +/** + * Just string support. + */ + +exports.just.render = function(str, options, fn){ + var JUST = require('just'); + var engine = new JUST({ root: { page: str }}); + engine.render('page', options, fn); +}; + +/** + * ECT support. + */ + +exports.ect = function(path, options, fn){ + var engine = requires.ect; + if (!engine) { + var ECT = require('ect'); + engine = requires.ect = new ECT(); + } + engine.configure({ cache: options.cache }); + engine.render(path, options, fn); +}; + +/** + * ECT string support. + */ + +exports.ect.render = function(str, options, fn){ + var ECT = require('ect'); + var engine = new ECT({ root: { page: str }}); + engine.render('page', options, fn); +}; + +/** + * mote support. + */ + +exports.mote = fromStringRenderer('mote'); + +/** + * mote string support. + */ + +exports.mote.render = function(str, options, fn){ + var engine = requires.mote || (requires.mote = require('mote')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Toffee support. + */ + +exports.toffee = function(path, options, fn){ + var toffee = requires.toffee || (requires.toffee = require('toffee')); + toffee.__consolidate_engine_render(path, options, fn); +}; + +/** + * Toffee string support. + */ + +exports.toffee.render = function(str, options, fn) { + var engine = requires.toffee || (requires.toffee = require('toffee')); + try { + engine.str_render(str, options,fn); + } catch (err) { + fn(err); + } +}; + +/** + * doT support. + */ + +exports.dot = fromStringRenderer('dot'); + +/** + * doT string support. + */ + +exports.dot.render = function (str, options, fn) { + var engine = requires.dot || (requires.dot = require('dot')); + try { + var tmpl = cache(options) || cache(options, engine.compile(str, options && options._def)); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Ractive support. + */ + +exports.ractive = fromStringRenderer('ractive'); + +/** + * Ractive string support. + */ + +exports.ractive.render = function(str, options, fn){ + var engine = requires.ractive || (requires.ractive = require('ractive')); + + options.template = str; + if (options.data === null || options.data === undefined) + { + options.data = options; + } + + try { + fn(null, new engine(options).renderHTML()); + } catch (err) { + fn(err); + } +}; + +/** + * Nunjucks support. + */ + +exports.nunjucks = fromStringRenderer('nunjucks'); + +/** + * Nunjucks string support. + */ + +exports.nunjucks.render = function(str, options, fn) { + var engine = requires.nunjucks || (requires.nunjucks = require('nunjucks')); + engine.renderString(str, options, fn); +}; diff --git a/node_modules/consolidate/package.json b/node_modules/consolidate/package.json new file mode 100644 index 00000000..2923fe14 --- /dev/null +++ b/node_modules/consolidate/package.json @@ -0,0 +1,67 @@ +{ + "name": "consolidate", + "version": "0.10.0", + "description": "Template engine consolidation library", + "keywords": [ + "template", + "engine", + "view" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "devDependencies": { + "mocha": "*", + "should": "*", + "jade": "0.26.0", + "ejs": "0.7.1", + "eco": "1.1.0-rc-3", + "swig": "0.12.0", + "jazz": "0.0.18", + "jqtpl": "1.1.0", + "liquor": "0.0.4", + "lodash": "1.2.0", + "hamljs": "0.6.1", + "whiskers": "0.2.2", + "haml-coffee": "1.4.0", + "hogan.js": "2.0.0", + "dust": "0.3.0", + "dustjs-linkedin": "1.2", + "dustjs-helpers": "1.1.1", + "handlebars": "1.0.7", + "underscore": "1.3.3", + "qejs": "0.0.1", + "walrus": "0.9.0", + "mustache": "0.4.0", + "just": "0.1.8", + "ect": "0.3.5", + "mote": "0.2.0", + "toffee": "0.0.52", + "atpl": ">=0.5.5", + "templayed": ">=0.2.3", + "dot": "1.0.1", + "ractive": "0.3.7", + "nunjucks": "~1.0.0" + }, + "main": "index", + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/consolidate.js.git" + }, + "scripts": { + "test": "mocha" + }, + "readme": "# Consolidate.js\n\n Template engine consolidation library.\n\n## Installation\n\n $ npm install consolidate\n\n## Supported template engines\n\n - [atpl](https://github.com/soywiz/atpl.js)\n - [dust](https://github.com/akdubya/dustjs) [(website)](http://akdubya.github.com/dustjs/)\n - [eco](https://github.com/sstephenson/eco)\n - [ect](https://github.com/baryshev/ect) [(website)](http://ectjs.com/)\n - [ejs](https://github.com/visionmedia/ejs)\n - [haml](https://github.com/visionmedia/haml.js) [(website)](http://haml-lang.com/)\n - [haml-coffee](https://github.com/9elements/haml-coffee) [(website)](http://haml-lang.com/)\n - [handlebars](https://github.com/wycats/handlebars.js/) [(website)](http://handlebarsjs.com/)\n - [hogan](https://github.com/twitter/hogan.js) [(website)](http://twitter.github.com/hogan.js/)\n - [jade](https://github.com/visionmedia/jade) [(website)](http://jade-lang.com/)\n - [jazz](https://github.com/shinetech/jazz)\n - [jqtpl](https://github.com/kof/node-jqtpl) [(website)](http://api.jquery.com/category/plugins/templates/)\n - [JUST](https://github.com/baryshev/just)\n - [liquor](https://github.com/chjj/liquor)\n - [lodash](https://github.com/bestiejs/lodash) [(website)](http://lodash.com/)\n - [mustache](https://github.com/janl/mustache.js)\n - [QEJS](https://github.com/jepso/QEJS)\n - [ractive](https://github.com/Rich-Harris/Ractive)\n - [swig](https://github.com/paularmstrong/swig) [(website)](http://paularmstrong.github.com/swig/)\n - [templayed](http://archan937.github.com/templayed.js/)\n - [toffee](https://github.com/malgorithms/toffee)\n - [underscore](https://github.com/documentcloud/underscore) [(website)](http://documentcloud.github.com/underscore/)\n - [walrus](https://github.com/jeremyruppel/walrus) [(website)](http://documentup.com/jeremyruppel/walrus/)\n - [whiskers](https://github.com/gsf/whiskers.js/tree/)\n\n__NOTE__: you must still install the engines you wish to use, add them to your package.json dependencies.\n\n## API\n\n All templates supported by this library may be rendered using the signature `(path[, locals], callback)` as shown below, which happens to be the signature that Express 3.x supports so any of these engines may be used within Express.\n\n__NOTE__: All this example code uses cons.swig for the swig template engine. Replace swig with whatever templating you are using. For example, use cons.hogan for hogan.js, cons.jade for jade, etc. `console.log(cons)` for the full list of identifiers.\n\n```js\nvar cons = require('consolidate');\ncons.swig('views/page.html', { user: 'tobi' }, function(err, html){\n if (err) throw err;\n console.log(html);\n});\n```\n\n Or without options / local variables:\n\n```js\nvar cons = require('consolidate');\ncons.swig('views/page.html', function(err, html){\n if (err) throw err;\n console.log(html);\n});\n```\n\n To dynamically pass the engine, simply use the subscript operator and a variable:\n\n```js\nvar cons = require('consolidate')\n , name = 'swig';\n\ncons[name]('views/page.html', { user: 'tobi' }, function(err, html){\n if (err) throw err;\n console.log(html);\n});\n```\n\n## Caching\n\n To enable caching simply pass `{ cache: true }`. Engines _may_ use this option to cache things reading the file contents, compiled `Function`s etc. Engines which do _not_ support this may simply ignore it. All engines that consolidate.js implements I/O for will cache the file contents, ideal for production environments.\n\n```js\nvar cons = require('consolidate');\ncons.swig('views/page.html', { user: 'tobi' }, function(err, html){\n if (err) throw err;\n console.log(html);\n});\n```\n\n## Express 3.x example\n\n```js\nvar express = require('express')\n , cons = require('consolidate')\n , app = express();\n\n// assign the swig engine to .html files\napp.engine('html', cons.swig);\n\n// set .html as the default extension \napp.set('view engine', 'html');\napp.set('views', __dirname + '/views');\n\nvar users = [];\nusers.push({ name: 'tobi' });\nusers.push({ name: 'loki' });\nusers.push({ name: 'jane' });\n\napp.get('/', function(req, res){\n res.render('index', {\n title: 'Consolidate.js'\n });\n});\n\napp.get('/users', function(req, res){\n res.render('users', {\n title: 'Users',\n users: users\n });\n});\n\napp.listen(3000);\nconsole.log('Express server listening on port 3000');\n```\n\n## Running tests\n\n Install dev deps:\n \n $ npm install -d\n\n Run the tests:\n\n $ make test\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/consolidate.js/issues" + }, + "homepage": "https://github.com/visionmedia/consolidate.js", + "_id": "consolidate@0.10.0", + "dist": { + "shasum": "81f1a6ceba1247df9cef7a261ce527c2ce538f7a" + }, + "_from": "consolidate@", + "_resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.10.0.tgz" +} diff --git a/node_modules/express/.npmignore b/node_modules/express/.npmignore new file mode 100644 index 00000000..caf574de --- /dev/null +++ b/node_modules/express/.npmignore @@ -0,0 +1,9 @@ +.git* +docs/ +examples/ +support/ +test/ +testing.js +.DS_Store +coverage.html +lib-cov diff --git a/node_modules/express/.travis.yml b/node_modules/express/.travis.yml new file mode 100644 index 00000000..a12e3f0f --- /dev/null +++ b/node_modules/express/.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/express/History.md b/node_modules/express/History.md new file mode 100644 index 00000000..9d53bef4 --- /dev/null +++ b/node_modules/express/History.md @@ -0,0 +1,1274 @@ +4.0.0 / +================== + + * remove: + - express(1) - moved to [express-generator](https://github.com/expressjs/generator) + - `req.accepted*` - use `req.accepts*()` instead + - `app.configure` - use logic in your own app code + * change: + - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` + - `req.params` is now an object instead of an array + - `json spaces` no longer enabled by default in development + * refactor: + - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) + - `req.is` with [type-is](https://github.com/expressjs/type-is) + +3.4.8 / 2014-01-13 +================== + + * prevent incorrect automatic OPTIONS responses #1868 @dpatti + * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi + * throw 400 in case of malformed paths @rlidwka + +3.4.7 / 2013-12-10 +================== + + * update connect + +3.4.6 / 2013-12-01 +================== + + * update connect (raw-body) + +3.4.5 / 2013-11-27 +================== + + * update connect + * res.location: remove leading ./ #1802 @kapouer + * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra + * res.send: always send ETag when content-length > 0 + * router: add Router.all() method + +3.4.4 / 2013-10-29 +================== + + * update connect + * update supertest + * update methods + * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 + +3.4.3 / 2013-10-23 +================== + + * update connect + +3.4.2 / 2013-10-18 +================== + + * update connect + * downgrade commander + +3.4.1 / 2013-10-15 +================== + + * update connect + * update commander + * jsonp: check if callback is a function + * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) + * res.format: now includes chraset @1747 (@sorribas) + * res.links: allow multiple calls @1746 (@sorribas) + +3.4.0 / 2013-09-07 +================== + + * add res.vary(). Closes #1682 + * update connect + +3.3.8 / 2013-09-02 +================== + + * update connect + +3.3.7 / 2013-08-28 +================== + + * update connect + +3.3.6 / 2013-08-27 +================== + + * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) + * add: req.accepts take an argument list + +3.3.4 / 2013-07-08 +================== + + * update send and connect + +3.3.3 / 2013-07-04 +================== + + * update connect + +3.3.2 / 2013-07-03 +================== + + * update connect + * update send + * remove .version export + +3.3.1 / 2013-06-27 +================== + + * update connect + +3.3.0 / 2013-06-26 +================== + + * update connect + * add support for multiple X-Forwarded-Proto values. Closes #1646 + * change: remove charset from json responses. Closes #1631 + * change: return actual booleans from req.accept* functions + * fix jsonp callback array throw + +3.2.6 / 2013-06-02 +================== + + * update connect + +3.2.5 / 2013-05-21 +================== + + * update connect + * update node-cookie + * add: throw a meaningful error when there is no default engine + * change generation of ETags with res.send() to GET requests only. Closes #1619 + +3.2.4 / 2013-05-09 +================== + + * fix `req.subdomains` when no Host is present + * fix `req.host` when no Host is present, return undefined + +3.2.3 / 2013-05-07 +================== + + * update connect / qs + +3.2.2 / 2013-05-03 +================== + + * update qs + +3.2.1 / 2013-04-29 +================== + + * add app.VERB() paths array deprecation warning + * update connect + * update qs and remove all ~ semver crap + * fix: accept number as value of Signed Cookie + +3.2.0 / 2013-04-15 +================== + + * add "view" constructor setting to override view behaviour + * add req.acceptsEncoding(name) + * add req.acceptedEncodings + * revert cookie signature change causing session race conditions + * fix sorting of Accept values of the same quality + +3.1.2 / 2013-04-12 +================== + + * add support for custom Accept parameters + * update cookie-signature + +3.1.1 / 2013-04-01 +================== + + * add X-Forwarded-Host support to `req.host` + * fix relative redirects + * update mkdirp + * update buffer-crc32 + * remove legacy app.configure() method from app template. + +3.1.0 / 2013-01-25 +================== + + * add support for leading "." in "view engine" setting + * add array support to `res.set()` + * add node 0.8.x to travis.yml + * add "subdomain offset" setting for tweaking `req.subdomains` + * add `res.location(url)` implementing `res.redirect()`-like setting of Location + * use app.get() for x-powered-by setting for inheritance + * fix colons in passwords for `req.auth` + +3.0.6 / 2013-01-04 +================== + + * add http verb methods to Router + * update connect + * fix mangling of the `res.cookie()` options object + * fix jsonp whitespace escape. Closes #1132 + +3.0.5 / 2012-12-19 +================== + + * add throwing when a non-function is passed to a route + * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses + * revert "add 'etag' option" + +3.0.4 / 2012-12-05 +================== + + * add 'etag' option to disable `res.send()` Etags + * add escaping of urls in text/plain in `res.redirect()` + for old browsers interpreting as html + * change crc32 module for a more liberal license + * update connect + +3.0.3 / 2012-11-13 +================== + + * update connect + * update cookie module + * fix cookie max-age + +3.0.2 / 2012-11-08 +================== + + * add OPTIONS to cors example. Closes #1398 + * fix route chaining regression. Closes #1397 + +3.0.1 / 2012-11-01 +================== + + * update connect + +3.0.0 / 2012-10-23 +================== + + * add `make clean` + * add "Basic" check to req.auth + * add `req.auth` test coverage + * add cb && cb(payload) to `res.jsonp()`. Closes #1374 + * add backwards compat for `res.redirect()` status. Closes #1336 + * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 + * update connect + * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 + * remove non-primitive string support for `res.send()` + * fix view-locals example. Closes #1370 + * fix route-separation example + +3.0.0rc5 / 2012-09-18 +================== + + * update connect + * add redis search example + * add static-files example + * add "x-powered-by" setting (`app.disable('x-powered-by')`) + * add "application/octet-stream" redirect Accept test case. Closes #1317 + +3.0.0rc4 / 2012-08-30 +================== + + * add `res.jsonp()`. Closes #1307 + * add "verbose errors" option to error-pages example + * add another route example to express(1) so people are not so confused + * add redis online user activity tracking example + * update connect dep + * fix etag quoting. Closes #1310 + * fix error-pages 404 status + * fix jsonp callback char restrictions + * remove old OPTIONS default response + +3.0.0rc3 / 2012-08-13 +================== + + * update connect dep + * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] + * fix `res.render()` clobbering of "locals" + +3.0.0rc2 / 2012-08-03 +================== + + * add CORS example + * update connect dep + * deprecate `.createServer()` & remove old stale examples + * fix: escape `res.redirect()` link + * fix vhost example + +3.0.0rc1 / 2012-07-24 +================== + + * add more examples to view-locals + * add scheme-relative redirects (`res.redirect("//foo.com")`) support + * update cookie dep + * update connect dep + * update send dep + * fix `express(1)` -h flag, use -H for hogan. Closes #1245 + * fix `res.sendfile()` socket error handling regression + +3.0.0beta7 / 2012-07-16 +================== + + * update connect dep for `send()` root normalization regression + +3.0.0beta6 / 2012-07-13 +================== + + * add `err.view` property for view errors. Closes #1226 + * add "jsonp callback name" setting + * add support for "/foo/:bar*" non-greedy matches + * change `res.sendfile()` to use `send()` module + * change `res.send` to use "response-send" module + * remove `app.locals.use` and `res.locals.use`, use regular middleware + +3.0.0beta5 / 2012-07-03 +================== + + * add "make check" support + * add route-map example + * add `res.json(obj, status)` support back for BC + * add "methods" dep, remove internal methods module + * update connect dep + * update auth example to utilize cores pbkdf2 + * updated tests to use "supertest" + +3.0.0beta4 / 2012-06-25 +================== + + * Added `req.auth` + * Added `req.range(size)` + * Added `res.links(obj)` + * Added `res.send(body, status)` support back for backwards compat + * Added `.default()` support to `res.format()` + * Added 2xx / 304 check to `req.fresh` + * Revert "Added + support to the router" + * Fixed `res.send()` freshness check, respect res.statusCode + +3.0.0beta3 / 2012-06-15 +================== + + * Added hogan `--hjs` to express(1) [nullfirm] + * Added another example to content-negotiation + * Added `fresh` dep + * Changed: `res.send()` always checks freshness + * Fixed: expose connects mime module. Cloases #1165 + +3.0.0beta2 / 2012-06-06 +================== + + * Added `+` support to the router + * Added `req.host` + * Changed `req.param()` to check route first + * Update connect dep + +3.0.0beta1 / 2012-06-01 +================== + + * Added `res.format()` callback to override default 406 behaviour + * Fixed `res.redirect()` 406. Closes #1154 + +3.0.0alpha5 / 2012-05-30 +================== + + * Added `req.ip` + * Added `{ signed: true }` option to `res.cookie()` + * Removed `res.signedCookie()` + * Changed: dont reverse `req.ips` + * Fixed "trust proxy" setting check for `req.ips` + +3.0.0alpha4 / 2012-05-09 +================== + + * Added: allow `[]` in jsonp callback. Closes #1128 + * Added `PORT` env var support in generated template. Closes #1118 [benatkin] + * Updated: connect 2.2.2 + +3.0.0alpha3 / 2012-05-04 +================== + + * Added public `app.routes`. Closes #887 + * Added _view-locals_ example + * Added _mvc_ example + * Added `res.locals.use()`. Closes #1120 + * Added conditional-GET support to `res.send()` + * Added: coerce `res.set()` values to strings + * Changed: moved `static()` in generated apps below router + * Changed: `res.send()` only set ETag when not previously set + * Changed connect 2.2.1 dep + * Changed: `make test` now runs unit / acceptance tests + * Fixed req/res proto inheritance + +3.0.0alpha2 / 2012-04-26 +================== + + * Added `make benchmark` back + * Added `res.send()` support for `String` objects + * Added client-side data exposing example + * Added `res.header()` and `req.header()` aliases for BC + * Added `express.createServer()` for BC + * Perf: memoize parsed urls + * Perf: connect 2.2.0 dep + * Changed: make `expressInit()` middleware self-aware + * Fixed: use app.get() for all core settings + * Fixed redis session example + * Fixed session example. Closes #1105 + * Fixed generated express dep. Closes #1078 + +3.0.0alpha1 / 2012-04-15 +================== + + * Added `app.locals.use(callback)` + * Added `app.locals` object + * Added `app.locals(obj)` + * Added `res.locals` object + * Added `res.locals(obj)` + * Added `res.format()` for content-negotiation + * Added `app.engine()` + * Added `res.cookie()` JSON cookie support + * Added "trust proxy" setting + * Added `req.subdomains` + * Added `req.protocol` + * Added `req.secure` + * Added `req.path` + * Added `req.ips` + * Added `req.fresh` + * Added `req.stale` + * Added comma-delmited / array support for `req.accepts()` + * Added debug instrumentation + * Added `res.set(obj)` + * Added `res.set(field, value)` + * Added `res.get(field)` + * Added `app.get(setting)`. Closes #842 + * Added `req.acceptsLanguage()` + * Added `req.acceptsCharset()` + * Added `req.accepted` + * Added `req.acceptedLanguages` + * Added `req.acceptedCharsets` + * Added "json replacer" setting + * Added "json spaces" setting + * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 + * Added `--less` support to express(1) + * Added `express.response` prototype + * Added `express.request` prototype + * Added `express.application` prototype + * Added `app.path()` + * Added `app.render()` + * Added `res.type()` to replace `res.contentType()` + * Changed: `res.redirect()` to add relative support + * Changed: enable "jsonp callback" by default + * Changed: renamed "case sensitive routes" to "case sensitive routing" + * Rewrite of all tests with mocha + * Removed "root" setting + * Removed `res.redirect('home')` support + * Removed `req.notify()` + * Removed `app.register()` + * Removed `app.redirect()` + * Removed `app.is()` + * Removed `app.helpers()` + * Removed `app.dynamicHelpers()` + * Fixed `res.sendfile()` with non-GET. Closes #723 + * Fixed express(1) public dir for windows. Closes #866 + +2.5.9/ 2012-04-02 +================== + + * Added support for PURGE request method [pbuyle] + * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] + +2.5.8 / 2012-02-08 +================== + + * Update mkdirp dep. Closes #991 + +2.5.7 / 2012-02-06 +================== + + * Fixed `app.all` duplicate DELETE requests [mscdex] + +2.5.6 / 2012-01-13 +================== + + * Updated hamljs dev dep. Closes #953 + +2.5.5 / 2012-01-08 +================== + + * Fixed: set `filename` on cached templates [matthewleon] + +2.5.4 / 2012-01-02 +================== + + * Fixed `express(1)` eol on 0.4.x. Closes #947 + +2.5.3 / 2011-12-30 +================== + + * Fixed `req.is()` when a charset is present + +2.5.2 / 2011-12-10 +================== + + * Fixed: express(1) LF -> CRLF for windows + +2.5.1 / 2011-11-17 +================== + + * Changed: updated connect to 1.8.x + * Removed sass.js support from express(1) + +2.5.0 / 2011-10-24 +================== + + * Added ./routes dir for generated app by default + * Added npm install reminder to express(1) app gen + * Added 0.5.x support + * Removed `make test-cov` since it wont work with node 0.5.x + * Fixed express(1) public dir for windows. Closes #866 + +2.4.7 / 2011-10-05 +================== + + * Added mkdirp to express(1). Closes #795 + * Added simple _json-config_ example + * Added shorthand for the parsed request's pathname via `req.path` + * Changed connect dep to 1.7.x to fix npm issue... + * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] + * Fixed `req.flash()`, only escape args + * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] + +2.4.6 / 2011-08-22 +================== + + * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] + +2.4.5 / 2011-08-19 +================== + + * Added support for routes to handle errors. Closes #809 + * Added `app.routes.all()`. Closes #803 + * Added "basepath" setting to work in conjunction with reverse proxies etc. + * Refactored `Route` to use a single array of callbacks + * Added support for multiple callbacks for `app.param()`. Closes #801 +Closes #805 + * Changed: removed .call(self) for route callbacks + * Dependency: `qs >= 0.3.1` + * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 + +2.4.4 / 2011-08-05 +================== + + * Fixed `res.header()` intention of a set, even when `undefined` + * Fixed `*`, value no longer required + * Fixed `res.send(204)` support. Closes #771 + +2.4.3 / 2011-07-14 +================== + + * Added docs for `status` option special-case. Closes #739 + * Fixed `options.filename`, exposing the view path to template engines + +2.4.2. / 2011-07-06 +================== + + * Revert "removed jsonp stripping" for XSS + +2.4.1 / 2011-07-06 +================== + + * Added `res.json()` JSONP support. Closes #737 + * Added _extending-templates_ example. Closes #730 + * Added "strict routing" setting for trailing slashes + * Added support for multiple envs in `app.configure()` calls. Closes #735 + * Changed: `res.send()` using `res.json()` + * Changed: when cookie `path === null` don't default it + * Changed; default cookie path to "home" setting. Closes #731 + * Removed _pids/logs_ creation from express(1) + +2.4.0 / 2011-06-28 +================== + + * Added chainable `res.status(code)` + * Added `res.json()`, an explicit version of `res.send(obj)` + * Added simple web-service example + +2.3.12 / 2011-06-22 +================== + + * \#express is now on freenode! come join! + * Added `req.get(field, param)` + * Added links to Japanese documentation, thanks @hideyukisaito! + * Added; the `express(1)` generated app outputs the env + * Added `content-negotiation` example + * Dependency: connect >= 1.5.1 < 2.0.0 + * Fixed view layout bug. Closes #720 + * Fixed; ignore body on 304. Closes #701 + +2.3.11 / 2011-06-04 +================== + + * Added `npm test` + * Removed generation of dummy test file from `express(1)` + * Fixed; `express(1)` adds express as a dep + * Fixed; prune on `prepublish` + +2.3.10 / 2011-05-27 +================== + + * Added `req.route`, exposing the current route + * Added _package.json_ generation support to `express(1)` + * Fixed call to `app.param()` function for optional params. Closes #682 + +2.3.9 / 2011-05-25 +================== + + * Fixed bug-ish with `../' in `res.partial()` calls + +2.3.8 / 2011-05-24 +================== + + * Fixed `app.options()` + +2.3.7 / 2011-05-23 +================== + + * Added route `Collection`, ex: `app.get('/user/:id').remove();` + * Added support for `app.param(fn)` to define param logic + * Removed `app.param()` support for callback with return value + * Removed module.parent check from express(1) generated app. Closes #670 + * Refactored router. Closes #639 + +2.3.6 / 2011-05-20 +================== + + * Changed; using devDependencies instead of git submodules + * Fixed redis session example + * Fixed markdown example + * Fixed view caching, should not be enabled in development + +2.3.5 / 2011-05-20 +================== + + * Added export `.view` as alias for `.View` + +2.3.4 / 2011-05-08 +================== + + * Added `./examples/say` + * Fixed `res.sendfile()` bug preventing the transfer of files with spaces + +2.3.3 / 2011-05-03 +================== + + * Added "case sensitive routes" option. + * Changed; split methods supported per rfc [slaskis] + * Fixed route-specific middleware when using the same callback function several times + +2.3.2 / 2011-04-27 +================== + + * Fixed view hints + +2.3.1 / 2011-04-26 +================== + + * Added `app.match()` as `app.match.all()` + * Added `app.lookup()` as `app.lookup.all()` + * Added `app.remove()` for `app.remove.all()` + * Added `app.remove.VERB()` + * Fixed template caching collision issue. Closes #644 + * Moved router over from connect and started refactor + +2.3.0 / 2011-04-25 +================== + + * Added options support to `res.clearCookie()` + * Added `res.helpers()` as alias of `res.locals()` + * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` + * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] + * Renamed "cache views" to "view cache". Closes #628 + * Fixed caching of views when using several apps. Closes #637 + * Fixed gotcha invoking `app.param()` callbacks once per route middleware. +Closes #638 + * Fixed partial lookup precedence. Closes #631 +Shaw] + +2.2.2 / 2011-04-12 +================== + + * Added second callback support for `res.download()` connection errors + * Fixed `filename` option passing to template engine + +2.2.1 / 2011-04-04 +================== + + * Added `layout(path)` helper to change the layout within a view. Closes #610 + * Fixed `partial()` collection object support. + Previously only anything with `.length` would work. + When `.length` is present one must still be aware of holes, + however now `{ collection: {foo: 'bar'}}` is valid, exposes + `keyInCollection` and `keysInCollection`. + + * Performance improved with better view caching + * Removed `request` and `response` locals + * Changed; errorHandler page title is now `Express` instead of `Connect` + +2.2.0 / 2011-03-30 +================== + + * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 + * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 + * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. + * Dependency `connect >= 1.2.0` + +2.1.1 / 2011-03-29 +================== + + * Added; expose `err.view` object when failing to locate a view + * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] + * Fixed; `res.send(undefined)` responds with 204 [aheckmann] + +2.1.0 / 2011-03-24 +================== + + * Added `/_?` partial lookup support. Closes #447 + * Added `request`, `response`, and `app` local variables + * Added `settings` local variable, containing the app's settings + * Added `req.flash()` exception if `req.session` is not available + * Added `res.send(bool)` support (json response) + * Fixed stylus example for latest version + * Fixed; wrap try/catch around `res.render()` + +2.0.0 / 2011-03-17 +================== + + * Fixed up index view path alternative. + * Changed; `res.locals()` without object returns the locals + +2.0.0rc3 / 2011-03-17 +================== + + * Added `res.locals(obj)` to compliment `res.local(key, val)` + * Added `res.partial()` callback support + * Fixed recursive error reporting issue in `res.render()` + +2.0.0rc2 / 2011-03-17 +================== + + * Changed; `partial()` "locals" are now optional + * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] + * Fixed .filename view engine option [reported by drudge] + * Fixed blog example + * Fixed `{req,res}.app` reference when mounting [Ben Weaver] + +2.0.0rc / 2011-03-14 +================== + + * Fixed; expose `HTTPSServer` constructor + * Fixed express(1) default test charset. Closes #579 [reported by secoif] + * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] + +2.0.0beta3 / 2011-03-09 +================== + + * Added support for `res.contentType()` literal + The original `res.contentType('.json')`, + `res.contentType('application/json')`, and `res.contentType('json')` + will work now. + * Added `res.render()` status option support back + * Added charset option for `res.render()` + * Added `.charset` support (via connect 1.0.4) + * Added view resolution hints when in development and a lookup fails + * Added layout lookup support relative to the page view. + For example while rendering `./views/user/index.jade` if you create + `./views/user/layout.jade` it will be used in favour of the root layout. + * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] + * Fixed; default `res.send()` string charset to utf8 + * Removed `Partial` constructor (not currently used) + +2.0.0beta2 / 2011-03-07 +================== + + * Added res.render() `.locals` support back to aid in migration process + * Fixed flash example + +2.0.0beta / 2011-03-03 +================== + + * Added HTTPS support + * Added `res.cookie()` maxAge support + * Added `req.header()` _Referrer_ / _Referer_ special-case, either works + * Added mount support for `res.redirect()`, now respects the mount-point + * Added `union()` util, taking place of `merge(clone())` combo + * Added stylus support to express(1) generated app + * Added secret to session middleware used in examples and generated app + * Added `res.local(name, val)` for progressive view locals + * Added default param support to `req.param(name, default)` + * Added `app.disabled()` and `app.enabled()` + * Added `app.register()` support for omitting leading ".", either works + * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 + * Added `app.param()` to map route params to async/sync logic + * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 + * Added extname with no leading "." support to `res.contentType()` + * Added `cache views` setting, defaulting to enabled in "production" env + * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. + * Added `req.accepts()` support for extensions + * Changed; `res.download()` and `res.sendfile()` now utilize Connect's + static file server `connect.static.send()`. + * Changed; replaced `connect.utils.mime()` with npm _mime_ module + * Changed; allow `req.query` to be pre-defined (via middleware or other parent + * Changed view partial resolution, now relative to parent view + * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. + * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 + * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` + * Fixed; using _qs_ module instead of _querystring_ + * Fixed; strip unsafe chars from jsonp callbacks + * Removed "stream threshold" setting + +1.0.8 / 2011-03-01 +================== + + * Allow `req.query` to be pre-defined (via middleware or other parent app) + * "connect": ">= 0.5.0 < 1.0.0". Closes #547 + * Removed the long deprecated __EXPRESS_ENV__ support + +1.0.7 / 2011-02-07 +================== + + * Fixed `render()` setting inheritance. + Mounted apps would not inherit "view engine" + +1.0.6 / 2011-02-07 +================== + + * Fixed `view engine` setting bug when period is in dirname + +1.0.5 / 2011-02-05 +================== + + * Added secret to generated app `session()` call + +1.0.4 / 2011-02-05 +================== + + * Added `qs` dependency to _package.json_ + * Fixed namespaced `require()`s for latest connect support + +1.0.3 / 2011-01-13 +================== + + * Remove unsafe characters from JSONP callback names [Ryan Grove] + +1.0.2 / 2011-01-10 +================== + + * Removed nested require, using `connect.router` + +1.0.1 / 2010-12-29 +================== + + * Fixed for middleware stacked via `createServer()` + previously the `foo` middleware passed to `createServer(foo)` + would not have access to Express methods such as `res.send()` + or props like `req.query` etc. + +1.0.0 / 2010-11-16 +================== + + * Added; deduce partial object names from the last segment. + For example by default `partial('forum/post', postObject)` will + give you the _post_ object, providing a meaningful default. + * Added http status code string representation to `res.redirect()` body + * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. + * Added `req.is()` to aid in content negotiation + * Added partial local inheritance [suggested by masylum]. Closes #102 + providing access to parent template locals. + * Added _-s, --session[s]_ flag to express(1) to add session related middleware + * Added _--template_ flag to express(1) to specify the + template engine to use. + * Added _--css_ flag to express(1) to specify the + stylesheet engine to use (or just plain css by default). + * Added `app.all()` support [thanks aheckmann] + * Added partial direct object support. + You may now `partial('user', user)` providing the "user" local, + vs previously `partial('user', { object: user })`. + * Added _route-separation_ example since many people question ways + to do this with CommonJS modules. Also view the _blog_ example for + an alternative. + * Performance; caching view path derived partial object names + * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 + * Fixed jsonp support; _text/javascript_ as per mailinglist discussion + +1.0.0rc4 / 2010-10-14 +================== + + * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 + * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) + * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] + * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] + * Added `partial()` support for array-like collections. Closes #434 + * Added support for swappable querystring parsers + * Added session usage docs. Closes #443 + * Added dynamic helper caching. Closes #439 [suggested by maritz] + * Added authentication example + * Added basic Range support to `res.sendfile()` (and `res.download()` etc) + * Changed; `express(1)` generated app using 2 spaces instead of 4 + * Default env to "development" again [aheckmann] + * Removed _context_ option is no more, use "scope" + * Fixed; exposing _./support_ libs to examples so they can run without installs + * Fixed mvc example + +1.0.0rc3 / 2010-09-20 +================== + + * Added confirmation for `express(1)` app generation. Closes #391 + * Added extending of flash formatters via `app.flashFormatters` + * Added flash formatter support. Closes #411 + * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" + * Added _stream threshold_ setting for `res.sendfile()` + * Added `res.send()` __HEAD__ support + * Added `res.clearCookie()` + * Added `res.cookie()` + * Added `res.render()` headers option + * Added `res.redirect()` response bodies + * Added `res.render()` status option support. Closes #425 [thanks aheckmann] + * Fixed `res.sendfile()` responding with 403 on malicious path + * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ + * Fixed; mounted apps settings now inherit from parent app [aheckmann] + * Fixed; stripping Content-Length / Content-Type when 204 + * Fixed `res.send()` 204. Closes #419 + * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 + * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] + + +1.0.0rc2 / 2010-08-17 +================== + + * Added `app.register()` for template engine mapping. Closes #390 + * Added `res.render()` callback support as second argument (no options) + * Added callback support to `res.download()` + * Added callback support for `res.sendfile()` + * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` + * Added "partials" setting to docs + * Added default expresso tests to `express(1)` generated app. Closes #384 + * Fixed `res.sendfile()` error handling, defer via `next()` + * Fixed `res.render()` callback when a layout is used [thanks guillermo] + * Fixed; `make install` creating ~/.node_libraries when not present + * Fixed issue preventing error handlers from being defined anywhere. Closes #387 + +1.0.0rc / 2010-07-28 +================== + + * Added mounted hook. Closes #369 + * Added connect dependency to _package.json_ + + * Removed "reload views" setting and support code + development env never caches, production always caches. + + * Removed _param_ in route callbacks, signature is now + simply (req, res, next), previously (req, res, params, next). + Use _req.params_ for path captures, _req.query_ for GET params. + + * Fixed "home" setting + * Fixed middleware/router precedence issue. Closes #366 + * Fixed; _configure()_ callbacks called immediately. Closes #368 + +1.0.0beta2 / 2010-07-23 +================== + + * Added more examples + * Added; exporting `Server` constructor + * Added `Server#helpers()` for view locals + * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 + * Added support for absolute view paths + * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 + * Added Guillermo Rauch to the contributor list + * Added support for "as" for non-collection partials. Closes #341 + * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] + * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] + * Fixed instanceof `Array` checks, now `Array.isArray()` + * Fixed express(1) expansion of public dirs. Closes #348 + * Fixed middleware precedence. Closes #345 + * Fixed view watcher, now async [thanks aheckmann] + +1.0.0beta / 2010-07-15 +================== + + * Re-write + - much faster + - much lighter + - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs + +0.14.0 / 2010-06-15 +================== + + * Utilize relative requires + * Added Static bufferSize option [aheckmann] + * Fixed caching of view and partial subdirectories [aheckmann] + * Fixed mime.type() comments now that ".ext" is not supported + * Updated haml submodule + * Updated class submodule + * Removed bin/express + +0.13.0 / 2010-06-01 +================== + + * Added node v0.1.97 compatibility + * Added support for deleting cookies via Request#cookie('key', null) + * Updated haml submodule + * Fixed not-found page, now using using charset utf-8 + * Fixed show-exceptions page, now using using charset utf-8 + * Fixed view support due to fs.readFile Buffers + * Changed; mime.type() no longer accepts ".type" due to node extname() changes + +0.12.0 / 2010-05-22 +================== + + * Added node v0.1.96 compatibility + * Added view `helpers` export which act as additional local variables + * Updated haml submodule + * Changed ETag; removed inode, modified time only + * Fixed LF to CRLF for setting multiple cookies + * Fixed cookie complation; values are now urlencoded + * Fixed cookies parsing; accepts quoted values and url escaped cookies + +0.11.0 / 2010-05-06 +================== + + * Added support for layouts using different engines + - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) + - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' + - this.render('page.html.haml', { layout: false }) // no layout + * Updated ext submodule + * Updated haml submodule + * Fixed EJS partial support by passing along the context. Issue #307 + +0.10.1 / 2010-05-03 +================== + + * Fixed binary uploads. + +0.10.0 / 2010-04-30 +================== + + * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s + encoding is set to 'utf8' or 'utf-8'. + * Added "encoding" option to Request#render(). Closes #299 + * Added "dump exceptions" setting, which is enabled by default. + * Added simple ejs template engine support + * Added error reponse support for text/plain, application/json. Closes #297 + * Added callback function param to Request#error() + * Added Request#sendHead() + * Added Request#stream() + * Added support for Request#respond(304, null) for empty response bodies + * Added ETag support to Request#sendfile() + * Added options to Request#sendfile(), passed to fs.createReadStream() + * Added filename arg to Request#download() + * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request + * Performance enhanced by preventing several calls to toLowerCase() in Router#match() + * Changed; Request#sendfile() now streams + * Changed; Renamed Request#halt() to Request#respond(). Closes #289 + * Changed; Using sys.inspect() instead of JSON.encode() for error output + * Changed; run() returns the http.Server instance. Closes #298 + * Changed; Defaulting Server#host to null (INADDR_ANY) + * Changed; Logger "common" format scale of 0.4f + * Removed Logger "request" format + * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found + * Fixed several issues with http client + * Fixed Logger Content-Length output + * Fixed bug preventing Opera from retaining the generated session id. Closes #292 + +0.9.0 / 2010-04-14 +================== + + * Added DSL level error() route support + * Added DSL level notFound() route support + * Added Request#error() + * Added Request#notFound() + * Added Request#render() callback function. Closes #258 + * Added "max upload size" setting + * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 + * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js + * Added callback function support to Request#halt() as 3rd/4th arg + * Added preprocessing of route param wildcards using param(). Closes #251 + * Added view partial support (with collections etc) + * Fixed bug preventing falsey params (such as ?page=0). Closes #286 + * Fixed setting of multiple cookies. Closes #199 + * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) + * Changed; session cookie is now httpOnly + * Changed; Request is no longer global + * Changed; Event is no longer global + * Changed; "sys" module is no longer global + * Changed; moved Request#download to Static plugin where it belongs + * Changed; Request instance created before body parsing. Closes #262 + * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 + * Changed; Pre-caching view partials in memory when "cache view partials" is enabled + * Updated support to node --version 0.1.90 + * Updated dependencies + * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) + * Removed utils.mixin(); use Object#mergeDeep() + +0.8.0 / 2010-03-19 +================== + + * Added coffeescript example app. Closes #242 + * Changed; cache api now async friendly. Closes #240 + * Removed deprecated 'express/static' support. Use 'express/plugins/static' + +0.7.6 / 2010-03-19 +================== + + * Added Request#isXHR. Closes #229 + * Added `make install` (for the executable) + * Added `express` executable for setting up simple app templates + * Added "GET /public/*" to Static plugin, defaulting to /public + * Added Static plugin + * Fixed; Request#render() only calls cache.get() once + * Fixed; Namespacing View caches with "view:" + * Fixed; Namespacing Static caches with "static:" + * Fixed; Both example apps now use the Static plugin + * Fixed set("views"). Closes #239 + * Fixed missing space for combined log format + * Deprecated Request#sendfile() and 'express/static' + * Removed Server#running + +0.7.5 / 2010-03-16 +================== + + * Added Request#flash() support without args, now returns all flashes + * Updated ext submodule + +0.7.4 / 2010-03-16 +================== + + * Fixed session reaper + * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) + +0.7.3 / 2010-03-16 +================== + + * Added package.json + * Fixed requiring of haml / sass due to kiwi removal + +0.7.2 / 2010-03-16 +================== + + * Fixed GIT submodules (HAH!) + +0.7.1 / 2010-03-16 +================== + + * Changed; Express now using submodules again until a PM is adopted + * Changed; chat example using millisecond conversions from ext + +0.7.0 / 2010-03-15 +================== + + * Added Request#pass() support (finds the next matching route, or the given path) + * Added Logger plugin (default "common" format replaces CommonLogger) + * Removed Profiler plugin + * Removed CommonLogger plugin + +0.6.0 / 2010-03-11 +================== + + * Added seed.yml for kiwi package management support + * Added HTTP client query string support when method is GET. Closes #205 + + * Added support for arbitrary view engines. + For example "foo.engine.html" will now require('engine'), + the exports from this module are cached after the first require(). + + * Added async plugin support + + * Removed usage of RESTful route funcs as http client + get() etc, use http.get() and friends + + * Removed custom exceptions + +0.5.0 / 2010-03-10 +================== + + * Added ext dependency (library of js extensions) + * Removed extname() / basename() utils. Use path module + * Removed toArray() util. Use arguments.values + * Removed escapeRegexp() util. Use RegExp.escape() + * Removed process.mixin() dependency. Use utils.mixin() + * Removed Collection + * Removed ElementCollection + * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) + +0.4.0 / 2010-02-11 +================== + + * Added flash() example to sample upload app + * Added high level restful http client module (express/http) + * Changed; RESTful route functions double as HTTP clients. Closes #69 + * Changed; throwing error when routes are added at runtime + * Changed; defaulting render() context to the current Request. Closes #197 + * Updated haml submodule + +0.3.0 / 2010-02-11 +================== + + * Updated haml / sass submodules. Closes #200 + * Added flash message support. Closes #64 + * Added accepts() now allows multiple args. fixes #117 + * Added support for plugins to halt. Closes #189 + * Added alternate layout support. Closes #119 + * Removed Route#run(). Closes #188 + * Fixed broken specs due to use(Cookie) missing + +0.2.1 / 2010-02-05 +================== + + * Added "plot" format option for Profiler (for gnuplot processing) + * Added request number to Profiler plugin + * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 + * Fixed issue with routes not firing when not files are present. Closes #184 + * Fixed process.Promise -> events.Promise + +0.2.0 / 2010-02-03 +================== + + * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 + * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 + * Added expiration support to cache api with reaper. Closes #133 + * Added cache Store.Memory#reap() + * Added Cache; cache api now uses first class Cache instances + * Added abstract session Store. Closes #172 + * Changed; cache Memory.Store#get() utilizing Collection + * Renamed MemoryStore -> Store.Memory + * Fixed use() of the same plugin several time will always use latest options. Closes #176 + +0.1.0 / 2010-02-03 +================== + + * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context + * Updated node support to 0.1.27 Closes #169 + * Updated dirname(__filename) -> __dirname + * Updated libxmljs support to v0.2.0 + * Added session support with memory store / reaping + * Added quick uid() helper + * Added multi-part upload support + * Added Sass.js support / submodule + * Added production env caching view contents and static files + * Added static file caching. Closes #136 + * Added cache plugin with memory stores + * Added support to StaticFile so that it works with non-textual files. + * Removed dirname() helper + * Removed several globals (now their modules must be required) + +0.0.2 / 2010-01-10 +================== + + * Added view benchmarks; currently haml vs ejs + * Added Request#attachment() specs. Closes #116 + * Added use of node's parseQuery() util. Closes #123 + * Added `make init` for submodules + * Updated Haml + * Updated sample chat app to show messages on load + * Updated libxmljs parseString -> parseHtmlString + * Fixed `make init` to work with older versions of git + * Fixed specs can now run independant specs for those who cant build deps. Closes #127 + * Fixed issues introduced by the node url module changes. Closes 126. + * Fixed two assertions failing due to Collection#keys() returning strings + * Fixed faulty Collection#toArray() spec due to keys() returning strings + * Fixed `make test` now builds libxmljs.node before testing + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/LICENSE b/node_modules/express/LICENSE new file mode 100644 index 00000000..d23e93ce --- /dev/null +++ b/node_modules/express/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2009-2013 TJ Holowaychuk + +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. \ No newline at end of file diff --git a/node_modules/express/Makefile b/node_modules/express/Makefile new file mode 100644 index 00000000..a1f33a70 --- /dev/null +++ b/node_modules/express/Makefile @@ -0,0 +1,34 @@ + +MOCHA_OPTS= --check-leaks +REPORTER = dot + +check: test + +test: test-unit test-acceptance + +test-unit: + @NODE_ENV=test ./node_modules/.bin/mocha \ + --reporter $(REPORTER) \ + --globals setImmediate,clearImmediate \ + $(MOCHA_OPTS) + +test-acceptance: + @NODE_ENV=test ./node_modules/.bin/mocha \ + --reporter $(REPORTER) \ + --bail \ + test/acceptance/*.js + +test-cov: lib-cov + @EXPRESS_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html + +lib-cov: + @jscoverage lib lib-cov + +bench: + @$(MAKE) -C benchmarks + +clean: + rm -f coverage.html + rm -fr lib-cov + +.PHONY: test test-unit test-acceptance bench clean diff --git a/node_modules/express/Readme.md b/node_modules/express/Readme.md new file mode 100644 index 00000000..e1e3f7e9 --- /dev/null +++ b/node_modules/express/Readme.md @@ -0,0 +1,126 @@ +[![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)](http://expressjs.com/) + + Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). + + [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Gittip](http://img.shields.io/gittip/visionmedia.png)](https://www.gittip.com/visionmedia/) + +```js +var express = require('express'); +var app = express(); + +app.get('/', function(req, res){ + res.send('Hello World'); +}); + +app.listen(3000); +``` + +## Installation + + $ npm install -g express + +## Quick Start + + The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below: + + Create the app: + + $ npm install -g express + $ express /tmp/foo && cd /tmp/foo + + Install dependencies: + + $ npm install + + Start the server: + + $ node app + +## Features + + * Built on [Connect](http://github.com/senchalabs/connect) + * Robust routing + * HTTP helpers (redirection, caching, etc) + * View system supporting 14+ template engines + * Content negotiation + * Focus on high performance + * Environment based configuration + * Executable for generating applications quickly + * High test coverage + +## Philosophy + + The Express philosophy is to provide small, robust tooling for HTTP servers, making + it a great solution for single page applications, web sites, hybrids, or public + HTTP APIs. + + Built on Connect, you can use _only_ what you need, and nothing more. Applications + can be as big or as small as you like, even a single file. Express does + not force you to use any specific ORM or template engine. With support for over + 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js), + you can quickly craft your perfect framework. + +## More Information + + * [Website and Documentation](http://expressjs.com/) stored at [visionmedia/expressjs.com](https://github.com/visionmedia/expressjs.com) + * Join #express on freenode + * [Google Group](http://groups.google.com/group/express-js) for discussion + * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates + * Visit the [Wiki](http://github.com/visionmedia/express/wiki) + * [Русскоязычная документация](http://jsman.ru/express/) + * Run express examples [online](https://runnable.com/express) + +## Viewing Examples + +Clone the Express repo, then install the dev dependencies to install all the example / test suite dependencies: + + $ git clone git://github.com/visionmedia/express.git --depth 1 + $ cd express + $ npm install + +Then run whichever tests you want: + + $ node examples/content-negotiation + +You can also view live examples here: + + + +## Running Tests + +To run the test suite, first invoke the following command within the repo, installing the development dependencies: + + $ npm install + +Then run the tests: + + $ make test + +## Contributors + + https://github.com/visionmedia/express/graphs/contributors + +## License + +(The MIT License) + +Copyright (c) 2009-2012 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/express/benchmarks/Makefile b/node_modules/express/benchmarks/Makefile new file mode 100644 index 00000000..baf0d6fc --- /dev/null +++ b/node_modules/express/benchmarks/Makefile @@ -0,0 +1,13 @@ + +all: + @./run 1 middleware + @./run 5 middleware + @./run 10 middleware + @./run 15 middleware + @./run 20 middleware + @./run 30 middleware + @./run 50 middleware + @./run 100 middleware + @echo + +.PHONY: all diff --git a/node_modules/express/benchmarks/middleware.js b/node_modules/express/benchmarks/middleware.js new file mode 100644 index 00000000..3aa7a8b4 --- /dev/null +++ b/node_modules/express/benchmarks/middleware.js @@ -0,0 +1,23 @@ + +var http = require('http'); +var express = require('..'); +var app = express(); + +// number of middleware + +var n = parseInt(process.env.MW || '1', 10); +console.log(' %s middleware', n); + +while (n--) { + app.use(function(req, res, next){ + next(); + }); +} + +var body = new Buffer('Hello World'); + +app.use(function(req, res, next){ + res.send(body); +}); + +app.listen(3333); diff --git a/node_modules/express/benchmarks/run b/node_modules/express/benchmarks/run new file mode 100755 index 00000000..93b5bc52 --- /dev/null +++ b/node_modules/express/benchmarks/run @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +echo +MW=$1 node $2 & +pid=$! + +sleep 2 + +wrk 'http://localhost:3333/?foo[bar]=baz' \ + -d 3 \ + -c 50 \ + -t 8 \ + | grep 'Requests/sec' \ + | awk '{ print " " $2 }' + +kill $pid diff --git a/node_modules/express/bin/express b/node_modules/express/bin/express new file mode 100755 index 00000000..cb979288 --- /dev/null +++ b/node_modules/express/bin/express @@ -0,0 +1,423 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander') + , mkdirp = require('mkdirp') + , pkg = require('../package.json') + , version = pkg.version + , os = require('os') + , fs = require('fs'); + +// CLI + +program + .version(version) + .usage('[options] [dir]') + .option('-s, --sessions', 'add session support') + .option('-e, --ejs', 'add ejs engine support (defaults to jade)') + .option('-J, --jshtml', 'add jshtml engine support (defaults to jade)') + .option('-H, --hogan', 'add hogan.js engine support') + .option('-c, --css ', 'add stylesheet support (less|stylus) (defaults to plain css)') + .option('-f, --force', 'force on non-empty directory') + .parse(process.argv); + +// Path + +var path = program.args.shift() || '.'; + +// end-of-line code + +var eol = os.EOL + +// Template engine + +program.template = 'jade'; +if (program.ejs) program.template = 'ejs'; +if (program.jshtml) program.template = 'jshtml'; +if (program.hogan) program.template = 'hjs'; + +/** + * Routes index template. + */ + +var index = [ + '' + , '/*' + , ' * GET home page.' + , ' */' + , '' + , 'exports.index = function(req, res){' + , ' res.render(\'index\', { title: \'Express\' });' + , '};' +].join(eol); + +/** + * Routes users template. + */ + +var users = [ + '' + , '/*' + , ' * GET users listing.' + , ' */' + , '' + , 'exports.list = function(req, res){' + , ' res.send("respond with a resource");' + , '};' +].join(eol); + +/** + * Jade layout template. + */ + +var jadeLayout = [ + 'doctype html' + , 'html' + , ' head' + , ' title= title' + , ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')' + , ' body' + , ' block content' +].join(eol); + +/** + * Jade index template. + */ + +var jadeIndex = [ + 'extends layout' + , '' + , 'block content' + , ' h1= title' + , ' p Welcome to #{title}' +].join(eol); + +/** + * EJS index template. + */ + +var ejsIndex = [ + '' + , '' + , ' ' + , ' <%= title %>' + , ' ' + , ' ' + , ' ' + , '

<%= title %>

' + , '

Welcome to <%= title %>

' + , ' ' + , '' +].join(eol); + +/** + * JSHTML layout template. + */ + +var jshtmlLayout = [ + '' + , '' + , ' ' + , ' @write(title) ' + , ' ' + , ' ' + , ' ' + , ' @write(body)' + , ' ' + , '' +].join(eol); + +/** + * JSHTML index template. + */ + +var jshtmlIndex = [ + '

@write(title)

' + , '

Welcome to @write(title)

' +].join(eol); + +/** + * Hogan.js index template. + */ +var hoganIndex = [ + '' + , '' + , ' ' + , ' {{ title }}' + , ' ' + , ' ' + , ' ' + , '

{{ title }}

' + , '

Welcome to {{ title }}

' + , ' ' + , '' +].join(eol); + +/** + * Default css template. + */ + +var css = [ + 'body {' + , ' padding: 50px;' + , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' + , '}' + , '' + , 'a {' + , ' color: #00B7FF;' + , '}' +].join(eol); + +/** + * Default less template. + */ + +var less = [ + 'body {' + , ' padding: 50px;' + , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' + , '}' + , '' + , 'a {' + , ' color: #00B7FF;' + , '}' +].join(eol); + +/** + * Default stylus template. + */ + +var stylus = [ + 'body' + , ' padding: 50px' + , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif' + , 'a' + , ' color: #00B7FF' +].join(eol); + +/** + * App template. + */ + +var app = [ + '' + , '/**' + , ' * Module dependencies.' + , ' */' + , '' + , 'var express = require(\'express\');' + , 'var routes = require(\'./routes\');' + , 'var user = require(\'./routes/user\');' + , 'var http = require(\'http\');' + , 'var path = require(\'path\');' + , '' + , 'var app = express();' + , '' + , '// all environments' + , 'app.set(\'port\', process.env.PORT || 3000);' + , 'app.set(\'views\', path.join(__dirname, \'views\'));' + , 'app.set(\'view engine\', \':TEMPLATE\');' + , 'app.use(express.favicon());' + , 'app.use(express.logger(\'dev\'));' + , 'app.use(express.json());' + , 'app.use(express.urlencoded());' + , 'app.use(express.methodOverride());{sess}' + , 'app.use(app.router);{css}' + , 'app.use(express.static(path.join(__dirname, \'public\')));' + , '' + , '// development only' + , 'if (\'development\' == app.get(\'env\')) {' + , ' app.use(express.errorHandler());' + , '}' + , '' + , 'app.get(\'/\', routes.index);' + , 'app.get(\'/users\', user.list);' + , '' + , 'http.createServer(app).listen(app.get(\'port\'), function(){' + , ' console.log(\'Express server listening on port \' + app.get(\'port\'));' + , '});' + , '' +].join(eol); + +// Generate application + +(function createApplication(path) { + emptyDirectory(path, function(empty){ + if (empty || program.force) { + createApplicationAt(path); + } else { + program.confirm('destination is not empty, continue? ', function(ok){ + if (ok) { + process.stdin.destroy(); + createApplicationAt(path); + } else { + abort('aborting'); + } + }); + } + }); +})(path); + +/** + * Create application at the given directory `path`. + * + * @param {String} path + */ + +function createApplicationAt(path) { + console.log(); + process.on('exit', function(){ + console.log(); + console.log(' install dependencies:'); + console.log(' $ cd %s && npm install', path); + console.log(); + console.log(' run the app:'); + console.log(' $ node app'); + console.log(); + }); + + mkdir(path, function(){ + mkdir(path + '/public'); + mkdir(path + '/public/javascripts'); + mkdir(path + '/public/images'); + mkdir(path + '/public/stylesheets', function(){ + switch (program.css) { + case 'less': + write(path + '/public/stylesheets/style.less', less); + break; + case 'stylus': + write(path + '/public/stylesheets/style.styl', stylus); + break; + default: + write(path + '/public/stylesheets/style.css', css); + } + }); + + mkdir(path + '/routes', function(){ + write(path + '/routes/index.js', index); + write(path + '/routes/user.js', users); + }); + + mkdir(path + '/views', function(){ + switch (program.template) { + case 'ejs': + write(path + '/views/index.ejs', ejsIndex); + break; + case 'jade': + write(path + '/views/layout.jade', jadeLayout); + write(path + '/views/index.jade', jadeIndex); + break; + case 'jshtml': + write(path + '/views/layout.jshtml', jshtmlLayout); + write(path + '/views/index.jshtml', jshtmlIndex); + break; + case 'hjs': + write(path + '/views/index.hjs', hoganIndex); + break; + + } + }); + + // CSS Engine support + switch (program.css) { + case 'less': + app = app.replace('{css}', eol + 'app.use(require(\'less-middleware\')({ src: path.join(__dirname, \'public\') }));'); + break; + case 'stylus': + app = app.replace('{css}', eol + 'app.use(require(\'stylus\').middleware(path.join(__dirname, \'public\')));'); + break; + default: + app = app.replace('{css}', ''); + } + + // Session support + app = app.replace('{sess}', program.sessions + ? eol + 'app.use(express.cookieParser(\'your secret here\'));' + eol + 'app.use(express.session());' + : ''); + + // Template support + app = app.replace(':TEMPLATE', program.template); + + // package.json + var pkg = { + name: 'application-name' + , version: '0.0.1' + , private: true + , scripts: { start: 'node app.js' } + , dependencies: { + express: version + } + } + + if (program.template) pkg.dependencies[program.template] = '*'; + + // CSS Engine support + switch (program.css) { + case 'less': + pkg.dependencies['less-middleware'] = '*'; + break; + default: + if (program.css) { + pkg.dependencies[program.css] = '*'; + } + } + + write(path + '/package.json', JSON.stringify(pkg, null, 2)); + write(path + '/app.js', app); + }); +} + +/** + * Check if the given directory `path` is empty. + * + * @param {String} path + * @param {Function} fn + */ + +function emptyDirectory(path, fn) { + fs.readdir(path, function(err, files){ + if (err && 'ENOENT' != err.code) throw err; + fn(!files || !files.length); + }); +} + +/** + * echo str > path. + * + * @param {String} path + * @param {String} str + */ + +function write(path, str) { + fs.writeFile(path, str); + console.log(' \x1b[36mcreate\x1b[0m : ' + path); +} + +/** + * Mkdir -p. + * + * @param {String} path + * @param {Function} fn + */ + +function mkdir(path, fn) { + mkdirp(path, 0755, function(err){ + if (err) throw err; + console.log(' \033[36mcreate\033[0m : ' + path); + fn && fn(); + }); +} + +/** + * Exit with the given `str`. + * + * @param {String} str + */ + +function abort(str) { + console.error(str); + process.exit(1); +} diff --git a/node_modules/express/index.js b/node_modules/express/index.js new file mode 100644 index 00000000..bfe99345 --- /dev/null +++ b/node_modules/express/index.js @@ -0,0 +1,4 @@ + +module.exports = process.env.EXPRESS_COV + ? require('./lib-cov/express') + : require('./lib/express'); \ No newline at end of file diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js new file mode 100644 index 00000000..865e1e02 --- /dev/null +++ b/node_modules/express/lib/application.js @@ -0,0 +1,534 @@ +/** + * Module dependencies. + */ + +var connect = require('connect') + , Router = require('./router') + , methods = require('methods') + , middleware = require('./middleware') + , debug = require('debug')('express:application') + , locals = require('./utils').locals + , View = require('./view') + , utils = connect.utils + , http = require('http'); + +/** + * Application prototype. + */ + +var app = exports = module.exports = {}; + +/** + * Initialize the server. + * + * - setup default configuration + * - setup default middleware + * - setup route reflection methods + * + * @api private + */ + +app.init = function(){ + this.cache = {}; + this.settings = {}; + this.engines = {}; + this.defaultConfiguration(); +}; + +/** + * Initialize application configuration. + * + * @api private + */ + +app.defaultConfiguration = function(){ + // default settings + this.enable('x-powered-by'); + this.enable('etag'); + this.set('env', process.env.NODE_ENV || 'development'); + this.set('subdomain offset', 2); + debug('booting in %s mode', this.get('env')); + + // implicit middleware + this.use(connect.query()); + this.use(middleware.init(this)); + + // inherit protos + this.on('mount', function(parent){ + this.request.__proto__ = parent.request; + this.response.__proto__ = parent.response; + this.engines.__proto__ = parent.engines; + this.settings.__proto__ = parent.settings; + }); + + // router + this._router = new Router(this); + this.routes = this._router.map; + this.__defineGetter__('router', function(){ + this._usedRouter = true; + this._router.caseSensitive = this.enabled('case sensitive routing'); + this._router.strict = this.enabled('strict routing'); + return this._router.middleware; + }); + + // setup locals + this.locals = locals(this); + + // default locals + this.locals.settings = this.settings; + + // default configuration + this.set('view', View); + this.set('views', process.cwd() + '/views'); + this.set('jsonp callback name', 'callback'); + + this.configure('development', function(){ + this.set('json spaces', 2); + }); + + this.configure('production', function(){ + this.enable('view cache'); + }); +}; + +/** + * Proxy `connect#use()` to apply settings to + * mounted applications. + * + * @param {String|Function|Server} route + * @param {Function|Server} fn + * @return {app} for chaining + * @api public + */ + +app.use = function(route, fn){ + var app; + + // default route to '/' + if ('string' != typeof route) fn = route, route = '/'; + + // express app + if (fn.handle && fn.set) app = fn; + + // restore .app property on req and res + if (app) { + app.route = route; + fn = function(req, res, next) { + var orig = req.app; + app.handle(req, res, function(err){ + req.__proto__ = orig.request; + res.__proto__ = orig.response; + next(err); + }); + }; + } + + connect.proto.use.call(this, route, fn); + + // mounted an app + if (app) { + app.parent = this; + app.emit('mount', this); + } + + return this; +}; + +/** + * Register the given template engine callback `fn` + * as `ext`. + * + * By default will `require()` the engine based on the + * file extension. For example if you try to render + * a "foo.jade" file Express will invoke the following internally: + * + * app.engine('jade', require('jade').__express); + * + * For engines that do not provide `.__express` out of the box, + * or if you wish to "map" a different extension to the template engine + * you may use this method. For example mapping the EJS template engine to + * ".html" files: + * + * app.engine('html', require('ejs').renderFile); + * + * In this case EJS provides a `.renderFile()` method with + * the same signature that Express expects: `(path, options, callback)`, + * though note that it aliases this method as `ejs.__express` internally + * so if you're using ".ejs" extensions you dont need to do anything. + * + * Some template engines do not follow this convention, the + * [Consolidate.js](https://github.com/visionmedia/consolidate.js) + * library was created to map all of node's popular template + * engines to follow this convention, thus allowing them to + * work seamlessly within Express. + * + * @param {String} ext + * @param {Function} fn + * @return {app} for chaining + * @api public + */ + +app.engine = function(ext, fn){ + if ('function' != typeof fn) throw new Error('callback function required'); + if ('.' != ext[0]) ext = '.' + ext; + this.engines[ext] = fn; + return this; +}; + +/** + * Map the given param placeholder `name`(s) to the given callback(s). + * + * Parameter mapping is used to provide pre-conditions to routes + * which use normalized placeholders. For example a _:user_id_ parameter + * could automatically load a user's information from the database without + * any additional code, + * + * The callback uses the same signature as middleware, the only difference + * being that the value of the placeholder is passed, in this case the _id_ + * of the user. Once the `next()` function is invoked, just like middleware + * it will continue on to execute the route, or subsequent parameter functions. + * + * app.param('user_id', function(req, res, next, id){ + * User.find(id, function(err, user){ + * if (err) { + * next(err); + * } else if (user) { + * req.user = user; + * next(); + * } else { + * next(new Error('failed to load user')); + * } + * }); + * }); + * + * @param {String|Array} name + * @param {Function} fn + * @return {app} for chaining + * @api public + */ + +app.param = function(name, fn){ + var self = this + , fns = [].slice.call(arguments, 1); + + // array + if (Array.isArray(name)) { + name.forEach(function(name){ + fns.forEach(function(fn){ + self.param(name, fn); + }); + }); + // param logic + } else if ('function' == typeof name) { + this._router.param(name); + // single + } else { + if (':' == name[0]) name = name.substr(1); + fns.forEach(function(fn){ + self._router.param(name, fn); + }); + } + + return this; +}; + +/** + * Assign `setting` to `val`, or return `setting`'s value. + * + * app.set('foo', 'bar'); + * app.get('foo'); + * // => "bar" + * + * Mounted servers inherit their parent server's settings. + * + * @param {String} setting + * @param {String} val + * @return {Server} for chaining + * @api public + */ + +app.set = function(setting, val){ + if (1 == arguments.length) { + return this.settings[setting]; + } else { + this.settings[setting] = val; + return this; + } +}; + +/** + * Return the app's absolute pathname + * based on the parent(s) that have + * mounted it. + * + * For example if the application was + * mounted as "/admin", which itself + * was mounted as "/blog" then the + * return value would be "/blog/admin". + * + * @return {String} + * @api private + */ + +app.path = function(){ + return this.parent + ? this.parent.path() + this.route + : ''; +}; + +/** + * Check if `setting` is enabled (truthy). + * + * app.enabled('foo') + * // => false + * + * app.enable('foo') + * app.enabled('foo') + * // => true + * + * @param {String} setting + * @return {Boolean} + * @api public + */ + +app.enabled = function(setting){ + return !!this.set(setting); +}; + +/** + * Check if `setting` is disabled. + * + * app.disabled('foo') + * // => true + * + * app.enable('foo') + * app.disabled('foo') + * // => false + * + * @param {String} setting + * @return {Boolean} + * @api public + */ + +app.disabled = function(setting){ + return !this.set(setting); +}; + +/** + * Enable `setting`. + * + * @param {String} setting + * @return {app} for chaining + * @api public + */ + +app.enable = function(setting){ + return this.set(setting, true); +}; + +/** + * Disable `setting`. + * + * @param {String} setting + * @return {app} for chaining + * @api public + */ + +app.disable = function(setting){ + return this.set(setting, false); +}; + +/** + * Configure callback for zero or more envs, + * when no `env` is specified that callback will + * be invoked for all environments. Any combination + * can be used multiple times, in any order desired. + * + * Examples: + * + * app.configure(function(){ + * // executed for all envs + * }); + * + * app.configure('stage', function(){ + * // executed staging env + * }); + * + * app.configure('stage', 'production', function(){ + * // executed for stage and production + * }); + * + * Note: + * + * These callbacks are invoked immediately, and + * are effectively sugar for the following: + * + * var env = process.env.NODE_ENV || 'development'; + * + * switch (env) { + * case 'development': + * ... + * break; + * case 'stage': + * ... + * break; + * case 'production': + * ... + * break; + * } + * + * @param {String} env... + * @param {Function} fn + * @return {app} for chaining + * @api public + */ + +app.configure = function(env, fn){ + var envs = 'all' + , args = [].slice.call(arguments); + fn = args.pop(); + if (args.length) envs = args; + if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this); + return this; +}; + +/** + * Delegate `.VERB(...)` calls to `router.VERB(...)`. + */ + +methods.forEach(function(method){ + app[method] = function(path){ + if ('get' == method && 1 == arguments.length) return this.set(path); + + // deprecated + if (Array.isArray(path)) { + console.trace('passing an array to app.VERB() is deprecated and will be removed in 4.0'); + } + + // if no router attached yet, attach the router + if (!this._usedRouter) this.use(this.router); + + // setup route + this._router[method].apply(this._router, arguments); + return this; + }; +}); + +/** + * Special-cased "all" method, applying the given route `path`, + * middleware, and callback to _every_ HTTP method. + * + * @param {String} path + * @param {Function} ... + * @return {app} for chaining + * @api public + */ + +app.all = function(path){ + var args = arguments; + methods.forEach(function(method){ + app[method].apply(this, args); + }, this); + return this; +}; + +// del -> delete alias + +app.del = app.delete; + +/** + * Render the given view `name` name with `options` + * and a callback accepting an error and the + * rendered template string. + * + * Example: + * + * app.render('email', { name: 'Tobi' }, function(err, html){ + * // ... + * }) + * + * @param {String} name + * @param {String|Function} options or fn + * @param {Function} fn + * @api public + */ + +app.render = function(name, options, fn){ + var opts = {} + , cache = this.cache + , engines = this.engines + , view; + + // support callback function as second arg + if ('function' == typeof options) { + fn = options, options = {}; + } + + // merge app.locals + utils.merge(opts, this.locals); + + // merge options._locals + if (options._locals) utils.merge(opts, options._locals); + + // merge options + utils.merge(opts, options); + + // set .cache unless explicitly provided + opts.cache = null == opts.cache + ? this.enabled('view cache') + : opts.cache; + + // primed cache + if (opts.cache) view = cache[name]; + + // view + if (!view) { + view = new (this.get('view'))(name, { + defaultEngine: this.get('view engine'), + root: this.get('views'), + engines: engines + }); + + if (!view.path) { + var err = new Error('Failed to lookup view "' + name + '" in views directory "' + view.root + '"'); + err.view = view; + return fn(err); + } + + // prime the cache + if (opts.cache) cache[name] = view; + } + + // render + try { + view.render(opts, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Listen for connections. + * + * A node `http.Server` is returned, with this + * application (which is a `Function`) as its + * callback. If you wish to create both an HTTP + * and HTTPS server you may do so with the "http" + * and "https" modules as shown here: + * + * var http = require('http') + * , https = require('https') + * , express = require('express') + * , app = express(); + * + * http.createServer(app).listen(80); + * https.createServer({ ... }, app).listen(443); + * + * @return {http.Server} + * @api public + */ + +app.listen = function(){ + var server = http.createServer(this); + return server.listen.apply(server, arguments); +}; diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js new file mode 100644 index 00000000..4f61cdbd --- /dev/null +++ b/node_modules/express/lib/express.js @@ -0,0 +1,82 @@ +/** + * Module dependencies. + */ + +var merge = require('merge-descriptors'); +var connect = require('connect') + , proto = require('./application') + , Route = require('./router/route') + , Router = require('./router') + , req = require('./request') + , res = require('./response') + , utils = connect.utils; + +/** + * Expose `createApplication()`. + */ + +exports = module.exports = createApplication; + +/** + * Expose mime. + */ + +exports.mime = connect.mime; + +/** + * Create an express application. + * + * @return {Function} + * @api public + */ + +function createApplication() { + var app = connect(); + utils.merge(app, proto); + app.request = { __proto__: req, app: app }; + app.response = { __proto__: res, app: app }; + app.init(); + return app; +} + +/** + * Expose connect.middleware as express.* + * for example `express.logger` etc. + */ + +merge(exports, connect.middleware); + +/** + * Error on createServer(). + */ + +exports.createServer = function(){ + console.warn('Warning: express.createServer() is deprecated, express'); + console.warn('applications no longer inherit from http.Server,'); + console.warn('please use:'); + console.warn(''); + console.warn(' var express = require("express");'); + console.warn(' var app = express();'); + console.warn(''); + return createApplication(); +}; + +/** + * Expose the prototypes. + */ + +exports.application = proto; +exports.request = req; +exports.response = res; + +/** + * Expose constructors. + */ + +exports.Route = Route; +exports.Router = Router; + +// Error handler title + +exports.errorHandler.title = 'Express'; + diff --git a/node_modules/express/lib/middleware.js b/node_modules/express/lib/middleware.js new file mode 100644 index 00000000..e07dd4cd --- /dev/null +++ b/node_modules/express/lib/middleware.js @@ -0,0 +1,32 @@ + +/** + * Module dependencies. + */ + +var utils = require('./utils'); + +/** + * Initialization middleware, exposing the + * request and response to eachother, as well + * as defaulting the X-Powered-By header field. + * + * @param {Function} app + * @return {Function} + * @api private + */ + +exports.init = function(app){ + return function expressInit(req, res, next){ + if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); + req.res = res; + res.req = req; + req.next = next; + + req.__proto__ = app.request; + res.__proto__ = app.response; + + res.locals = res.locals || utils.locals(res); + + next(); + } +}; diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js new file mode 100644 index 00000000..3d41617e --- /dev/null +++ b/node_modules/express/lib/request.js @@ -0,0 +1,529 @@ + +/** + * Module dependencies. + */ + +var http = require('http') + , utils = require('./utils') + , connect = require('connect') + , fresh = require('fresh') + , parseRange = require('range-parser') + , parse = connect.utils.parseUrl + , mime = connect.mime; + +/** + * Request prototype. + */ + +var req = exports = module.exports = { + __proto__: http.IncomingMessage.prototype +}; + +/** + * Return request header. + * + * The `Referrer` header field is special-cased, + * both `Referrer` and `Referer` are interchangeable. + * + * Examples: + * + * req.get('Content-Type'); + * // => "text/plain" + * + * req.get('content-type'); + * // => "text/plain" + * + * req.get('Something'); + * // => undefined + * + * Aliased as `req.header()`. + * + * @param {String} name + * @return {String} + * @api public + */ + +req.get = +req.header = function(name){ + switch (name = name.toLowerCase()) { + case 'referer': + case 'referrer': + return this.headers.referrer + || this.headers.referer; + default: + return this.headers[name]; + } +}; + +/** + * Check if the given `type(s)` is acceptable, returning + * the best match when true, otherwise `undefined`, in which + * case you should respond with 406 "Not Acceptable". + * + * The `type` value may be a single mime type string + * such as "application/json", the extension name + * such as "json", a comma-delimted list such as "json, html, text/plain", + * an argument list such as `"json", "html", "text/plain"`, + * or an array `["json", "html", "text/plain"]`. When a list + * or array is given the _best_ match, if any is returned. + * + * Examples: + * + * // Accept: text/html + * req.accepts('html'); + * // => "html" + * + * // Accept: text/*, application/json + * req.accepts('html'); + * // => "html" + * req.accepts('text/html'); + * // => "text/html" + * req.accepts('json, text'); + * // => "json" + * req.accepts('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * req.accepts('image/png'); + * req.accepts('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * req.accepts(['html', 'json']); + * req.accepts('html', 'json'); + * req.accepts('html, json'); + * // => "json" + * + * @param {String|Array} type(s) + * @return {String} + * @api public + */ + +req.accepts = function(type){ + var args = arguments.length > 1 ? [].slice.apply(arguments) : type; + return utils.accepts(args, this.get('Accept')); +}; + +/** + * Check if the given `encoding` is accepted. + * + * @param {String} encoding + * @return {Boolean} + * @api public + */ + +req.acceptsEncoding = function(encoding){ + return !! ~this.acceptedEncodings.indexOf(encoding); +}; + +/** + * Check if the given `charset` is acceptable, + * otherwise you should respond with 406 "Not Acceptable". + * + * @param {String} charset + * @return {Boolean} + * @api public + */ + +req.acceptsCharset = function(charset){ + var accepted = this.acceptedCharsets; + return accepted.length + ? !! ~accepted.indexOf(charset) + : true; +}; + +/** + * Check if the given `lang` is acceptable, + * otherwise you should respond with 406 "Not Acceptable". + * + * @param {String} lang + * @return {Boolean} + * @api public + */ + +req.acceptsLanguage = function(lang){ + var accepted = this.acceptedLanguages; + return accepted.length + ? !! ~accepted.indexOf(lang) + : true; +}; + +/** + * Parse Range header field, + * capping to the given `size`. + * + * Unspecified ranges such as "0-" require + * knowledge of your resource length. In + * the case of a byte range this is of course + * the total number of bytes. If the Range + * header field is not given `null` is returned, + * `-1` when unsatisfiable, `-2` when syntactically invalid. + * + * NOTE: remember that ranges are inclusive, so + * for example "Range: users=0-3" should respond + * with 4 users when available, not 3. + * + * @param {Number} size + * @return {Array} + * @api public + */ + +req.range = function(size){ + var range = this.get('Range'); + if (!range) return; + return parseRange(size, range); +}; + +/** + * Return an array of encodings. + * + * Examples: + * + * ['gzip', 'deflate'] + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('acceptedEncodings', function(){ + var accept = this.get('Accept-Encoding'); + return accept + ? accept.trim().split(/ *, */) + : []; +}); + +/** + * Return an array of Accepted media types + * ordered from highest quality to lowest. + * + * Examples: + * + * [ { value: 'application/json', + * quality: 1, + * type: 'application', + * subtype: 'json' }, + * { value: 'text/html', + * quality: 0.5, + * type: 'text', + * subtype: 'html' } ] + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('accepted', function(){ + var accept = this.get('Accept'); + return accept + ? utils.parseAccept(accept) + : []; +}); + +/** + * Return an array of Accepted languages + * ordered from highest quality to lowest. + * + * Examples: + * + * Accept-Language: en;q=.5, en-us + * ['en-us', 'en'] + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('acceptedLanguages', function(){ + var accept = this.get('Accept-Language'); + return accept + ? utils + .parseParams(accept) + .map(function(obj){ + return obj.value; + }) + : []; +}); + +/** + * Return an array of Accepted charsets + * ordered from highest quality to lowest. + * + * Examples: + * + * Accept-Charset: iso-8859-5;q=.2, unicode-1-1;q=0.8 + * ['unicode-1-1', 'iso-8859-5'] + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('acceptedCharsets', function(){ + var accept = this.get('Accept-Charset'); + return accept + ? utils + .parseParams(accept) + .map(function(obj){ + return obj.value; + }) + : []; +}); + +/** + * Return the value of param `name` when present or `defaultValue`. + * + * - Checks route placeholders, ex: _/user/:id_ + * - Checks body params, ex: id=12, {"id":12} + * - Checks query string params, ex: ?id=12 + * + * To utilize request bodies, `req.body` + * should be an object. This can be done by using + * the `connect.bodyParser()` middleware. + * + * @param {String} name + * @param {Mixed} [defaultValue] + * @return {String} + * @api public + */ + +req.param = function(name, defaultValue){ + var params = this.params || {}; + var body = this.body || {}; + var query = this.query || {}; + if (null != params[name] && params.hasOwnProperty(name)) return params[name]; + if (null != body[name]) return body[name]; + if (null != query[name]) return query[name]; + return defaultValue; +}; + +/** + * Check if the incoming request contains the "Content-Type" + * header field, and it contains the give mime `type`. + * + * Examples: + * + * // With Content-Type: text/html; charset=utf-8 + * req.is('html'); + * req.is('text/html'); + * req.is('text/*'); + * // => true + * + * // When Content-Type is application/json + * req.is('json'); + * req.is('application/json'); + * req.is('application/*'); + * // => true + * + * req.is('html'); + * // => false + * + * @param {String} type + * @return {Boolean} + * @api public + */ + +req.is = function(type){ + var ct = this.get('Content-Type'); + if (!ct) return false; + ct = ct.split(';')[0]; + if (!~type.indexOf('/')) type = mime.lookup(type); + if (~type.indexOf('*')) { + type = type.split('/'); + ct = ct.split('/'); + if ('*' == type[0] && type[1] == ct[1]) return true; + if ('*' == type[1] && type[0] == ct[0]) return true; + return false; + } + return !! ~ct.indexOf(type); +}; + +/** + * Return the protocol string "http" or "https" + * when requested with TLS. When the "trust proxy" + * setting is enabled the "X-Forwarded-Proto" header + * field will be trusted. If you're running behind + * a reverse proxy that supplies https for you this + * may be enabled. + * + * @return {String} + * @api public + */ + +req.__defineGetter__('protocol', function(){ + var trustProxy = this.app.get('trust proxy'); + if (this.connection.encrypted) return 'https'; + if (!trustProxy) return 'http'; + var proto = this.get('X-Forwarded-Proto') || 'http'; + return proto.split(/\s*,\s*/)[0]; +}); + +/** + * Short-hand for: + * + * req.protocol == 'https' + * + * @return {Boolean} + * @api public + */ + +req.__defineGetter__('secure', function(){ + return 'https' == this.protocol; +}); + +/** + * Return the remote address, or when + * "trust proxy" is `true` return + * the upstream addr. + * + * @return {String} + * @api public + */ + +req.__defineGetter__('ip', function(){ + return this.ips[0] || this.connection.remoteAddress; +}); + +/** + * When "trust proxy" is `true`, parse + * the "X-Forwarded-For" ip address list. + * + * For example if the value were "client, proxy1, proxy2" + * you would receive the array `["client", "proxy1", "proxy2"]` + * where "proxy2" is the furthest down-stream. + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('ips', function(){ + var trustProxy = this.app.get('trust proxy'); + var val = this.get('X-Forwarded-For'); + return trustProxy && val + ? val.split(/ *, */) + : []; +}); + +/** + * Return basic auth credentials. + * + * Examples: + * + * // http://tobi:hello@example.com + * req.auth + * // => { username: 'tobi', password: 'hello' } + * + * @return {Object} or undefined + * @api public + */ + +req.__defineGetter__('auth', function(){ + // missing + var auth = this.get('Authorization'); + if (!auth) return; + + // malformed + var parts = auth.split(' '); + if ('basic' != parts[0].toLowerCase()) return; + if (!parts[1]) return; + auth = parts[1]; + + // credentials + auth = new Buffer(auth, 'base64').toString().match(/^([^:]*):(.*)$/); + if (!auth) return; + return { username: auth[1], password: auth[2] }; +}); + +/** + * Return subdomains as an array. + * + * Subdomains are the dot-separated parts of the host before the main domain of + * the app. By default, the domain of the app is assumed to be the last two + * parts of the host. This can be changed by setting "subdomain offset". + * + * For example, if the domain is "tobi.ferrets.example.com": + * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. + * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. + * + * @return {Array} + * @api public + */ + +req.__defineGetter__('subdomains', function(){ + var offset = this.app.get('subdomain offset'); + return (this.host || '') + .split('.') + .reverse() + .slice(offset); +}); + +/** + * Short-hand for `url.parse(req.url).pathname`. + * + * @return {String} + * @api public + */ + +req.__defineGetter__('path', function(){ + return parse(this).pathname; +}); + +/** + * Parse the "Host" header field hostname. + * + * @return {String} + * @api public + */ + +req.__defineGetter__('host', function(){ + var trustProxy = this.app.get('trust proxy'); + var host = trustProxy && this.get('X-Forwarded-Host'); + host = host || this.get('Host'); + if (!host) return; + return host.split(':')[0]; +}); + +/** + * Check if the request is fresh, aka + * Last-Modified and/or the ETag + * still match. + * + * @return {Boolean} + * @api public + */ + +req.__defineGetter__('fresh', function(){ + var method = this.method; + var s = this.res.statusCode; + + // GET or HEAD for weak freshness validation only + if ('GET' != method && 'HEAD' != method) return false; + + // 2xx or 304 as per rfc2616 14.26 + if ((s >= 200 && s < 300) || 304 == s) { + return fresh(this.headers, this.res._headers); + } + + return false; +}); + +/** + * Check if the request is stale, aka + * "Last-Modified" and / or the "ETag" for the + * resource has changed. + * + * @return {Boolean} + * @api public + */ + +req.__defineGetter__('stale', function(){ + return !this.fresh; +}); + +/** + * Check if the request was an _XMLHttpRequest_. + * + * @return {Boolean} + * @api public + */ + +req.__defineGetter__('xhr', function(){ + var val = this.get('X-Requested-With') || ''; + return 'xmlhttprequest' == val.toLowerCase(); +}); diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js new file mode 100644 index 00000000..31c79c0d --- /dev/null +++ b/node_modules/express/lib/response.js @@ -0,0 +1,799 @@ +/** + * Module dependencies. + */ + +var http = require('http') + , path = require('path') + , connect = require('connect') + , utils = connect.utils + , sign = require('cookie-signature').sign + , normalizeType = require('./utils').normalizeType + , normalizeTypes = require('./utils').normalizeTypes + , etag = require('./utils').etag + , statusCodes = http.STATUS_CODES + , cookie = require('cookie') + , send = require('send') + , mime = connect.mime + , resolve = require('url').resolve + , basename = path.basename + , extname = path.extname; + +/** + * Response prototype. + */ + +var res = module.exports = { + __proto__: http.ServerResponse.prototype +}; + +/** + * Set status `code`. + * + * @param {Number} code + * @return {ServerResponse} + * @api public + */ + +res.status = function(code){ + this.statusCode = code; + return this; +}; + +/** + * Set Link header field with the given `links`. + * + * Examples: + * + * res.links({ + * next: 'http://api.example.com/users?page=2', + * last: 'http://api.example.com/users?page=5' + * }); + * + * @param {Object} links + * @return {ServerResponse} + * @api public + */ + +res.links = function(links){ + var link = this.get('Link') || ''; + if (link) link += ', '; + return this.set('Link', link + Object.keys(links).map(function(rel){ + return '<' + links[rel] + '>; rel="' + rel + '"'; + }).join(', ')); +}; + +/** + * Send a response. + * + * Examples: + * + * res.send(new Buffer('wahoo')); + * res.send({ some: 'json' }); + * res.send('

some html

'); + * res.send(404, 'Sorry, cant find that'); + * res.send(404); + * + * @param {Mixed} body or status + * @param {Mixed} body + * @return {ServerResponse} + * @api public + */ + +res.send = function(body){ + var req = this.req; + var head = 'HEAD' == req.method; + var len; + + // settings + var app = this.app; + + // allow status / body + if (2 == arguments.length) { + // res.send(body, status) backwards compat + if ('number' != typeof body && 'number' == typeof arguments[1]) { + this.statusCode = arguments[1]; + } else { + this.statusCode = body; + body = arguments[1]; + } + } + + switch (typeof body) { + // response status + case 'number': + this.get('Content-Type') || this.type('txt'); + this.statusCode = body; + body = http.STATUS_CODES[body]; + break; + // string defaulting to html + case 'string': + if (!this.get('Content-Type')) { + this.charset = this.charset || 'utf-8'; + this.type('html'); + } + break; + case 'boolean': + case 'object': + if (null == body) { + body = ''; + } else if (Buffer.isBuffer(body)) { + this.get('Content-Type') || this.type('bin'); + } else { + return this.json(body); + } + break; + } + + // populate Content-Length + if (undefined !== body && !this.get('Content-Length')) { + this.set('Content-Length', len = Buffer.isBuffer(body) + ? body.length + : Buffer.byteLength(body)); + } + + // ETag support + // TODO: W/ support + if (app.settings.etag && len && 'GET' == req.method) { + if (!this.get('ETag')) { + this.set('ETag', etag(body)); + } + } + + // freshness + if (req.fresh) this.statusCode = 304; + + // strip irrelevant headers + if (204 == this.statusCode || 304 == this.statusCode) { + this.removeHeader('Content-Type'); + this.removeHeader('Content-Length'); + this.removeHeader('Transfer-Encoding'); + body = ''; + } + + // respond + this.end(head ? null : body); + return this; +}; + +/** + * Send JSON response. + * + * Examples: + * + * res.json(null); + * res.json({ user: 'tj' }); + * res.json(500, 'oh noes!'); + * res.json(404, 'I dont have that'); + * + * @param {Mixed} obj or status + * @param {Mixed} obj + * @return {ServerResponse} + * @api public + */ + +res.json = function(obj){ + // allow status / body + if (2 == arguments.length) { + // res.json(body, status) backwards compat + if ('number' == typeof arguments[1]) { + this.statusCode = arguments[1]; + } else { + this.statusCode = obj; + obj = arguments[1]; + } + } + + // settings + var app = this.app; + var replacer = app.get('json replacer'); + var spaces = app.get('json spaces'); + var body = JSON.stringify(obj, replacer, spaces); + + // content-type + this.charset = this.charset || 'utf-8'; + this.get('Content-Type') || this.set('Content-Type', 'application/json'); + + return this.send(body); +}; + +/** + * Send JSON response with JSONP callback support. + * + * Examples: + * + * res.jsonp(null); + * res.jsonp({ user: 'tj' }); + * res.jsonp(500, 'oh noes!'); + * res.jsonp(404, 'I dont have that'); + * + * @param {Mixed} obj or status + * @param {Mixed} obj + * @return {ServerResponse} + * @api public + */ + +res.jsonp = function(obj){ + // allow status / body + if (2 == arguments.length) { + // res.json(body, status) backwards compat + if ('number' == typeof arguments[1]) { + this.statusCode = arguments[1]; + } else { + this.statusCode = obj; + obj = arguments[1]; + } + } + + // settings + var app = this.app; + var replacer = app.get('json replacer'); + var spaces = app.get('json spaces'); + var body = JSON.stringify(obj, replacer, spaces) + .replace(/\u2028/g, '\\u2028') + .replace(/\u2029/g, '\\u2029'); + var callback = this.req.query[app.get('jsonp callback name')]; + + // content-type + this.charset = this.charset || 'utf-8'; + this.set('Content-Type', 'application/json'); + + // jsonp + if (callback) { + if (Array.isArray(callback)) callback = callback[0]; + this.set('Content-Type', 'text/javascript'); + var cb = callback.replace(/[^\[\]\w$.]/g, ''); + body = 'typeof ' + cb + ' === \'function\' && ' + cb + '(' + body + ');'; + } + + return this.send(body); +}; + +/** + * Transfer the file at the given `path`. + * + * Automatically sets the _Content-Type_ response header field. + * The callback `fn(err)` is invoked when the transfer is complete + * or when an error occurs. Be sure to check `res.sentHeader` + * if you wish to attempt responding, as the header and some data + * may have already been transferred. + * + * Options: + * + * - `maxAge` defaulting to 0 + * - `root` root directory for relative filenames + * + * Examples: + * + * The following example illustrates how `res.sendfile()` may + * be used as an alternative for the `static()` middleware for + * dynamic situations. The code backing `res.sendfile()` is actually + * the same code, so HTTP cache support etc is identical. + * + * app.get('/user/:uid/photos/:file', function(req, res){ + * var uid = req.params.uid + * , file = req.params.file; + * + * req.user.mayViewFilesFrom(uid, function(yes){ + * if (yes) { + * res.sendfile('/uploads/' + uid + '/' + file); + * } else { + * res.send(403, 'Sorry! you cant see that.'); + * } + * }); + * }); + * + * @param {String} path + * @param {Object|Function} options or fn + * @param {Function} fn + * @api public + */ + +res.sendfile = function(path, options, fn){ + var self = this + , req = self.req + , next = this.req.next + , options = options || {} + , done; + + // support function as second arg + if ('function' == typeof options) { + fn = options; + options = {}; + } + + // socket errors + req.socket.on('error', error); + + // errors + function error(err) { + if (done) return; + done = true; + + // clean up + cleanup(); + if (!self.headerSent) self.removeHeader('Content-Disposition'); + + // callback available + if (fn) return fn(err); + + // list in limbo if there's no callback + if (self.headerSent) return; + + // delegate + next(err); + } + + // streaming + function stream(stream) { + if (done) return; + cleanup(); + if (fn) stream.on('end', fn); + } + + // cleanup + function cleanup() { + req.socket.removeListener('error', error); + } + + // transfer + var file = send(req, path); + if (options.root) file.root(options.root); + file.maxage(options.maxAge || 0); + file.on('error', error); + file.on('directory', next); + file.on('stream', stream); + file.pipe(this); + this.on('finish', cleanup); +}; + +/** + * Transfer the file at the given `path` as an attachment. + * + * Optionally providing an alternate attachment `filename`, + * and optional callback `fn(err)`. The callback is invoked + * when the data transfer is complete, or when an error has + * ocurred. Be sure to check `res.headerSent` if you plan to respond. + * + * This method uses `res.sendfile()`. + * + * @param {String} path + * @param {String|Function} filename or fn + * @param {Function} fn + * @api public + */ + +res.download = function(path, filename, fn){ + // support function as second arg + if ('function' == typeof filename) { + fn = filename; + filename = null; + } + + filename = filename || path; + this.set('Content-Disposition', 'attachment; filename="' + basename(filename) + '"'); + return this.sendfile(path, fn); +}; + +/** + * Set _Content-Type_ response header with `type` through `mime.lookup()` + * when it does not contain "/", or set the Content-Type to `type` otherwise. + * + * Examples: + * + * res.type('.html'); + * res.type('html'); + * res.type('json'); + * res.type('application/json'); + * res.type('png'); + * + * @param {String} type + * @return {ServerResponse} for chaining + * @api public + */ + +res.contentType = +res.type = function(type){ + return this.set('Content-Type', ~type.indexOf('/') + ? type + : mime.lookup(type)); +}; + +/** + * Respond to the Acceptable formats using an `obj` + * of mime-type callbacks. + * + * This method uses `req.accepted`, an array of + * acceptable types ordered by their quality values. + * When "Accept" is not present the _first_ callback + * is invoked, otherwise the first match is used. When + * no match is performed the server responds with + * 406 "Not Acceptable". + * + * Content-Type is set for you, however if you choose + * you may alter this within the callback using `res.type()` + * or `res.set('Content-Type', ...)`. + * + * res.format({ + * 'text/plain': function(){ + * res.send('hey'); + * }, + * + * 'text/html': function(){ + * res.send('

hey

'); + * }, + * + * 'appliation/json': function(){ + * res.send({ message: 'hey' }); + * } + * }); + * + * In addition to canonicalized MIME types you may + * also use extnames mapped to these types: + * + * res.format({ + * text: function(){ + * res.send('hey'); + * }, + * + * html: function(){ + * res.send('

hey

'); + * }, + * + * json: function(){ + * res.send({ message: 'hey' }); + * } + * }); + * + * By default Express passes an `Error` + * with a `.status` of 406 to `next(err)` + * if a match is not made. If you provide + * a `.default` callback it will be invoked + * instead. + * + * @param {Object} obj + * @return {ServerResponse} for chaining + * @api public + */ + +res.format = function(obj){ + var req = this.req + , next = req.next; + + var fn = obj.default; + if (fn) delete obj.default; + var keys = Object.keys(obj); + + var key = req.accepts(keys); + + this.vary("Accept"); + + if (key) { + var type = normalizeType(key).value; + var charset = mime.charsets.lookup(type); + if (charset) type += '; charset=' + charset; + this.set('Content-Type', type); + obj[key](req, this, next); + } else if (fn) { + fn(); + } else { + var err = new Error('Not Acceptable'); + err.status = 406; + err.types = normalizeTypes(keys).map(function(o){ return o.value }); + next(err); + } + + return this; +}; + +/** + * Set _Content-Disposition_ header to _attachment_ with optional `filename`. + * + * @param {String} filename + * @return {ServerResponse} + * @api public + */ + +res.attachment = function(filename){ + if (filename) this.type(extname(filename)); + this.set('Content-Disposition', filename + ? 'attachment; filename="' + basename(filename) + '"' + : 'attachment'); + return this; +}; + +/** + * Set header `field` to `val`, or pass + * an object of header fields. + * + * Examples: + * + * res.set('Foo', ['bar', 'baz']); + * res.set('Accept', 'application/json'); + * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); + * + * Aliased as `res.header()`. + * + * @param {String|Object|Array} field + * @param {String} val + * @return {ServerResponse} for chaining + * @api public + */ + +res.set = +res.header = function(field, val){ + if (2 == arguments.length) { + if (Array.isArray(val)) val = val.map(String); + else val = String(val); + this.setHeader(field, val); + } else { + for (var key in field) { + this.set(key, field[key]); + } + } + return this; +}; + +/** + * Get value for header `field`. + * + * @param {String} field + * @return {String} + * @api public + */ + +res.get = function(field){ + return this.getHeader(field); +}; + +/** + * Clear cookie `name`. + * + * @param {String} name + * @param {Object} options + * @param {ServerResponse} for chaining + * @api public + */ + +res.clearCookie = function(name, options){ + var opts = { expires: new Date(1), path: '/' }; + return this.cookie(name, '', options + ? utils.merge(opts, options) + : opts); +}; + +/** + * Set cookie `name` to `val`, with the given `options`. + * + * Options: + * + * - `maxAge` max-age in milliseconds, converted to `expires` + * - `signed` sign the cookie + * - `path` defaults to "/" + * + * Examples: + * + * // "Remember Me" for 15 minutes + * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); + * + * // save as above + * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) + * + * @param {String} name + * @param {String|Object} val + * @param {Options} options + * @api public + */ + +res.cookie = function(name, val, options){ + options = utils.merge({}, options); + var secret = this.req.secret; + var signed = options.signed; + if (signed && !secret) throw new Error('connect.cookieParser("secret") required for signed cookies'); + if ('number' == typeof val) val = val.toString(); + if ('object' == typeof val) val = 'j:' + JSON.stringify(val); + if (signed) val = 's:' + sign(val, secret); + if ('maxAge' in options) { + options.expires = new Date(Date.now() + options.maxAge); + options.maxAge /= 1000; + } + if (null == options.path) options.path = '/'; + this.set('Set-Cookie', cookie.serialize(name, String(val), options)); + return this; +}; + + +/** + * Set the location header to `url`. + * + * The given `url` can also be "back", which redirects + * to the _Referrer_ or _Referer_ headers or "/". + * + * Examples: + * + * res.location('/foo/bar').; + * res.location('http://example.com'); + * res.location('../login'); // /blog/post/1 -> /blog/login + * + * Mounting: + * + * When an application is mounted and `res.location()` + * is given a path that does _not_ lead with "/" it becomes + * relative to the mount-point. For example if the application + * is mounted at "/blog", the following would become "/blog/login". + * + * res.location('login'); + * + * While the leading slash would result in a location of "/login": + * + * res.location('/login'); + * + * @param {String} url + * @api public + */ + +res.location = function(url){ + var app = this.app + , req = this.req + , path; + + // "back" is an alias for the referrer + if ('back' == url) url = req.get('Referrer') || '/'; + + // relative + if (!~url.indexOf('://') && 0 != url.indexOf('//')) { + // relative to path + if ('.' == url[0]) { + path = req.originalUrl.split('?')[0]; + path = path + ('/' == path[path.length - 1] ? '' : '/'); + url = resolve(path, url); + // relative to mount-point + } else if ('/' != url[0]) { + path = app.path(); + url = path + '/' + url; + } + } + + // Respond + this.set('Location', url); + return this; +}; + +/** + * Redirect to the given `url` with optional response `status` + * defaulting to 302. + * + * The resulting `url` is determined by `res.location()`, so + * it will play nicely with mounted apps, relative paths, + * `"back"` etc. + * + * Examples: + * + * res.redirect('/foo/bar'); + * res.redirect('http://example.com'); + * res.redirect(301, 'http://example.com'); + * res.redirect('http://example.com', 301); + * res.redirect('../login'); // /blog/post/1 -> /blog/login + * + * @param {String} url + * @param {Number} code + * @api public + */ + +res.redirect = function(url){ + var head = 'HEAD' == this.req.method + , status = 302 + , body; + + // allow status / url + if (2 == arguments.length) { + if ('number' == typeof url) { + status = url; + url = arguments[1]; + } else { + status = arguments[1]; + } + } + + // Set location header + this.location(url); + url = this.get('Location'); + + // Support text/{plain,html} by default + this.format({ + text: function(){ + body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); + }, + + html: function(){ + var u = utils.escape(url); + body = '

' + statusCodes[status] + '. Redirecting to ' + u + '

'; + }, + + default: function(){ + body = ''; + } + }); + + // Respond + this.statusCode = status; + this.set('Content-Length', Buffer.byteLength(body)); + this.end(head ? null : body); +}; + +/** + * Add `field` to Vary. If already present in the Vary set, then + * this call is simply ignored. + * + * @param {Array|String} field + * @param {ServerResponse} for chaining + * @api public + */ + +res.vary = function(field){ + var self = this; + + // nothing + if (!field) return this; + + // array + if (Array.isArray(field)) { + field.forEach(function(field){ + self.vary(field); + }); + return; + } + + var vary = this.get('Vary'); + + // append + if (vary) { + vary = vary.split(/ *, */); + if (!~vary.indexOf(field)) vary.push(field); + this.set('Vary', vary.join(', ')); + return this; + } + + // set + this.set('Vary', field); + return this; +}; + +/** + * Render `view` with the given `options` and optional callback `fn`. + * When a callback function is given a response will _not_ be made + * automatically, otherwise a response of _200_ and _text/html_ is given. + * + * Options: + * + * - `cache` boolean hinting to the engine it should cache + * - `filename` filename of the view being rendered + * + * @param {String} view + * @param {Object|Function} options or callback function + * @param {Function} fn + * @api public + */ + +res.render = function(view, options, fn){ + var self = this + , options = options || {} + , req = this.req + , app = req.app; + + // support callback function as second arg + if ('function' == typeof options) { + fn = options, options = {}; + } + + // merge res.locals + options._locals = self.locals; + + // default callback to respond + fn = fn || function(err, str){ + if (err) return req.next(err); + self.send(str); + }; + + // render + app.render(view, options, fn); +}; diff --git a/node_modules/express/lib/router/index.js b/node_modules/express/lib/router/index.js new file mode 100644 index 00000000..cd2f2693 --- /dev/null +++ b/node_modules/express/lib/router/index.js @@ -0,0 +1,321 @@ +/** + * Module dependencies. + */ + +var Route = require('./route') + , utils = require('../utils') + , methods = require('methods') + , debug = require('debug')('express:router') + , parse = require('connect').utils.parseUrl; + +/** + * Expose `Router` constructor. + */ + +exports = module.exports = Router; + +/** + * Initialize a new `Router` with the given `options`. + * + * @param {Object} options + * @api private + */ + +function Router(options) { + options = options || {}; + var self = this; + this.map = {}; + this.params = {}; + this._params = []; + this.caseSensitive = options.caseSensitive; + this.strict = options.strict; + this.middleware = function router(req, res, next){ + self._dispatch(req, res, next); + }; +} + +/** + * Register a param callback `fn` for the given `name`. + * + * @param {String|Function} name + * @param {Function} fn + * @return {Router} for chaining + * @api public + */ + +Router.prototype.param = function(name, fn){ + // param logic + if ('function' == typeof name) { + this._params.push(name); + return; + } + + // apply param functions + var params = this._params + , len = params.length + , ret; + + for (var i = 0; i < len; ++i) { + if (ret = params[i](name, fn)) { + fn = ret; + } + } + + // ensure we end up with a + // middleware function + if ('function' != typeof fn) { + throw new Error('invalid param() call for ' + name + ', got ' + fn); + } + + (this.params[name] = this.params[name] || []).push(fn); + return this; +}; + +/** + * Route dispatcher aka the route "middleware". + * + * @param {IncomingMessage} req + * @param {ServerResponse} res + * @param {Function} next + * @api private + */ + +Router.prototype._dispatch = function(req, res, next){ + var params = this.params + , self = this; + + debug('dispatching %s %s (%s)', req.method, req.url, req.originalUrl); + + // route dispatch + (function pass(i, err){ + var paramCallbacks + , paramIndex = 0 + , paramVal + , route + , keys + , key; + + // match next route + function nextRoute(err) { + pass(req._route_index + 1, err); + } + + // match route + req.route = route = self.matchRequest(req, i); + + // implied OPTIONS + if (!route && 'OPTIONS' == req.method) return self._options(req, res, next); + + // no route + if (!route) return next(err); + debug('matched %s %s', route.method, route.path); + + // we have a route + // start at param 0 + req.params = route.params; + keys = route.keys; + i = 0; + + // param callbacks + function param(err) { + paramIndex = 0; + key = keys[i++]; + paramVal = key && req.params[key.name]; + paramCallbacks = key && params[key.name]; + + try { + if ('route' == err) { + nextRoute(); + } else if (err) { + i = 0; + callbacks(err); + } else if (paramCallbacks && undefined !== paramVal) { + paramCallback(); + } else if (key) { + param(); + } else { + i = 0; + callbacks(); + } + } catch (err) { + param(err); + } + }; + + param(err); + + // single param callbacks + function paramCallback(err) { + var fn = paramCallbacks[paramIndex++]; + if (err || !fn) return param(err); + fn(req, res, paramCallback, paramVal, key.name); + } + + // invoke route callbacks + function callbacks(err) { + var fn = route.callbacks[i++]; + try { + if ('route' == err) { + nextRoute(); + } else if (err && fn) { + if (fn.length < 4) return callbacks(err); + fn(err, req, res, callbacks); + } else if (fn) { + if (fn.length < 4) return fn(req, res, callbacks); + callbacks(); + } else { + nextRoute(err); + } + } catch (err) { + callbacks(err); + } + } + })(0); +}; + +/** + * Respond to __OPTIONS__ method. + * + * @param {IncomingMessage} req + * @param {ServerResponse} res + * @api private + */ + +Router.prototype._options = function(req, res, next){ + var path = parse(req).pathname + , body = this._optionsFor(path).join(','); + if (!body) return next(); + res.set('Allow', body).send(body); +}; + +/** + * Return an array of HTTP verbs or "options" for `path`. + * + * @param {String} path + * @return {Array} + * @api private + */ + +Router.prototype._optionsFor = function(path){ + var self = this; + return methods.filter(function(method){ + var routes = self.map[method]; + if (!routes || 'options' == method) return; + for (var i = 0, len = routes.length; i < len; ++i) { + if (routes[i].match(path)) return true; + } + }).map(function(method){ + return method.toUpperCase(); + }); +}; + +/** + * Attempt to match a route for `req` + * with optional starting index of `i` + * defaulting to 0. + * + * @param {IncomingMessage} req + * @param {Number} i + * @return {Route} + * @api private + */ + +Router.prototype.matchRequest = function(req, i, head){ + var method = req.method.toLowerCase() + , url = parse(req) + , path = url.pathname + , routes = this.map + , i = i || 0 + , route; + + // HEAD support + if (!head && 'head' == method) { + route = this.matchRequest(req, i, true); + if (route) return route; + method = 'get'; + } + + // routes for this method + if (routes = routes[method]) { + + // matching routes + for (var len = routes.length; i < len; ++i) { + route = routes[i]; + if (route.match(path)) { + req._route_index = i; + return route; + } + } + } +}; + +/** + * Attempt to match a route for `method` + * and `url` with optional starting + * index of `i` defaulting to 0. + * + * @param {String} method + * @param {String} url + * @param {Number} i + * @return {Route} + * @api private + */ + +Router.prototype.match = function(method, url, i, head){ + var req = { method: method, url: url }; + return this.matchRequest(req, i, head); +}; + +/** + * Route `method`, `path`, and one or more callbacks. + * + * @param {String} method + * @param {String} path + * @param {Function} callback... + * @return {Router} for chaining + * @api private + */ + +Router.prototype.route = function(method, path, callbacks){ + var method = method.toLowerCase() + , callbacks = utils.flatten([].slice.call(arguments, 2)); + + // ensure path was given + if (!path) throw new Error('Router#' + method + '() requires a path'); + + // ensure all callbacks are functions + callbacks.forEach(function(fn){ + if ('function' == typeof fn) return; + var type = {}.toString.call(fn); + var msg = '.' + method + '() requires callback functions but got a ' + type; + throw new Error(msg); + }); + + // create the route + debug('defined %s %s', method, path); + var route = new Route(method, path, callbacks, { + sensitive: this.caseSensitive, + strict: this.strict + }); + + // add it + (this.map[method] = this.map[method] || []).push(route); + return this; +}; + +Router.prototype.all = function(path) { + var self = this; + var args = [].slice.call(arguments); + methods.forEach(function(method){ + self.route.apply(self, [method].concat(args)); + }); + return this; +}; + +methods.forEach(function(method){ + Router.prototype[method] = function(path){ + var args = [method].concat([].slice.call(arguments)); + this.route.apply(this, args); + return this; + }; +}); diff --git a/node_modules/express/lib/router/route.js b/node_modules/express/lib/router/route.js new file mode 100644 index 00000000..d7ec88d2 --- /dev/null +++ b/node_modules/express/lib/router/route.js @@ -0,0 +1,78 @@ + +/** + * Module dependencies. + */ + +var utils = require('../utils'); + +/** + * Expose `Route`. + */ + +module.exports = Route; + +/** + * Initialize `Route` with the given HTTP `method`, `path`, + * and an array of `callbacks` and `options`. + * + * Options: + * + * - `sensitive` enable case-sensitive routes + * - `strict` enable strict matching for trailing slashes + * + * @param {String} method + * @param {String} path + * @param {Array} callbacks + * @param {Object} options. + * @api private + */ + +function Route(method, path, callbacks, options) { + options = options || {}; + this.path = path; + this.method = method; + this.callbacks = callbacks; + this.regexp = utils.pathRegexp(path + , this.keys = [] + , options.sensitive + , options.strict); +} + +/** + * Check if this route matches `path`, if so + * populate `.params`. + * + * @param {String} path + * @return {Boolean} + * @api private + */ + +Route.prototype.match = function(path){ + var keys = this.keys + , params = this.params = [] + , m = this.regexp.exec(path); + + if (!m) return false; + + for (var i = 1, len = m.length; i < len; ++i) { + var key = keys[i - 1]; + + try { + var val = 'string' == typeof m[i] + ? decodeURIComponent(m[i]) + : m[i]; + } catch(e) { + var err = new Error("Failed to decode param '" + m[i] + "'"); + err.status = 400; + throw err; + } + + if (key) { + params[key.name] = val; + } else { + params.push(val); + } + } + + return true; +}; diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js new file mode 100644 index 00000000..b30873a8 --- /dev/null +++ b/node_modules/express/lib/utils.js @@ -0,0 +1,314 @@ + +/** + * Module dependencies. + */ + +var mime = require('connect').mime + , crc32 = require('buffer-crc32'); + +/** + * toString ref. + */ + +var toString = {}.toString; + +/** + * Return ETag for `body`. + * + * @param {String|Buffer} body + * @return {String} + * @api private + */ + +exports.etag = function(body){ + return '"' + crc32.signed(body) + '"'; +}; + +/** + * Make `locals()` bound to the given `obj`. + * + * This is used for `app.locals` and `res.locals`. + * + * @param {Object} obj + * @return {Function} + * @api private + */ + +exports.locals = function(){ + function locals(obj){ + for (var key in obj) locals[key] = obj[key]; + return obj; + }; + + return locals; +}; + +/** + * Check if `path` looks absolute. + * + * @param {String} path + * @return {Boolean} + * @api private + */ + +exports.isAbsolute = function(path){ + if ('/' == path[0]) return true; + if (':' == path[1] && '\\' == path[2]) return true; + if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path +}; + +/** + * Flatten the given `arr`. + * + * @param {Array} arr + * @return {Array} + * @api private + */ + +exports.flatten = function(arr, ret){ + var ret = ret || [] + , len = arr.length; + for (var i = 0; i < len; ++i) { + if (Array.isArray(arr[i])) { + exports.flatten(arr[i], ret); + } else { + ret.push(arr[i]); + } + } + return ret; +}; + +/** + * Normalize the given `type`, for example "html" becomes "text/html". + * + * @param {String} type + * @return {Object} + * @api private + */ + +exports.normalizeType = function(type){ + return ~type.indexOf('/') + ? acceptParams(type) + : { value: mime.lookup(type), params: {} }; +}; + +/** + * Normalize `types`, for example "html" becomes "text/html". + * + * @param {Array} types + * @return {Array} + * @api private + */ + +exports.normalizeTypes = function(types){ + var ret = []; + + for (var i = 0; i < types.length; ++i) { + ret.push(exports.normalizeType(types[i])); + } + + return ret; +}; + +/** + * Return the acceptable type in `types`, if any. + * + * @param {Array} types + * @param {String} str + * @return {String} + * @api private + */ + +exports.acceptsArray = function(types, str){ + // accept anything when Accept is not present + if (!str) return types[0]; + + // parse + var accepted = exports.parseAccept(str) + , normalized = exports.normalizeTypes(types) + , len = accepted.length; + + for (var i = 0; i < len; ++i) { + for (var j = 0, jlen = types.length; j < jlen; ++j) { + if (exports.accept(normalized[j], accepted[i])) { + return types[j]; + } + } + } +}; + +/** + * Check if `type(s)` are acceptable based on + * the given `str`. + * + * @param {String|Array} type(s) + * @param {String} str + * @return {Boolean|String} + * @api private + */ + +exports.accepts = function(type, str){ + if ('string' == typeof type) type = type.split(/ *, */); + return exports.acceptsArray(type, str); +}; + +/** + * Check if `type` array is acceptable for `other`. + * + * @param {Object} type + * @param {Object} other + * @return {Boolean} + * @api private + */ + +exports.accept = function(type, other){ + var t = type.value.split('/'); + return (t[0] == other.type || '*' == other.type) + && (t[1] == other.subtype || '*' == other.subtype) + && paramsEqual(type.params, other.params); +}; + +/** + * Check if accept params are equal. + * + * @param {Object} a + * @param {Object} b + * @return {Boolean} + * @api private + */ + +function paramsEqual(a, b){ + return !Object.keys(a).some(function(k) { + return a[k] != b[k]; + }); +} + +/** + * Parse accept `str`, returning + * an array objects containing + * `.type` and `.subtype` along + * with the values provided by + * `parseQuality()`. + * + * @param {Type} name + * @return {Type} + * @api private + */ + +exports.parseAccept = function(str){ + return exports + .parseParams(str) + .map(function(obj){ + var parts = obj.value.split('/'); + obj.type = parts[0]; + obj.subtype = parts[1]; + return obj; + }); +}; + +/** + * Parse quality `str`, returning an + * array of objects with `.value`, + * `.quality` and optional `.params` + * + * @param {String} str + * @return {Array} + * @api private + */ + +exports.parseParams = function(str){ + return str + .split(/ *, */) + .map(acceptParams) + .filter(function(obj){ + return obj.quality; + }) + .sort(function(a, b){ + if (a.quality === b.quality) { + return a.originalIndex - b.originalIndex; + } else { + return b.quality - a.quality; + } + }); +}; + +/** + * Parse accept params `str` returning an + * object with `.value`, `.quality` and `.params`. + * also includes `.originalIndex` for stable sorting + * + * @param {String} str + * @return {Object} + * @api private + */ + +function acceptParams(str, index) { + var parts = str.split(/ *; */); + var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; + + for (var i = 1; i < parts.length; ++i) { + var pms = parts[i].split(/ *= */); + if ('q' == pms[0]) { + ret.quality = parseFloat(pms[1]); + } else { + ret.params[pms[0]] = pms[1]; + } + } + + return ret; +} + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html) { + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Normalize the given path string, + * returning a regular expression. + * + * An empty array should be passed, + * which will contain the placeholder + * key names. For example "/user/:id" will + * then contain ["id"]. + * + * @param {String|RegExp|Array} path + * @param {Array} keys + * @param {Boolean} sensitive + * @param {Boolean} strict + * @return {RegExp} + * @api private + */ + +exports.pathRegexp = function(path, keys, sensitive, strict) { + if (toString.call(path) == '[object RegExp]') return path; + if (Array.isArray(path)) path = '(' + path.join('|') + ')'; + path = path + .concat(strict ? '' : '/?') + .replace(/\/\(/g, '(?:/') + .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function(_, slash, format, key, capture, optional, star){ + keys.push({ name: key, optional: !! optional }); + slash = slash || ''; + return '' + + (optional ? '' : slash) + + '(?:' + + (optional ? slash : '') + + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' + + (optional || '') + + (star ? '(/*)?' : ''); + }) + .replace(/([\/.])/g, '\\$1') + .replace(/\*/g, '(.*)'); + return new RegExp('^' + path + '$', sensitive ? '' : 'i'); +} diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js new file mode 100644 index 00000000..b9dc69e0 --- /dev/null +++ b/node_modules/express/lib/view.js @@ -0,0 +1,77 @@ +/** + * Module dependencies. + */ + +var path = require('path') + , fs = require('fs') + , utils = require('./utils') + , dirname = path.dirname + , basename = path.basename + , extname = path.extname + , exists = fs.existsSync || path.existsSync + , join = path.join; + +/** + * Expose `View`. + */ + +module.exports = View; + +/** + * Initialize a new `View` with the given `name`. + * + * Options: + * + * - `defaultEngine` the default template engine name + * - `engines` template engine require() cache + * - `root` root path for view lookup + * + * @param {String} name + * @param {Object} options + * @api private + */ + +function View(name, options) { + options = options || {}; + this.name = name; + this.root = options.root; + var engines = options.engines; + this.defaultEngine = options.defaultEngine; + var ext = this.ext = extname(name); + if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); + if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); + this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); + this.path = this.lookup(name); +} + +/** + * Lookup view by the given `path` + * + * @param {String} path + * @return {String} + * @api private + */ + +View.prototype.lookup = function(path){ + var ext = this.ext; + + // . + if (!utils.isAbsolute(path)) path = join(this.root, path); + if (exists(path)) return path; + + // /index. + path = join(dirname(path), basename(path, ext), 'index' + ext); + if (exists(path)) return path; +}; + +/** + * Render with the given `options` and callback `fn(err, str)`. + * + * @param {Object} options + * @param {Function} fn + * @api private + */ + +View.prototype.render = function(options, fn){ + this.engine(this.path, options, fn); +}; diff --git a/node_modules/express/node_modules/buffer-crc32/.npmignore b/node_modules/express/node_modules/buffer-crc32/.npmignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/.npmignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/.travis.yml b/node_modules/express/node_modules/buffer-crc32/.travis.yml new file mode 100644 index 00000000..7a902e8c --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - 0.6 + - 0.8 +notifications: + email: + recipients: + - brianloveswords@gmail.com \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/buffer-crc32/README.md new file mode 100644 index 00000000..0d9d8b83 --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/README.md @@ -0,0 +1,47 @@ +# buffer-crc32 + +[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) + +crc32 that works with binary data and fancy character sets, outputs +buffer, signed or unsigned data and has tests. + +Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix + +# install +``` +npm install buffer-crc32 +``` + +# example +```js +var crc32 = require('buffer-crc32'); +// works with buffers +var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) +crc32(buf) // -> + +// has convenience methods for getting signed or unsigned ints +crc32.signed(buf) // -> -1805997238 +crc32.unsigned(buf) // -> 2488970058 + +// will cast to buffer if given a string, so you can +// directly use foreign characters safely +crc32('自動販売機') // -> + +// and works in append mode too +var partialCrc = crc32('hey'); +var partialCrc = crc32(' ', partialCrc); +var partialCrc = crc32('sup', partialCrc); +var partialCrc = crc32(' ', partialCrc); +var finalCrc = crc32('bros', partialCrc); // -> +``` + +# tests +This was tested against the output of zlib's crc32 method. You can run +the tests with`npm test` (requires tap) + +# see also +https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also +supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). + +# license +MIT/X11 diff --git a/node_modules/express/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/buffer-crc32/index.js new file mode 100644 index 00000000..e29ce3eb --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/index.js @@ -0,0 +1,88 @@ +var Buffer = require('buffer').Buffer; + +var CRC_TABLE = [ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d +]; + +function bufferizeInt(num) { + var tmp = Buffer(4); + tmp.writeInt32BE(num, 0); + return tmp; +} + +function _crc32(buf, previous) { + if (!Buffer.isBuffer(buf)) { + buf = Buffer(buf); + } + if (Buffer.isBuffer(previous)) { + previous = previous.readUInt32BE(0); + } + var crc = ~~previous ^ -1; + for (var n = 0; n < buf.length; n++) { + crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); + } + return (crc ^ -1); +} + +function crc32() { + return bufferizeInt(_crc32.apply(null, arguments)); +} +crc32.signed = function () { + return _crc32.apply(null, arguments); +}; +crc32.unsigned = function () { + return _crc32.apply(null, arguments) >>> 0; +}; + +module.exports = crc32; diff --git a/node_modules/express/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/buffer-crc32/package.json new file mode 100644 index 00000000..0ce14940 --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/package.json @@ -0,0 +1,43 @@ +{ + "author": { + "name": "Brian J. Brennan", + "email": "brianloveswords@gmail.com", + "url": "http://bjb.io" + }, + "name": "buffer-crc32", + "description": "A pure javascript CRC32 algorithm that plays nice with binary data", + "version": "0.2.1", + "contributors": [ + { + "name": "Vladimir Kuznetsov" + } + ], + "homepage": "https://github.com/brianloveswords/buffer-crc32", + "repository": { + "type": "git", + "url": "git://github.com/brianloveswords/buffer-crc32.git" + }, + "main": "index.js", + "scripts": { + "test": "tap tests/*.test.js" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.2.5" + }, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n\n// and works in append mode too\nvar partialCrc = crc32('hey');\nvar partialCrc = crc32(' ', partialCrc);\nvar partialCrc = crc32('sup', partialCrc);\nvar partialCrc = crc32(' ', partialCrc);\nvar finalCrc = crc32('bros', partialCrc); // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n\n# see also\nhttps://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also\nsupports buffer inputs and return unsigned ints (thanks @tjholowaychuk).\n\n# license\nMIT/X11\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/brianloveswords/buffer-crc32/issues" + }, + "_id": "buffer-crc32@0.2.1", + "dist": { + "shasum": "be3e5382fc02b6d6324956ac1af98aa98b08534c" + }, + "_from": "buffer-crc32@0.2.1", + "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" +} diff --git a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js new file mode 100644 index 00000000..bb0f9efc --- /dev/null +++ b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js @@ -0,0 +1,89 @@ +var crc32 = require('..'); +var test = require('tap').test; + +test('simple crc32 is no problem', function (t) { + var input = Buffer('hey sup bros'); + var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); + t.same(crc32(input), expected); + t.end(); +}); + +test('another simple one', function (t) { + var input = Buffer('IEND'); + var expected = Buffer([0xae, 0x42, 0x60, 0x82]); + t.same(crc32(input), expected); + t.end(); +}); + +test('slightly more complex', function (t) { + var input = Buffer([0x00, 0x00, 0x00]); + var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); + t.same(crc32(input), expected); + t.end(); +}); + +test('complex crc32 gets calculated like a champ', function (t) { + var input = Buffer('शीर्षक'); + var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); + t.same(crc32(input), expected); + t.end(); +}); + +test('casts to buffer if necessary', function (t) { + var input = 'शीर्षक'; + var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); + t.same(crc32(input), expected); + t.end(); +}); + +test('can do signed', function (t) { + var input = 'ham sandwich'; + var expected = -1891873021; + t.same(crc32.signed(input), expected); + t.end(); +}); + +test('can do unsigned', function (t) { + var input = 'bear sandwich'; + var expected = 3711466352; + t.same(crc32.unsigned(input), expected); + t.end(); +}); + + +test('simple crc32 in append mode', function (t) { + var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; + var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); + for (var crc = 0, i = 0; i < input.length; i++) { + crc = crc32(input[i], crc); + } + t.same(crc, expected); + t.end(); +}); + + +test('can do signed in append mode', function (t) { + var input1 = 'ham'; + var input2 = ' '; + var input3 = 'sandwich'; + var expected = -1891873021; + + var crc = crc32.signed(input1); + crc = crc32.signed(input2, crc); + crc = crc32.signed(input3, crc); + + t.same(crc, expected); + t.end(); +}); + +test('can do unsigned in append mode', function (t) { + var input1 = 'bear san'; + var input2 = 'dwich'; + var expected = 3711466352; + + var crc = crc32.unsigned(input1); + crc = crc32.unsigned(input2, crc); + t.same(crc, expected); + t.end(); +}); + diff --git a/node_modules/express/node_modules/commander/History.md b/node_modules/express/node_modules/commander/History.md new file mode 100644 index 00000000..ce046f6f --- /dev/null +++ b/node_modules/express/node_modules/commander/History.md @@ -0,0 +1,174 @@ + +1.3.2 / 2013-07-18 +================== + + * add support for sub-commands to co-exist with the original command + +1.3.1 / 2013-07-18 +================== + + * add quick .runningCommand hack so you can opt-out of other logic when running a sub command + +1.3.0 / 2013-07-09 +================== + + * add EACCES error handling + * fix sub-command --help + +1.2.0 / 2013-06-13 +================== + + * allow "-" hyphen as an option argument + * support for RegExp coercion + +1.1.1 / 2012-11-20 +================== + + * add more sub-command padding + * fix .usage() when args are present. Closes #106 + +1.1.0 / 2012-11-16 +================== + + * add git-style executable subcommand support. Closes #94 + +1.0.5 / 2012-10-09 +================== + + * fix `--name` clobbering. Closes #92 + * fix examples/help. Closes #89 + +1.0.4 / 2012-09-03 +================== + + * add `outputHelp()` method. + +1.0.3 / 2012-08-30 +================== + + * remove invalid .version() defaulting + +1.0.2 / 2012-08-24 +================== + + * add `--foo=bar` support [arv] + * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus] + +1.0.1 / 2012-08-03 +================== + + * fix issue #56 + * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode()) + +1.0.0 / 2012-07-05 +================== + + * add support for optional option descriptions + * add defaulting of `.version()` to package.json's version + +0.6.1 / 2012-06-01 +================== + + * Added: append (yes or no) on confirmation + * Added: allow node.js v0.7.x + +0.6.0 / 2012-04-10 +================== + + * Added `.prompt(obj, callback)` support. Closes #49 + * Added default support to .choose(). Closes #41 + * Fixed the choice example + +0.5.1 / 2011-12-20 +================== + + * Fixed `password()` for recent nodes. Closes #36 + +0.5.0 / 2011-12-04 +================== + + * Added sub-command option support [itay] + +0.4.3 / 2011-12-04 +================== + + * Fixed custom help ordering. Closes #32 + +0.4.2 / 2011-11-24 +================== + + * Added travis support + * Fixed: line-buffered input automatically trimmed. Closes #31 + +0.4.1 / 2011-11-18 +================== + + * Removed listening for "close" on --help + +0.4.0 / 2011-11-15 +================== + + * Added support for `--`. Closes #24 + +0.3.3 / 2011-11-14 +================== + + * Fixed: wait for close event when writing help info [Jerry Hamlet] + +0.3.2 / 2011-11-01 +================== + + * Fixed long flag definitions with values [felixge] + +0.3.1 / 2011-10-31 +================== + + * Changed `--version` short flag to `-V` from `-v` + * Changed `.version()` so it's configurable [felixge] + +0.3.0 / 2011-10-31 +================== + + * Added support for long flags only. Closes #18 + +0.2.1 / 2011-10-24 +================== + + * "node": ">= 0.4.x < 0.7.0". Closes #20 + +0.2.0 / 2011-09-26 +================== + + * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] + +0.1.0 / 2011-08-24 +================== + + * Added support for custom `--help` output + +0.0.5 / 2011-08-18 +================== + + * Changed: when the user enters nothing prompt for password again + * Fixed issue with passwords beginning with numbers [NuckChorris] + +0.0.4 / 2011-08-15 +================== + + * Fixed `Commander#args` + +0.0.3 / 2011-08-15 +================== + + * Added default option value support + +0.0.2 / 2011-08-15 +================== + + * Added mask support to `Command#password(str[, mask], fn)` + * Added `Command#password(str, fn)` + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/node_modules/commander/Readme.md b/node_modules/express/node_modules/commander/Readme.md new file mode 100644 index 00000000..ed0aeb2c --- /dev/null +++ b/node_modules/express/node_modules/commander/Readme.md @@ -0,0 +1,276 @@ +# Commander.js + + The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). + + [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) + +## Installation + + $ npm install commander + +## Option parsing + + Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander'); + +program + .version('0.0.1') + .option('-p, --peppers', 'Add peppers') + .option('-P, --pineapple', 'Add pineapple') + .option('-b, --bbq', 'Add bbq sauce') + .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') + .parse(process.argv); + +console.log('you ordered a pizza with:'); +if (program.peppers) console.log(' - peppers'); +if (program.pineapple) console.log(' - pineapple'); +if (program.bbq) console.log(' - bbq'); +console.log(' - %s cheese', program.cheese); +``` + + Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +``` + $ ./examples/pizza --help + + Usage: pizza [options] + + Options: + + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineapple + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese [marble] + -h, --help output usage information + +``` + +## Coercion + +```js +function range(val) { + return val.split('..').map(Number); +} + +function list(val) { + return val.split(','); +} + +program + .version('0.0.1') + .usage('[options] ') + .option('-i, --integer ', 'An integer argument', parseInt) + .option('-f, --float ', 'A float argument', parseFloat) + .option('-r, --range ..', 'A range', range) + .option('-l, --list ', 'A list', list) + .option('-o, --optional [value]', 'An optional value') + .parse(process.argv); + +console.log(' int: %j', program.integer); +console.log(' float: %j', program.float); +console.log(' optional: %j', program.optional); +program.range = program.range || []; +console.log(' range: %j..%j', program.range[0], program.range[1]); +console.log(' list: %j', program.list); +console.log(' args: %j', program.args); +``` + +## Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviours, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('../'); + +function list(val) { + return val.split(',').map(Number); +} + +program + .version('0.0.1') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); + console.log(''); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +yielding the following help output: + +``` + +Usage: custom-help [options] + +Options: + + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + + $ custom-help --help + $ custom-help -h + +``` + +## .prompt(msg, fn) + + Single-line prompt: + +```js +program.prompt('name: ', function(name){ + console.log('hi %s', name); +}); +``` + + Multi-line prompt: + +```js +program.prompt('description:', function(name){ + console.log('hi %s', name); +}); +``` + + Coercion: + +```js +program.prompt('Age: ', Number, function(age){ + console.log('age: %j', age); +}); +``` + +```js +program.prompt('Birthdate: ', Date, function(date){ + console.log('date: %s', date); +}); +``` + +```js +program.prompt('Email: ', /^.+@.+\..+$/, function(email){ + console.log('email: %j', email); +}); +``` + +## .password(msg[, mask], fn) + +Prompt for password without echoing: + +```js +program.password('Password: ', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +Prompt for password with mask char "*": + +```js +program.password('Password: ', '*', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +## .confirm(msg, fn) + + Confirm with the given `msg`: + +```js +program.confirm('continue? ', function(ok){ + console.log(' got %j', ok); +}); +``` + +## .choose(list, fn) + + Let the user choose from a `list`: + +```js +var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + +console.log('Choose the coolest pet:'); +program.choose(list, function(i){ + console.log('you chose %d "%s"', i, list[i]); +}); +``` + +## .outputHelp() + + Output help information without exiting. + +## .help() + + Output help information and exit immediately. + +## Links + + - [API documentation](http://visionmedia.github.com/commander.js/) + - [ascii tables](https://github.com/LearnBoost/cli-table) + - [progress bars](https://github.com/visionmedia/node-progress) + - [more progress bars](https://github.com/substack/node-multimeter) + - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) + +## License + +(The MIT License) + +Copyright (c) 2011 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/express/node_modules/commander/index.js b/node_modules/express/node_modules/commander/index.js new file mode 100644 index 00000000..d9634e34 --- /dev/null +++ b/node_modules/express/node_modules/commander/index.js @@ -0,0 +1,1160 @@ +/*! + * commander + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , spawn = require('child_process').spawn + , keypress = require('keypress') + , fs = require('fs') + , exists = fs.existsSync + , path = require('path') + , tty = require('tty') + , dirname = path.dirname + , basename = path.basename; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command; + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = ~flags.indexOf('<'); + this.optional = ~flags.indexOf('['); + this.bool = !~flags.indexOf('-no-'); + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description || ''; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function(){ + return this.long + .replace('--', '') + .replace('no-', ''); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg){ + return arg == this.short + || arg == this.long; +}; + +/** + * Initialize a new `Command`. + * + * @param {String} name + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this._execs = []; + this._args = []; + this._name = name; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Command.prototype.__proto__ = EventEmitter.prototype; + +/** + * Add command `name`. + * + * The `.action()` callback is invoked when the + * command `name` is specified via __ARGV__, + * and the remaining arguments are applied to the + * function for access. + * + * When the `name` is "*" an un-matched command + * will be passed as the first arg, followed by + * the rest of __ARGV__ remaining. + * + * Examples: + * + * program + * .version('0.0.1') + * .option('-C, --chdir ', 'change the working directory') + * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + * .option('-T, --no-tests', 'ignore test hook') + * + * program + * .command('setup') + * .description('run remote setup commands') + * .action(function(){ + * console.log('setup'); + * }); + * + * program + * .command('exec ') + * .description('run the given remote command') + * .action(function(cmd){ + * console.log('exec "%s"', cmd); + * }); + * + * program + * .command('*') + * .description('deploy the given env') + * .action(function(env){ + * console.log('deploying "%s"', env); + * }); + * + * program.parse(process.argv); + * + * @param {String} name + * @param {String} [desc] + * @return {Command} the new command + * @api public + */ + +Command.prototype.command = function(name, desc){ + var args = name.split(/ +/); + var cmd = new Command(args.shift()); + if (desc) cmd.description(desc); + if (desc) this.executables = true; + if (desc) this._execs[cmd._name] = true; + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + if (desc) return this; + return cmd; +}; + +/** + * Add an implicit `help [cmd]` subcommand + * which invokes `--help` for the given command. + * + * @api private + */ + +Command.prototype.addImplicitHelpCommand = function() { + this.command('help [cmd]', 'display help for [cmd]'); +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args){ + if (!args.length) return; + var self = this; + args.forEach(function(arg){ + switch (arg[0]) { + case '<': + self._args.push({ required: true, name: arg.slice(1, -1) }); + break; + case '[': + self._args.push({ required: false, name: arg.slice(1, -1) }); + break; + } + }); + return this; +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function(){ + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn){ + var self = this; + this.parent.on(this._name, function(args, unknown){ + // Parse any so-far unknown options + unknown = unknown || []; + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfNecessary(self, parsed.unknown); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + // Leftover arguments need to be pushed back. Fixes issue #56 + if (parsed.args.length) args = parsed.args.concat(args); + + self._args.forEach(function(arg, i){ + if (arg.required && null == args[i]) { + self.missingArgument(arg.name); + } + }); + + // Always append ourselves to the end of the arguments, + // to make sure we match the number of arguments the user + // expects + if (self._args.length) { + args[self._args.length] = self; + } else { + args.push(self); + } + + fn.apply(this, args); + }); + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to false + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => true + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|Mixed} fn or default + * @param {Mixed} defaultValue + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue){ + var self = this + , option = new Option(flags, description) + , oname = option.name() + , name = camelcase(oname); + + // default as 3rd arg + if ('function' != typeof fn) defaultValue = fn, fn = null; + + // preassign default value only for --no-*, [optional], or + if (false == option.bool || option.optional || option.required) { + // when --no-* we make sure default is true + if (false == option.bool) defaultValue = true; + // preassign only if we have a default + if (undefined !== defaultValue) self[name] = defaultValue; + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on(oname, function(val){ + // coercion + if (null != val && fn) val = fn(val); + + // unassigned or bool + if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { + // if no value, bool true, and we have a default, then use it! + if (null == val) { + self[name] = option.bool + ? defaultValue || true + : false; + } else { + self[name] = val; + } + } else if (null !== val) { + // reassign + self[name] = val; + } + }); + + return this; +}; + +/** + * Parse `argv`, settings options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv){ + // implicit help + if (this.executables) this.addImplicitHelpCommand(); + + // store raw args + this.rawArgs = argv; + + // guess name + this._name = this._name || basename(argv[1]); + + // process argv + var parsed = this.parseOptions(this.normalize(argv.slice(2))); + var args = this.args = parsed.args; + + var result = this.parseArgs(this.args, parsed.unknown); + + // executable sub-commands + var name = result.args[0]; + if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown); + + return result; +}; + +/** + * Execute a sub-command executable. + * + * @param {Array} argv + * @param {Array} args + * @param {Array} unknown + * @api private + */ + +Command.prototype.executeSubCommand = function(argv, args, unknown) { + args = args.concat(unknown); + + if (!args.length) this.help(); + if ('help' == args[0] && 1 == args.length) this.help(); + + // --help + if ('help' == args[0]) { + args[0] = args[1]; + args[1] = '--help'; + } + + // executable + var dir = dirname(argv[1]); + var bin = basename(argv[1]) + '-' + args[0]; + + // check for ./ first + var local = path.join(dir, bin); + + // run it + args = args.slice(1); + var proc = spawn(local, args, { stdio: 'inherit', customFds: [0, 1, 2] }); + proc.on('error', function(err){ + if (err.code == "ENOENT") { + console.error('\n %s(1) does not exist, try --help\n', bin); + } else if (err.code == "EACCES") { + console.error('\n %s(1) not executable. try chmod or run with root\n', bin); + } + }); + + this.runningCommand = proc; +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * This also normalizes equal sign and splits "--abc=def" into "--abc def". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args){ + var ret = [] + , arg + , index; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { + arg.slice(1).split('').forEach(function(c){ + ret.push('-' + c); + }); + } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { + ret.push(arg.slice(0, index), arg.slice(index + 1)); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown){ + var cmds = this.commands + , len = cmds.length + , name; + + if (args.length) { + name = args[0]; + if (this.listeners(name).length) { + this.emit(args.shift(), args, unknown); + } else { + this.emit('*', args); + } + } else { + outputHelpIfNecessary(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0) { + this.unknownOption(unknown[0]); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg){ + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {Array} + * @api public + */ + +Command.prototype.parseOptions = function(argv){ + var args = [] + , len = argv.length + , literal + , option + , arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if ('--' == arg) { + literal = true; + continue; + } + + if (literal) { + args.push(arg); + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (null == arg) return this.optionMissingArgument(option); + if ('-' == arg[0] && '-' != arg) return this.optionMissingArgument(option, arg); + this.emit(option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i+1]; + if (null == arg || ('-' == arg[0] && '-' != arg)) { + arg = null; + } else { + ++i; + } + this.emit(option.name(), arg); + // bool + } else { + this.emit(option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && '-' == arg[0]) { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if (argv[i+1] && '-' != argv[i+1][0]) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name){ + console.error(); + console.error(" error: missing required argument `%s'", name); + console.error(); + process.exit(1); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {String} option + * @param {String} flag + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag){ + console.error(); + if (flag) { + console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); + } else { + console.error(" error: option `%s' argument missing", option.flags); + } + console.error(); + process.exit(1); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag){ + console.error(); + console.error(" error: unknown option `%s'", flag); + console.error(); + process.exit(1); +}; + + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * @param {String} str + * @param {String} flags + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags){ + if (0 == arguments.length) return this._version; + this._version = str; + flags = flags || '-V, --version'; + this.option(flags, 'output the version number'); + this.on('version', function(){ + console.log(str); + process.exit(0); + }); + return this; +}; + +/** + * Set the description `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str){ + if (0 == arguments.length) return this._description; + this._description = str; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str){ + var args = this._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }); + + var usage = '[options' + + (this.commands.length ? '] [command' : '') + + ']' + + (this._args.length ? ' ' + args : ''); + + if (0 == arguments.length) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function(){ + return this.options.reduce(function(max, option){ + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function(){ + var width = this.largestOptionLength(); + + // Prepend the help information + return [pad('-h, --help', width) + ' ' + 'output usage information'] + .concat(this.options.map(function(option){ + return pad(option.flags, width) + + ' ' + option.description; + })) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function(){ + if (!this.commands.length) return ''; + return [ + '' + , ' Commands:' + , '' + , this.commands.map(function(cmd){ + var args = cmd._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }).join(' '); + + return pad(cmd._name + + (cmd.options.length + ? ' [options]' + : '') + ' ' + args, 22) + + (cmd.description() + ? ' ' + cmd.description() + : ''); + }).join('\n').replace(/^/gm, ' ') + , '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function(){ + return [ + '' + , ' Usage: ' + this._name + ' ' + this.usage() + , '' + this.commandHelp() + , ' Options:' + , '' + , '' + this.optionHelp().replace(/^/gm, ' ') + , '' + , '' + ].join('\n'); +}; + +/** + * Prompt for a `Number`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForNumber = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseNumber(val){ + val = Number(val); + if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); + fn(val); + }); +}; + +/** + * Prompt for a `Date`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForDate = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseDate(val){ + val = new Date(val); + if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); + fn(val); + }); +}; + + +/** + * Prompt for a `Regular Expression`. + * + * @param {String} str + * @param {Object} pattern regular expression object to test + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForRegexp = function(str, pattern, fn){ + var self = this; + this.promptSingleLine(str, function parseRegexp(val){ + if(!pattern.test(val)) return self.promptSingleLine(str + '(regular expression mismatch) ', parseRegexp); + fn(val); + }); +}; + + +/** + * Single-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptSingleLine = function(str, fn){ + // determine if the 2nd argument is a regular expression + if (arguments[1].global !== undefined && arguments[1].multiline !== undefined) { + return this.promptForRegexp(str, arguments[1], arguments[2]); + } else if ('function' == typeof arguments[2]) { + return this['promptFor' + (fn.name || fn)](str, arguments[2]); + } + + process.stdout.write(str); + process.stdin.setEncoding('utf8'); + process.stdin.once('data', function(val){ + fn(val.trim()); + }).resume(); +}; + +/** + * Multi-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptMultiLine = function(str, fn){ + var buf = []; + console.log(str); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function(val){ + if ('\n' == val || '\r\n' == val) { + process.stdin.removeAllListeners('data'); + fn(buf.join('\n')); + } else { + buf.push(val.trimRight()); + } + }).resume(); +}; + +/** + * Prompt `str` and callback `fn(val)` + * + * Commander supports single-line and multi-line prompts. + * To issue a single-line prompt simply add white-space + * to the end of `str`, something like "name: ", whereas + * for a multi-line prompt omit this "description:". + * + * + * Examples: + * + * program.prompt('Username: ', function(name){ + * console.log('hi %s', name); + * }); + * + * program.prompt('Description:', function(desc){ + * console.log('description was "%s"', desc.trim()); + * }); + * + * @param {String|Object} str + * @param {Function} fn + * @api public + */ + +Command.prototype.prompt = function(str, fn){ + var self = this; + if ('string' == typeof str) { + if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); + this.promptMultiLine(str, fn); + } else { + var keys = Object.keys(str) + , obj = {}; + + function next() { + var key = keys.shift() + , label = str[key]; + + if (!key) return fn(obj); + self.prompt(label, function(val){ + obj[key] = val; + next(); + }); + } + + next(); + } +}; + +/** + * Prompt for password with `str`, `mask` char and callback `fn(val)`. + * + * The mask string defaults to '', aka no output is + * written while typing, you may want to use "*" etc. + * + * Examples: + * + * program.password('Password: ', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * program.password('Password: ', '*', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {String} mask + * @param {Function} fn + * @api public + */ + +Command.prototype.password = function(str, mask, fn){ + var self = this + , buf = ''; + + // default mask + if ('function' == typeof mask) { + fn = mask; + mask = ''; + } + + keypress(process.stdin); + + function setRawMode(mode) { + if (process.stdin.setRawMode) { + process.stdin.setRawMode(mode); + } else { + tty.setRawMode(mode); + } + }; + setRawMode(true); + process.stdout.write(str); + + // keypress + process.stdin.on('keypress', function(c, key){ + if (key && 'enter' == key.name) { + console.log(); + process.stdin.pause(); + process.stdin.removeAllListeners('keypress'); + setRawMode(false); + if (!buf.trim().length) return self.password(str, mask, fn); + fn(buf); + return; + } + + if (key && key.ctrl && 'c' == key.name) { + console.log('%s', buf); + process.exit(); + } + + process.stdout.write(mask); + buf += c; + }).resume(); +}; + +/** + * Confirmation prompt with `str` and callback `fn(bool)` + * + * Examples: + * + * program.confirm('continue? ', function(ok){ + * console.log(' got %j', ok); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {Function} fn + * @api public + */ + + +Command.prototype.confirm = function(str, fn, verbose){ + var self = this; + this.prompt(str, function(ok){ + if (!ok.trim()) { + if (!verbose) str += '(yes or no) '; + return self.confirm(str, fn, true); + } + fn(parseBool(ok)); + }); +}; + +/** + * Choice prompt with `list` of items and callback `fn(index, item)` + * + * Examples: + * + * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + * + * console.log('Choose the coolest pet:'); + * program.choose(list, function(i){ + * console.log('you chose %d "%s"', i, list[i]); + * process.stdin.destroy(); + * }); + * + * @param {Array} list + * @param {Number|Function} index or fn + * @param {Function} fn + * @api public + */ + +Command.prototype.choose = function(list, index, fn){ + var self = this + , hasDefault = 'number' == typeof index; + + if (!hasDefault) { + fn = index; + index = null; + } + + list.forEach(function(item, i){ + if (hasDefault && i == index) { + console.log('* %d) %s', i + 1, item); + } else { + console.log(' %d) %s', i + 1, item); + } + }); + + function again() { + self.prompt(' : ', function(val){ + val = parseInt(val, 10) - 1; + if (hasDefault && isNaN(val)) val = index; + + if (null == list[val]) { + again(); + } else { + fn(val, list[val]); + } + }); + } + + again(); +}; + + +/** + * Output help information for this command + * + * @api public + */ + +Command.prototype.outputHelp = function(){ + process.stdout.write(this.helpInformation()); + this.emit('--help'); +}; + +/** + * Output help information and exit. + * + * @api public + */ + +Command.prototype.help = function(){ + this.outputHelp(); + process.exit(); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word){ + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Parse a boolean `str`. + * + * @param {String} str + * @return {Boolean} + * @api private + */ + +function parseBool(str) { + return /^y|yes|ok|true$/i.test(str); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Output help information if necessary + * + * @param {Command} command to output help for + * @param {Array} array of options to search for -h or --help + * @api private + */ + +function outputHelpIfNecessary(cmd, options) { + options = options || []; + for (var i = 0; i < options.length; i++) { + if (options[i] == '--help' || options[i] == '-h') { + cmd.outputHelp(); + process.exit(0); + } + } +} diff --git a/node_modules/express/node_modules/commander/node_modules/keypress/README.md b/node_modules/express/node_modules/commander/node_modules/keypress/README.md new file mode 100644 index 00000000..a768e8f5 --- /dev/null +++ b/node_modules/express/node_modules/commander/node_modules/keypress/README.md @@ -0,0 +1,101 @@ +keypress +======== +### Make any Node ReadableStream emit "keypress" events + + +Previous to Node `v0.8.x`, there was an undocumented `"keypress"` event that +`process.stdin` would emit when it was a TTY. Some people discovered this hidden +gem, and started using it in their own code. + +Now in Node `v0.8.x`, this `"keypress"` event does not get emitted by default, +but rather only when it is being used in conjuction with the `readline` (or by +extension, the `repl`) module. + +This module is the exact logic from the node `v0.8.x` releases ripped out into its +own module. + +__Bonus:__ Now with mouse support! + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install keypress +``` + +Or add it to the `"dependencies"` section of your _package.json_ file. + + +Example +------- + +#### Listening for "keypress" events + +``` js +var keypress = require('keypress'); + +// make `process.stdin` begin emitting "keypress" events +keypress(process.stdin); + +// listen for the "keypress" event +process.stdin.on('keypress', function (ch, key) { + console.log('got "keypress"', key); + if (key && key.ctrl && key.name == 'c') { + process.stdin.pause(); + } +}); + +process.stdin.setRawMode(true); +process.stdin.resume(); +``` + +#### Listening for "mousepress" events + +``` js +var keypress = require('keypress'); + +// make `process.stdin` begin emitting "mousepress" (and "keypress") events +keypress(process.stdin); + +// you must enable the mouse events before they will begin firing +keypress.enableMouse(process.stdout); + +process.stdin.on('mousepress', function (info) { + console.log('got "mousepress" event at %d x %d', info.x, info.y); +}); + +process.on('exit', function () { + // disable mouse on exit, so that the state + // is back to normal for the terminal + keypress.disableMouse(process.stdout); +}); +``` + + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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/express/node_modules/commander/node_modules/keypress/index.js b/node_modules/express/node_modules/commander/node_modules/keypress/index.js new file mode 100644 index 00000000..c2ba488b --- /dev/null +++ b/node_modules/express/node_modules/commander/node_modules/keypress/index.js @@ -0,0 +1,346 @@ + +/** + * This module offers the internal "keypress" functionality from node-core's + * `readline` module, for your own programs and modules to use. + * + * Usage: + * + * require('keypress')(process.stdin); + * + * process.stdin.on('keypress', function (ch, key) { + * console.log(ch, key); + * if (key.ctrl && key.name == 'c') { + * process.stdin.pause(); + * } + * }); + * proces.stdin.resume(); + */ +var exports = module.exports = keypress; + +exports.enableMouse = function (stream) { + stream.write('\x1b' +'[?1000h') +} + +exports.disableMouse = function (stream) { + stream.write('\x1b' +'[?1000l') +} + + +/** + * accepts a readable Stream instance and makes it emit "keypress" events + */ + +function keypress(stream) { + if (isEmittingKeypress(stream)) return; + stream._emitKeypress = true; + + function onData(b) { + if (stream.listeners('keypress').length > 0) { + emitKey(stream, b); + } else { + // Nobody's watching anyway + stream.removeListener('data', onData); + stream.on('newListener', onNewListener); + } + } + + function onNewListener(event) { + if (event == 'keypress') { + stream.on('data', onData); + stream.removeListener('newListener', onNewListener); + } + } + + if (stream.listeners('keypress').length > 0) { + stream.on('data', onData); + } else { + stream.on('newListener', onNewListener); + } +} + +/** + * Returns `true` if the stream is already emitting "keypress" events. + * `false` otherwise. + */ + +function isEmittingKeypress(stream) { + var rtn = stream._emitKeypress; + if (!rtn) { + // hack: check for the v0.6.x "data" event + stream.listeners('data').forEach(function (l) { + if (l.name == 'onData' && /emitKey/.test(l.toString())) { + rtn = true; + stream._emitKeypress = true; + } + }); + } + if (!rtn) { + // hack: check for the v0.6.x "newListener" event + stream.listeners('newListener').forEach(function (l) { + if (l.name == 'onNewListener' && /keypress/.test(l.toString())) { + rtn = true; + stream._emitKeypress = true; + } + }); + } + return rtn; +} + + +/* + Some patterns seen in terminal key escape codes, derived from combos seen + at http://www.midnight-commander.org/browser/lib/tty/key.c + + ESC letter + ESC [ letter + ESC [ modifier letter + ESC [ 1 ; modifier letter + ESC [ num char + ESC [ num ; modifier char + ESC O letter + ESC O modifier letter + ESC O 1 ; modifier letter + ESC N letter + ESC [ [ num ; modifier char + ESC [ [ 1 ; modifier letter + ESC ESC [ num char + ESC ESC O letter + + - char is usually ~ but $ and ^ also happen with rxvt + - modifier is 1 + + (shift * 1) + + (left_alt * 2) + + (ctrl * 4) + + (right_alt * 8) + - two leading ESCs apparently mean the same as one leading ESC +*/ + +// Regexes used for ansi escape code splitting +var metaKeyCodeRe = /^(?:\x1b)([a-zA-Z0-9])$/; +var functionKeyCodeRe = + /^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/; + +function emitKey(stream, s) { + var ch, + key = { + name: undefined, + ctrl: false, + meta: false, + shift: false + }, + parts; + + if (Buffer.isBuffer(s)) { + if (s[0] > 127 && s[1] === undefined) { + s[0] -= 128; + s = '\x1b' + s.toString(stream.encoding || 'utf-8'); + } else { + s = s.toString(stream.encoding || 'utf-8'); + } + } + + key.sequence = s; + + if (s === '\r' || s === '\n') { + // enter + key.name = 'enter'; + + } else if (s === '\t') { + // tab + key.name = 'tab'; + + } else if (s === '\b' || s === '\x7f' || + s === '\x1b\x7f' || s === '\x1b\b') { + // backspace or ctrl+h + key.name = 'backspace'; + key.meta = (s.charAt(0) === '\x1b'); + + } else if (s === '\x1b' || s === '\x1b\x1b') { + // escape key + key.name = 'escape'; + key.meta = (s.length === 2); + + } else if (s === ' ' || s === '\x1b ') { + key.name = 'space'; + key.meta = (s.length === 2); + + } else if (s <= '\x1a') { + // ctrl+letter + key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1); + key.ctrl = true; + + } else if (s.length === 1 && s >= 'a' && s <= 'z') { + // lowercase letter + key.name = s; + + } else if (s.length === 1 && s >= 'A' && s <= 'Z') { + // shift+letter + key.name = s.toLowerCase(); + key.shift = true; + + } else if (parts = metaKeyCodeRe.exec(s)) { + // meta+character key + key.name = parts[1].toLowerCase(); + key.meta = true; + key.shift = /^[A-Z]$/.test(parts[1]); + + } else if (parts = functionKeyCodeRe.exec(s)) { + // ansi escape sequence + + // reassemble the key code leaving out leading \x1b's, + // the modifier key bitflag and any meaningless "1;" sequence + var code = (parts[1] || '') + (parts[2] || '') + + (parts[4] || '') + (parts[6] || ''), + modifier = (parts[3] || parts[5] || 1) - 1; + + // Parse the key modifier + key.ctrl = !!(modifier & 4); + key.meta = !!(modifier & 10); + key.shift = !!(modifier & 1); + key.code = code; + + // Parse the key itself + switch (code) { + /* xterm/gnome ESC O letter */ + case 'OP': key.name = 'f1'; break; + case 'OQ': key.name = 'f2'; break; + case 'OR': key.name = 'f3'; break; + case 'OS': key.name = 'f4'; break; + + /* xterm/rxvt ESC [ number ~ */ + case '[11~': key.name = 'f1'; break; + case '[12~': key.name = 'f2'; break; + case '[13~': key.name = 'f3'; break; + case '[14~': key.name = 'f4'; break; + + /* from Cygwin and used in libuv */ + case '[[A': key.name = 'f1'; break; + case '[[B': key.name = 'f2'; break; + case '[[C': key.name = 'f3'; break; + case '[[D': key.name = 'f4'; break; + case '[[E': key.name = 'f5'; break; + + /* common */ + case '[15~': key.name = 'f5'; break; + case '[17~': key.name = 'f6'; break; + case '[18~': key.name = 'f7'; break; + case '[19~': key.name = 'f8'; break; + case '[20~': key.name = 'f9'; break; + case '[21~': key.name = 'f10'; break; + case '[23~': key.name = 'f11'; break; + case '[24~': key.name = 'f12'; break; + + /* xterm ESC [ letter */ + case '[A': key.name = 'up'; break; + case '[B': key.name = 'down'; break; + case '[C': key.name = 'right'; break; + case '[D': key.name = 'left'; break; + case '[E': key.name = 'clear'; break; + case '[F': key.name = 'end'; break; + case '[H': key.name = 'home'; break; + + /* xterm/gnome ESC O letter */ + case 'OA': key.name = 'up'; break; + case 'OB': key.name = 'down'; break; + case 'OC': key.name = 'right'; break; + case 'OD': key.name = 'left'; break; + case 'OE': key.name = 'clear'; break; + case 'OF': key.name = 'end'; break; + case 'OH': key.name = 'home'; break; + + /* xterm/rxvt ESC [ number ~ */ + case '[1~': key.name = 'home'; break; + case '[2~': key.name = 'insert'; break; + case '[3~': key.name = 'delete'; break; + case '[4~': key.name = 'end'; break; + case '[5~': key.name = 'pageup'; break; + case '[6~': key.name = 'pagedown'; break; + + /* putty */ + case '[[5~': key.name = 'pageup'; break; + case '[[6~': key.name = 'pagedown'; break; + + /* rxvt */ + case '[7~': key.name = 'home'; break; + case '[8~': key.name = 'end'; break; + + /* rxvt keys with modifiers */ + case '[a': key.name = 'up'; key.shift = true; break; + case '[b': key.name = 'down'; key.shift = true; break; + case '[c': key.name = 'right'; key.shift = true; break; + case '[d': key.name = 'left'; key.shift = true; break; + case '[e': key.name = 'clear'; key.shift = true; break; + + case '[2$': key.name = 'insert'; key.shift = true; break; + case '[3$': key.name = 'delete'; key.shift = true; break; + case '[5$': key.name = 'pageup'; key.shift = true; break; + case '[6$': key.name = 'pagedown'; key.shift = true; break; + case '[7$': key.name = 'home'; key.shift = true; break; + case '[8$': key.name = 'end'; key.shift = true; break; + + case 'Oa': key.name = 'up'; key.ctrl = true; break; + case 'Ob': key.name = 'down'; key.ctrl = true; break; + case 'Oc': key.name = 'right'; key.ctrl = true; break; + case 'Od': key.name = 'left'; key.ctrl = true; break; + case 'Oe': key.name = 'clear'; key.ctrl = true; break; + + case '[2^': key.name = 'insert'; key.ctrl = true; break; + case '[3^': key.name = 'delete'; key.ctrl = true; break; + case '[5^': key.name = 'pageup'; key.ctrl = true; break; + case '[6^': key.name = 'pagedown'; key.ctrl = true; break; + case '[7^': key.name = 'home'; key.ctrl = true; break; + case '[8^': key.name = 'end'; key.ctrl = true; break; + + /* misc. */ + case '[Z': key.name = 'tab'; key.shift = true; break; + default: key.name = 'undefined'; break; + + } + } else if (s.length > 1 && s[0] !== '\x1b') { + // Got a longer-than-one string of characters. + // Probably a paste, since it wasn't a control sequence. + Array.prototype.forEach.call(s, function(c) { + emitKey(stream, c); + }); + return; + } + + if (key.code == '[M') { + key.name = 'mouse'; + var s = key.sequence; + var b = s.charCodeAt(3); + key.x = s.charCodeAt(4) - 040; + key.y = s.charCodeAt(5) - 040; + + key.scroll = 0; + + key.ctrl = !!(1<<4 & b); + key.meta = !!(1<<3 & b); + key.shift = !!(1<<2 & b); + + key.release = (3 & b) === 3; + + if (1<<6 & b) { //scroll + key.scroll = 1 & b ? 1 : -1; + } + + if (!key.release && !key.scroll) { + key.button = b & 3; + } + } + + // Don't emit a key if no name was found + if (key.name === undefined) { + key = undefined; + } + + if (s.length === 1) { + ch = s; + } + + if (key && key.name == 'mouse') { + stream.emit('mousepress', key) + } else if (key || ch) { + stream.emit('keypress', ch, key); + } +} diff --git a/node_modules/express/node_modules/commander/node_modules/keypress/package.json b/node_modules/express/node_modules/commander/node_modules/keypress/package.json new file mode 100644 index 00000000..c5462052 --- /dev/null +++ b/node_modules/express/node_modules/commander/node_modules/keypress/package.json @@ -0,0 +1,32 @@ +{ + "name": "keypress", + "version": "0.1.0", + "description": "Make any Node ReadableStream emit \"keypress\" events", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://tootallnate.net" + }, + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/keypress.git" + }, + "keywords": [ + "keypress", + "readline", + "core" + ], + "license": "MIT", + "readme": "keypress\n========\n### Make any Node ReadableStream emit \"keypress\" events\n\n\nPrevious to Node `v0.8.x`, there was an undocumented `\"keypress\"` event that\n`process.stdin` would emit when it was a TTY. Some people discovered this hidden\ngem, and started using it in their own code.\n\nNow in Node `v0.8.x`, this `\"keypress\"` event does not get emitted by default,\nbut rather only when it is being used in conjuction with the `readline` (or by\nextension, the `repl`) module.\n\nThis module is the exact logic from the node `v0.8.x` releases ripped out into its\nown module.\n\n__Bonus:__ Now with mouse support!\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install keypress\n```\n\nOr add it to the `\"dependencies\"` section of your _package.json_ file.\n\n\nExample\n-------\n\n#### Listening for \"keypress\" events\n\n``` js\nvar keypress = require('keypress');\n\n// make `process.stdin` begin emitting \"keypress\" events\nkeypress(process.stdin);\n\n// listen for the \"keypress\" event\nprocess.stdin.on('keypress', function (ch, key) {\n console.log('got \"keypress\"', key);\n if (key && key.ctrl && key.name == 'c') {\n process.stdin.pause();\n }\n});\n\nprocess.stdin.setRawMode(true);\nprocess.stdin.resume();\n```\n\n#### Listening for \"mousepress\" events\n\n``` js\nvar keypress = require('keypress');\n\n// make `process.stdin` begin emitting \"mousepress\" (and \"keypress\") events\nkeypress(process.stdin);\n\n// you must enable the mouse events before they will begin firing\nkeypress.enableMouse(process.stdout);\n\nprocess.stdin.on('mousepress', function (info) {\n console.log('got \"mousepress\" event at %d x %d', info.x, info.y);\n});\n\nprocess.on('exit', function () {\n // disable mouse on exit, so that the state\n // is back to normal for the terminal\n keypress.disableMouse(process.stdout);\n});\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/TooTallNate/keypress/issues" + }, + "homepage": "https://github.com/TooTallNate/keypress", + "_id": "keypress@0.1.0", + "_from": "keypress@0.1.x" +} diff --git a/node_modules/express/node_modules/commander/node_modules/keypress/test.js b/node_modules/express/node_modules/commander/node_modules/keypress/test.js new file mode 100644 index 00000000..c3f61d79 --- /dev/null +++ b/node_modules/express/node_modules/commander/node_modules/keypress/test.js @@ -0,0 +1,28 @@ + +var keypress = require('./') +keypress(process.stdin) + +if (process.stdin.setRawMode) + process.stdin.setRawMode(true) +else + require('tty').setRawMode(true) + +process.stdin.on('keypress', function (c, key) { + console.log(0, c, key) + if (key && key.ctrl && key.name == 'c') { + process.stdin.pause() + } +}) +process.stdin.on('mousepress', function (mouse) { + console.log(mouse) +}) + +keypress.enableMouse(process.stdout) +process.on('exit', function () { + //disable mouse on exit, so that the state is back to normal + //for the terminal. + keypress.disableMouse(process.stdout) +}) + +process.stdin.resume() + diff --git a/node_modules/express/node_modules/commander/package.json b/node_modules/express/node_modules/commander/package.json new file mode 100644 index 00000000..b1f5fcd4 --- /dev/null +++ b/node_modules/express/node_modules/commander/package.json @@ -0,0 +1,45 @@ +{ + "name": "commander", + "version": "1.3.2", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "command", + "option", + "parser", + "prompt", + "stdin" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/commander.js.git" + }, + "dependencies": { + "keypress": "0.1.x" + }, + "devDependencies": { + "should": ">= 0.0.1" + }, + "scripts": { + "test": "make test" + }, + "main": "index", + "engines": { + "node": ">= 0.6.x" + }, + "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineapple');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineapple\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n```js\nprogram.prompt('Email: ', /^.+@.+\\..+$/, function(email){\n console.log('email: %j', email);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## .outputHelp()\n\n Output help information without exiting.\n\n## .help()\n\n Output help information and exit immediately.\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "homepage": "https://github.com/visionmedia/commander.js", + "_id": "commander@1.3.2", + "dist": { + "shasum": "8a8f30ec670a6fdd64af52f1914b907d79ead5b5" + }, + "_from": "commander@1.3.2", + "_resolved": "https://registry.npmjs.org/commander/-/commander-1.3.2.tgz" +} diff --git a/node_modules/express/node_modules/connect/.npmignore b/node_modules/express/node_modules/connect/.npmignore new file mode 100644 index 00000000..9046dde5 --- /dev/null +++ b/node_modules/express/node_modules/connect/.npmignore @@ -0,0 +1,12 @@ +*.markdown +*.md +.git* +Makefile +benchmarks/ +docs/ +examples/ +install.sh +support/ +test/ +.DS_Store +coverage.html diff --git a/node_modules/express/node_modules/connect/.travis.yml b/node_modules/express/node_modules/connect/.travis.yml new file mode 100644 index 00000000..a12e3f0f --- /dev/null +++ b/node_modules/express/node_modules/connect/.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/express/node_modules/connect/LICENSE b/node_modules/express/node_modules/connect/LICENSE new file mode 100644 index 00000000..0c5d22d9 --- /dev/null +++ b/node_modules/express/node_modules/connect/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk + +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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/Readme.md b/node_modules/express/node_modules/connect/Readme.md new file mode 100644 index 00000000..e38a3263 --- /dev/null +++ b/node_modules/express/node_modules/connect/Readme.md @@ -0,0 +1,84 @@ +# Connect [![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect) + + Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance "plugins" known as _middleware_. + + Connect is bundled with over _20_ commonly used middleware, including + a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/). + +```js +var connect = require('connect') + , http = require('http'); + +var app = connect() + .use(connect.favicon()) + .use(connect.logger('dev')) + .use(connect.static('public')) + .use(connect.directory('public')) + .use(connect.cookieParser()) + .use(connect.session({ secret: 'my secret here' })) + .use(function(req, res){ + res.end('Hello from Connect!\n'); + }); + +http.createServer(app).listen(3000); +``` + +## Middleware + + - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html) + - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html) + - [compress](http://www.senchalabs.org/connect/compress.html) + - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html) + - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html) + - [csrf](http://www.senchalabs.org/connect/csrf.html) + - [directory](http://www.senchalabs.org/connect/directory.html) + - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html) + - [favicon](http://www.senchalabs.org/connect/favicon.html) + - [json](http://www.senchalabs.org/connect/json.html) + - [limit](http://www.senchalabs.org/connect/limit.html) + - [logger](http://www.senchalabs.org/connect/logger.html) + - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html) + - [multipart](http://www.senchalabs.org/connect/multipart.html) + - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html) + - [query](http://www.senchalabs.org/connect/query.html) + - [responseTime](http://www.senchalabs.org/connect/responseTime.html) + - [session](http://www.senchalabs.org/connect/session.html) + - [static](http://www.senchalabs.org/connect/static.html) + - [staticCache](http://www.senchalabs.org/connect/staticCache.html) + - [subdomains](http://www.senchalabs.org/connect/subdomains.html) + - [vhost](http://www.senchalabs.org/connect/vhost.html) + +## Running Tests + +first: + + $ npm install -d + +then: + + $ make test + +## Contributors + + https://github.com/senchalabs/connect/graphs/contributors + +## Node Compatibility + + Connect `< 1.x` is compatible with node 0.2.x + + + Connect `1.x` is compatible with node 0.4.x + + + Connect `2.x` is compatible with node 0.6.x + + + Connect (_master_) is compatible with node 0.8.x + +## CLA + + [http://sencha.com/cla](http://sencha.com/cla) + +## License + +View the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/). diff --git a/node_modules/express/node_modules/connect/index.js b/node_modules/express/node_modules/connect/index.js new file mode 100644 index 00000000..23240eed --- /dev/null +++ b/node_modules/express/node_modules/connect/index.js @@ -0,0 +1,4 @@ + +module.exports = process.env.CONNECT_COV + ? require('./lib-cov/connect') + : require('./lib/connect'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/cache.js b/node_modules/express/node_modules/connect/lib/cache.js new file mode 100644 index 00000000..052fcdb3 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/cache.js @@ -0,0 +1,81 @@ + +/*! + * Connect - Cache + * Copyright(c) 2011 Sencha Inc. + * MIT Licensed + */ + +/** + * Expose `Cache`. + */ + +module.exports = Cache; + +/** + * LRU cache store. + * + * @param {Number} limit + * @api private + */ + +function Cache(limit) { + this.store = {}; + this.keys = []; + this.limit = limit; +} + +/** + * Touch `key`, promoting the object. + * + * @param {String} key + * @param {Number} i + * @api private + */ + +Cache.prototype.touch = function(key, i){ + this.keys.splice(i,1); + this.keys.push(key); +}; + +/** + * Remove `key`. + * + * @param {String} key + * @api private + */ + +Cache.prototype.remove = function(key){ + delete this.store[key]; +}; + +/** + * Get the object stored for `key`. + * + * @param {String} key + * @return {Array} + * @api private + */ + +Cache.prototype.get = function(key){ + return this.store[key]; +}; + +/** + * Add a cache `key`. + * + * @param {String} key + * @return {Array} + * @api private + */ + +Cache.prototype.add = function(key){ + // initialize store + var len = this.keys.push(key); + + // limit reached, invalidate LRU + if (len > this.limit) this.remove(this.keys.shift()); + + var arr = this.store[key] = []; + arr.createdAt = new Date; + return arr; +}; diff --git a/node_modules/express/node_modules/connect/lib/connect.js b/node_modules/express/node_modules/connect/lib/connect.js new file mode 100644 index 00000000..72961dca --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/connect.js @@ -0,0 +1,92 @@ +/*! + * Connect + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , proto = require('./proto') + , utils = require('./utils') + , path = require('path') + , basename = path.basename + , fs = require('fs'); + +// node patches + +require('./patch'); + +// expose createServer() as the module + +exports = module.exports = createServer; + +/** + * Framework version. + */ + +exports.version = '2.7.11'; + +/** + * Expose mime module. + */ + +exports.mime = require('./middleware/static').mime; + +/** + * Expose the prototype. + */ + +exports.proto = proto; + +/** + * Auto-load middleware getters. + */ + +exports.middleware = {}; + +/** + * Expose utilities. + */ + +exports.utils = utils; + +/** + * Create a new connect server. + * + * @return {Function} + * @api public + */ + +function createServer() { + function app(req, res, next){ app.handle(req, res, next); } + utils.merge(app, proto); + utils.merge(app, EventEmitter.prototype); + app.route = '/'; + app.stack = []; + for (var i = 0; i < arguments.length; ++i) { + app.use(arguments[i]); + } + return app; +}; + +/** + * Support old `.createServer()` method. + */ + +createServer.createServer = createServer; + +/** + * Auto-load bundled middleware with getters. + */ + +fs.readdirSync(__dirname + '/middleware').forEach(function(filename){ + if (!/\.js$/.test(filename)) return; + var name = basename(filename, '.js'); + function load(){ return require('./middleware/' + name); } + exports.middleware.__defineGetter__(name, load); + exports.__defineGetter__(name, load); +}); diff --git a/node_modules/express/node_modules/connect/lib/index.js b/node_modules/express/node_modules/connect/lib/index.js new file mode 100644 index 00000000..5938c753 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/index.js @@ -0,0 +1,50 @@ + +/** + * Connect is a middleware framework for node, + * shipping with over 18 bundled middleware and a rich selection of + * 3rd-party middleware. + * + * var app = connect() + * .use(connect.logger('dev')) + * .use(connect.static('public')) + * .use(function(req, res){ + * res.end('hello world\n'); + * }) + * + * http.createServer(app).listen(3000); + * + * Installation: + * + * $ npm install connect + * + * Middleware: + * + * - [logger](logger.html) request logger with custom format support + * - [csrf](csrf.html) Cross-site request forgery protection + * - [compress](compress.html) Gzip compression middleware + * - [basicAuth](basicAuth.html) basic http authentication + * - [bodyParser](bodyParser.html) extensible request body parser + * - [json](json.html) application/json parser + * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser + * - [multipart](multipart.html) multipart/form-data parser + * - [timeout](timeout.html) request timeouts + * - [cookieParser](cookieParser.html) cookie parser + * - [session](session.html) session management support with bundled MemoryStore + * - [cookieSession](cookieSession.html) cookie-based session support + * - [methodOverride](methodOverride.html) faux HTTP method support + * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time + * - [staticCache](staticCache.html) memory cache layer for the static() middleware + * - [static](static.html) streaming static file server supporting `Range` and more + * - [directory](directory.html) directory listing middleware + * - [vhost](vhost.html) virtual host sub-domain mapping middleware + * - [favicon](favicon.html) efficient favicon server (with default icon) + * - [limit](limit.html) limit the bytesize of request bodies + * - [query](query.html) automatic querystring parser, populating `req.query` + * - [errorHandler](errorHandler.html) flexible error handler + * + * Links: + * + * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware + * - GitHub [repository](http://github.com/senchalabs/connect) + * + */ \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js new file mode 100644 index 00000000..8af07ca0 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js @@ -0,0 +1,106 @@ +/*! + * Connect - basicAuth + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils') + , unauthorized = utils.unauthorized; + +/** + * Basic Auth: + * + * Status: Deprecated. No bug reports or pull requests are welcomed + * for this middleware. However, this middleware will not be removed. + * Instead, you should use [basic-auth](https://github.com/visionmedia/node-basic-auth). + * + * Enfore basic authentication by providing a `callback(user, pass)`, + * which must return `true` in order to gain access. Alternatively an async + * method is provided as well, invoking `callback(user, pass, callback)`. Populates + * `req.user`. The final alternative is simply passing username / password + * strings. + * + * Simple username and password + * + * connect(connect.basicAuth('username', 'password')); + * + * Callback verification + * + * connect() + * .use(connect.basicAuth(function(user, pass){ + * return 'tj' == user && 'wahoo' == pass; + * })) + * + * Async callback verification, accepting `fn(err, user)`. + * + * connect() + * .use(connect.basicAuth(function(user, pass, fn){ + * User.authenticate({ user: user, pass: pass }, fn); + * })) + * + * @param {Function|String} callback or username + * @param {String} realm + * @api public + */ + +module.exports = function basicAuth(callback, realm) { + var username, password; + + // user / pass strings + if ('string' == typeof callback) { + username = callback; + password = realm; + if ('string' != typeof password) throw new Error('password argument required'); + realm = arguments[2]; + callback = function(user, pass){ + return user == username && pass == password; + } + } + + realm = realm || 'Authorization Required'; + + return function(req, res, next) { + var authorization = req.headers.authorization; + + if (req.user) return next(); + if (!authorization) return unauthorized(res, realm); + + var parts = authorization.split(' '); + + if (parts.length !== 2) return next(utils.error(400)); + + var scheme = parts[0] + , credentials = new Buffer(parts[1], 'base64').toString() + , index = credentials.indexOf(':'); + + if ('Basic' != scheme || index < 0) return next(utils.error(400)); + + var user = credentials.slice(0, index) + , pass = credentials.slice(index + 1); + + // async + if (callback.length >= 3) { + var pause = utils.pause(req); + callback(user, pass, function(err, user){ + if (err || !user) return unauthorized(res, realm); + req.user = req.remoteUser = user; + next(); + pause.resume(); + }); + // sync + } else { + if (callback(user, pass)) { + req.user = req.remoteUser = user; + next(); + } else { + unauthorized(res, realm); + } + } + } +}; + diff --git a/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js new file mode 100644 index 00000000..14481f56 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js @@ -0,0 +1,68 @@ + +/*! + * Connect - bodyParser + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var multipart = require('./multipart') + , urlencoded = require('./urlencoded') + , json = require('./json'); + +/** + * Body parser: + * + * Status: the multipart body parser will be removed in Connect 3. + * + * Parse request bodies, supports _application/json_, + * _application/x-www-form-urlencoded_, and _multipart/form-data_. + * + * This is equivalent to: + * + * app.use(connect.json()); + * app.use(connect.urlencoded()); + * app.use(connect.multipart()); + * + * Examples: + * + * connect() + * .use(connect.bodyParser()) + * .use(function(req, res) { + * res.end('viewing user ' + req.body.user.name); + * }); + * + * $ curl -d 'user[name]=tj' http://local/ + * $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://local/ + * + * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info. + * + * If you wish to create your own body parser, you may be interested in: + * + * - [raw-body](https://github.com/stream-utils/raw-body) + * - [body](https://github.com/raynos/body) + * + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function bodyParser(options){ + var _urlencoded = urlencoded(options) + , _multipart = multipart(options) + , _json = json(options); + + return function bodyParser(req, res, next) { + _json(req, res, function(err){ + if (err) return next(err); + _urlencoded(req, res, function(err){ + if (err) return next(err); + _multipart(req, res, next); + }); + }); + } +}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/compress.js b/node_modules/express/node_modules/connect/lib/middleware/compress.js new file mode 100644 index 00000000..a300e530 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/compress.js @@ -0,0 +1,192 @@ +/*! + * Connect - compress + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var zlib = require('zlib'); +var utils = require('../utils'); +var Negotiator = require('negotiator'); + +/** + * Supported content-encoding methods. + */ + +exports.methods = { + gzip: zlib.createGzip + , deflate: zlib.createDeflate +}; + +/** + * Default filter function. + */ + +exports.filter = function(req, res){ + return /json|text|javascript|dart|image\/svg\+xml|application\/x-font-ttf|application\/vnd\.ms-opentype|application\/vnd\.ms-fontobject/.test(res.getHeader('Content-Type')); +}; + +/** + * Compress: + * + * Compress response data with gzip/deflate. + * + * Filter: + * + * A `filter` callback function may be passed to + * replace the default logic of: + * + * exports.filter = function(req, res){ + * return /json|text|javascript/.test(res.getHeader('Content-Type')); + * }; + * + * Threshold: + * + * Only compress the response if the byte size is at or above a threshold. + * Always compress while streaming. + * + * - `threshold` - string representation of size or bytes as an integer. + * + * Options: + * + * All remaining options are passed to the gzip/deflate + * creation functions. Consult node's docs for additional details. + * + * - `chunkSize` (default: 16*1024) + * - `windowBits` + * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression + * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more + * - `strategy`: compression strategy + * + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function compress(options) { + options = options || {}; + var filter = options.filter || exports.filter; + var threshold; + + if (false === options.threshold || 0 === options.threshold) { + threshold = 0 + } else if ('string' === typeof options.threshold) { + threshold = utils.parseBytes(options.threshold) + } else { + threshold = options.threshold || 1024 + } + + return function compress(req, res, next){ + var accept = req.headers['accept-encoding'] + , write = res.write + , end = res.end + , compress = true + , stream; + + // see #724 + req.on('close', function(){ + res.write = res.end = function(){}; + }); + + // flush is noop by default + res.flush = noop; + + // proxy + + res.write = function(chunk, encoding){ + if (!this.headerSent) { + // if content-length is set and is lower + // than the threshold, don't compress + var length = res.getHeader('content-length'); + if (!isNaN(length) && length < threshold) compress = false; + this._implicitHeader(); + } + return stream + ? stream.write(new Buffer(chunk, encoding)) + : write.call(res, chunk, encoding); + }; + + res.end = function(chunk, encoding){ + if (chunk) { + if (!this.headerSent && getSize(chunk) < threshold) compress = false; + this.write(chunk, encoding); + } else if (!this.headerSent) { + // response size === 0 + compress = false; + } + return stream + ? stream.end() + : end.call(res); + }; + + res.on('header', function(){ + // default request filter + if (!filter(req, res)) return; + + // vary + var vary = res.getHeader('Vary'); + if (!vary) { + res.setHeader('Vary', 'Accept-Encoding'); + } else if (!~vary.indexOf('Accept-Encoding')) { + res.setHeader('Vary', vary + ', Accept-Encoding'); + } + + if (!compress) return; + + var encoding = res.getHeader('Content-Encoding') || 'identity'; + + // already encoded + if ('identity' != encoding) return; + + // SHOULD use identity + if (!accept) return; + + // head + if ('HEAD' == req.method) return; + + // compression method + var method = new Negotiator(req).preferredEncoding(['gzip', 'deflate', 'identity']); + // negotiation failed + if (method === 'identity') return; + + // compression stream + stream = exports.methods[method](options); + + // overwrite the flush method + res.flush = function(){ + stream.flush(); + } + + // header fields + res.setHeader('Content-Encoding', method); + res.removeHeader('Content-Length'); + + // compression + stream.on('data', function(chunk){ + write.call(res, chunk); + }); + + stream.on('end', function(){ + end.call(res); + }); + + stream.on('drain', function() { + res.emit('drain'); + }); + }); + + next(); + }; +}; + +function getSize(chunk) { + return Buffer.isBuffer(chunk) + ? chunk.length + : Buffer.byteLength(chunk); +} + +function noop(){} diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js new file mode 100644 index 00000000..665226c4 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js @@ -0,0 +1,67 @@ + +/*! + * Connect - cookieParser + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('./../utils') + , cookie = require('cookie'); + +/** + * Cookie parser: + * + * Status: Deprecated. This middleware will be removed in + * Connect 3.0 and will be replaced by a `cookies` middleware, + * which will use [cookies](http://github.com/jed/cookies) + * and [keygrip](https://github.com/jed/keygrip). + * + * Parse _Cookie_ header and populate `req.cookies` + * with an object keyed by the cookie names. Optionally + * you may enabled signed cookie support by passing + * a `secret` string, which assigns `req.secret` so + * it may be used by other middleware. + * + * Examples: + * + * connect() + * .use(connect.cookieParser('optional secret string')) + * .use(function(req, res, next){ + * res.end(JSON.stringify(req.cookies)); + * }) + * + * @param {String} secret + * @return {Function} + * @api public + */ + +module.exports = function cookieParser(secret, opt){ + return function cookieParser(req, res, next) { + if (req.cookies) return next(); + var cookies = req.headers.cookie; + + req.secret = secret; + req.cookies = {}; + req.signedCookies = {}; + + if (cookies) { + try { + req.cookies = cookie.parse(cookies, opt); + if (secret) { + req.signedCookies = utils.parseSignedCookies(req.cookies, secret); + req.signedCookies = utils.parseJSONCookies(req.signedCookies); + } + req.cookies = utils.parseJSONCookies(req.cookies); + } catch (err) { + err.status = 400; + return next(err); + } + } + next(); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js new file mode 100644 index 00000000..663f2b97 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js @@ -0,0 +1,122 @@ +/*! + * Connect - cookieSession + * Copyright(c) 2011 Sencha Inc. + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('./../utils') + , Cookie = require('./session/cookie') + , debug = require('debug')('connect:cookieSession') + , signature = require('cookie-signature') + , crc32 = require('buffer-crc32') + , url = require('url'); + +/** + * Cookie Session: + * + * Cookie session middleware. + * + * var app = connect(); + * app.use(connect.cookieParser()); + * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }})); + * + * Options: + * + * - `key` cookie name defaulting to `connect.sess` + * - `secret` prevents cookie tampering + * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` + * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") + * + * Clearing sessions: + * + * To clear the session simply set its value to `null`, + * `cookieSession()` will then respond with a 1970 Set-Cookie. + * + * req.session = null; + * + * If you are interested in more sophisticated solutions, + * you may be interested in: + * + * - [client-sessions](https://github.com/mozilla/node-client-sessions) + * + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function cookieSession(options){ + // TODO: utilize Session/Cookie to unify API + options = options || {}; + var key = options.key || 'connect.sess' + , trustProxy = options.proxy; + + return function cookieSession(req, res, next) { + + // req.secret is for backwards compatibility + var secret = options.secret || req.secret; + if (!secret) throw new Error('`secret` option required for cookie sessions'); + + // default session + req.session = {}; + var cookie = req.session.cookie = new Cookie(options.cookie); + + // pathname mismatch + var originalPath = url.parse(req.originalUrl).pathname; + if (0 != originalPath.indexOf(cookie.path)) return next(); + + // cookieParser secret + if (!options.secret && req.secret) { + req.session = req.signedCookies[key] || {}; + req.session.cookie = cookie; + } else { + // TODO: refactor + var rawCookie = req.cookies[key]; + if (rawCookie) { + var unsigned = utils.parseSignedCookie(rawCookie, secret); + if (unsigned) { + var originalHash = crc32.signed(unsigned); + req.session = utils.parseJSONCookie(unsigned) || {}; + req.session.cookie = cookie; + } + } + } + + res.on('header', function(){ + // removed + if (!req.session) { + debug('clear session'); + cookie.expires = new Date(0); + res.setHeader('Set-Cookie', cookie.serialize(key, '')); + return; + } + + delete req.session.cookie; + + // check security + var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() + , tls = req.connection.encrypted || (trustProxy && 'https' == proto.split(/\s*,\s*/)[0]); + + // only send secure cookies via https + if (cookie.secure && !tls) return debug('not secured'); + + // serialize + debug('serializing %j', req.session); + var val = 'j:' + JSON.stringify(req.session); + + // compare hashes, no need to set-cookie if unchanged + if (originalHash == crc32.signed(val)) return debug('unmodified session'); + + // set-cookie + val = 's:' + signature.sign(val, secret); + val = cookie.serialize(key, val); + debug('set-cookie %j', cookie); + res.setHeader('Set-Cookie', val); + }); + + next(); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/node_modules/express/node_modules/connect/lib/middleware/csrf.js new file mode 100644 index 00000000..1c3854b4 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/csrf.js @@ -0,0 +1,163 @@ +/*! + * Connect - csrf + * Copyright(c) 2011 Sencha Inc. + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils'); +var uid = require('uid2'); +var crypto = require('crypto'); + +/** + * Anti CSRF: + * + * CSRF protection middleware. + * + * This middleware adds a `req.csrfToken()` function to make a token + * which should be added to requests which mutate + * state, within a hidden form field, query-string etc. This + * token is validated against the visitor's session. + * + * The default `value` function checks `req.body` generated + * by the `bodyParser()` middleware, `req.query` generated + * by `query()`, and the "X-CSRF-Token" header field. + * + * This middleware requires session support, thus should be added + * somewhere _below_ `session()` and `cookieParser()`. + * + * Options: + * + * - `value` a function accepting the request, returning the token + * + * @param {Object} options + * @api public + */ + +module.exports = function csrf(options) { + options = options || {}; + var value = options.value || defaultValue; + + return function(req, res, next){ + + // already have one + var secret = req.session._csrfSecret; + if (secret) return createToken(secret); + + // generate secret + uid(24, function(err, secret){ + if (err) return next(err); + req.session._csrfSecret = secret; + createToken(secret); + }); + + // generate the token + function createToken(secret) { + var token; + + // lazy-load token + req.csrfToken = function csrfToken() { + return token || (token = saltedToken(secret)); + }; + + // compatibility with old middleware + Object.defineProperty(req.session, '_csrf', { + configurable: true, + get: function() { + console.warn('req.session._csrf is deprecated, use req.csrfToken() instead'); + return req.csrfToken(); + } + }); + + // ignore these methods + if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next(); + + // determine user-submitted value + var val = value(req); + + // check + if (!checkToken(val, secret)) return next(utils.error(403)); + + next(); + } + } +}; + +/** + * Default value function, checking the `req.body` + * and `req.query` for the CSRF token. + * + * @param {IncomingMessage} req + * @return {String} + * @api private + */ + +function defaultValue(req) { + return (req.body && req.body._csrf) + || (req.query && req.query._csrf) + || (req.headers['x-csrf-token']) + || (req.headers['x-xsrf-token']); +} + +/** + * Return salted token. + * + * @param {String} secret + * @return {String} + * @api private + */ + +function saltedToken(secret) { + return createToken(generateSalt(10), secret); +} + +/** + * Creates a CSRF token from a given salt and secret. + * + * @param {String} salt (should be 10 characters) + * @param {String} secret + * @return {String} + * @api private + */ + +function createToken(salt, secret) { + return salt + crypto + .createHash('sha1') + .update(salt + secret) + .digest('base64'); +} + +/** + * Checks if a given CSRF token matches the given secret. + * + * @param {String} token + * @param {String} secret + * @return {Boolean} + * @api private + */ + +function checkToken(token, secret) { + if ('string' != typeof token) return false; + return token === createToken(token.slice(0, 10), secret); +} + +/** + * Generates a random salt, using a fast non-blocking PRNG (Math.random()). + * + * @param {Number} length + * @return {String} + * @api private + */ + +function generateSalt(length) { + var i, r = []; + for (i = 0; i < length; ++i) { + r.push(SALTCHARS[Math.floor(Math.random() * SALTCHARS.length)]); + } + return r.join(''); +} + +var SALTCHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/directory.js b/node_modules/express/node_modules/connect/lib/middleware/directory.js new file mode 100644 index 00000000..ac8ea7a5 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/directory.js @@ -0,0 +1,330 @@ + +/*! + * Connect - directory + * Copyright(c) 2011 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +// TODO: arrow key navigation +// TODO: make icons extensible + +/** + * Module dependencies. + */ + +var fs = require('fs') + , parse = require('url').parse + , utils = require('../utils') + , path = require('path') + , normalize = path.normalize + , sep = path.sep + , extname = path.extname + , join = path.join; +var Batch = require('batch'); +var Negotiator = require('negotiator'); + +/*! + * Icon cache. + */ + +var cache = {}; + +/** + * Media types and the map for content negotiation. + */ + +var mediaTypes = [ + 'text/html', + 'text/plain', + 'application/json' +]; + +var mediaType = { + 'text/html': 'html', + 'text/plain': 'plain', + 'application/json': 'json' +}; + +/** + * Directory: + * + * Serve directory listings with the given `root` path. + * + * Options: + * + * - `hidden` display hidden (dot) files. Defaults to false. + * - `icons` display icons. Defaults to false. + * - `filter` Apply this filter function to files. Defaults to false. + * + * @param {String} root + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function directory(root, options){ + options = options || {}; + + // root required + if (!root) throw new Error('directory() root path required'); + var hidden = options.hidden + , icons = options.icons + , view = options.view || 'tiles' + , filter = options.filter + , root = normalize(root + sep); + + return function directory(req, res, next) { + if ('GET' != req.method && 'HEAD' != req.method) return next(); + + var url = parse(req.url) + , dir = decodeURIComponent(url.pathname) + , path = normalize(join(root, dir)) + , originalUrl = parse(req.originalUrl) + , originalDir = decodeURIComponent(originalUrl.pathname) + , showUp = path != root; + + // null byte(s), bad request + if (~path.indexOf('\0')) return next(utils.error(400)); + + // malicious path, forbidden + if (0 != path.indexOf(root)) return next(utils.error(403)); + + // check if we have a directory + fs.stat(path, function(err, stat){ + if (err) return 'ENOENT' == err.code + ? next() + : next(err); + + if (!stat.isDirectory()) return next(); + + // fetch files + fs.readdir(path, function(err, files){ + if (err) return next(err); + if (!hidden) files = removeHidden(files); + if (filter) files = files.filter(filter); + files.sort(); + + // content-negotiation + var type = new Negotiator(req).preferredMediaType(mediaTypes); + + // not acceptable + if (!type) return next(utils.error(406)); + exports[mediaType[type]](req, res, files, next, originalDir, showUp, icons, path, view); + }); + }); + }; +}; + +/** + * Respond with text/html. + */ + +exports.html = function(req, res, files, next, dir, showUp, icons, path, view){ + fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){ + if (err) return next(err); + fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){ + if (err) return next(err); + stat(path, files, function(err, stats){ + if (err) return next(err); + files = files.map(function(file, i){ return { name: file, stat: stats[i] }; }); + files.sort(fileSort); + if (showUp) files.unshift({ name: '..' }); + str = str + .replace('{style}', style.concat(iconStyle(files, icons))) + .replace('{files}', html(files, dir, icons, view)) + .replace('{directory}', dir) + .replace('{linked-path}', htmlPath(dir)); + res.setHeader('Content-Type', 'text/html'); + res.setHeader('Content-Length', str.length); + res.end(str); + }); + }); + }); +}; + +/** + * Respond with application/json. + */ + +exports.json = function(req, res, files){ + files = JSON.stringify(files); + res.setHeader('Content-Type', 'application/json'); + res.setHeader('Content-Length', files.length); + res.end(files); +}; + +/** + * Respond with text/plain. + */ + +exports.plain = function(req, res, files){ + files = files.join('\n') + '\n'; + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Content-Length', files.length); + res.end(files); +}; + +/** + * Sort function for with directories first. + */ + +function fileSort(a, b) { + return Number(b.stat && b.stat.isDirectory()) - Number(a.stat && a.stat.isDirectory()) || + String(a.name).toLocaleLowerCase().localeCompare(String(b.name).toLocaleLowerCase()); +} + +/** + * Map html `dir`, returning a linked path. + */ + +function htmlPath(dir) { + var curr = []; + return dir.split('/').map(function(part){ + curr.push(encodeURIComponent(part)); + return part ? '' + part + '' : ''; + }).join(' / '); +} + +/** + * Load icon images, return css string. + */ + +function iconStyle (files, useIcons) { + if (!useIcons) return ''; + var data = {}; + var views = { tiles: [], details: [], mobile: [] }; + + for (var i=0; i < files.length; i++) { + var file = files[i]; + if (file.name == '..') continue; + + var isDir = '..' == file.name || (file.stat && file.stat.isDirectory()); + var icon = isDir ? icons.folder : icons[extname(file.name)] || icons.default; + + var ext = extname(file.name); + ext = isDir ? '.directory' : (icons[ext] ? ext : '.default'); + + if (data[icon]) continue; + data[icon] = ext + ' .name{background-image: url(data:image/png;base64,' + load(icon)+');}'; + views.tiles.push('.view-tiles ' + data[icon]); + views.details.push('.view-details ' + data[icon]); + views.mobile.push('#files ' + data[icon]); + } + + var style = views.tiles.join('\n') + + '\n'+views.details.join('\n') + + '\n@media (max-width: 768px) {\n\t' + + views.mobile.join('\n\t') + + '\n}'; + return style; +} + +/** + * Map html `files`, returning an html unordered list. + */ + +function html(files, dir, useIcons, view) { + return '
    ' + + (view == 'details' ? ( + '
  • ' + + 'Name' + + 'Size' + + 'Modified' + + '
  • ') : '') + + files.map(function(file){ + var isDir + , classes = [] + , path = dir.split('/').map(function (c) { return encodeURIComponent(c); }); + + if (useIcons) { + var ext = extname(file.name); + isDir = '..' == file.name || (file.stat && file.stat.isDirectory()); + ext = isDir ? '.directory' : (icons[ext] ? ext : '.default'); + classes.push('icon'); + classes.push(ext.replace('.','')); + } + + path.push(encodeURIComponent(file.name)); + + var date = file.name == '..' ? '' + : file.stat.mtime.toDateString()+' '+file.stat.mtime.toLocaleTimeString(); + var size = file.name == '..' ? '' : file.stat.size; + + return '
  • ' + + ''+file.name+'' + + ''+size+'' + + ''+date+'' + + '
  • '; + + }).join('\n') + '
'; +} + +/** + * Load and cache the given `icon`. + * + * @param {String} icon + * @return {String} + * @api private + */ + +function load(icon) { + if (cache[icon]) return cache[icon]; + return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64'); +} + +/** + * Filter "hidden" `files`, aka files + * beginning with a `.`. + * + * @param {Array} files + * @return {Array} + * @api private + */ + +function removeHidden(files) { + return files.filter(function(file){ + return '.' != file[0]; + }); +} + +/** + * Stat all files and return array of stat + * in same order. + */ + +function stat(dir, files, cb) { + var batch = new Batch(); + + batch.concurrency(10); + + files.forEach(function(file, i){ + batch.push(function(done){ + fs.stat(join(dir, file), done); + }); + }); + + batch.end(cb); +} + +/** + * Icon map. + */ + +var icons = { + '.js': 'page_white_code_red.png' + , '.c': 'page_white_c.png' + , '.h': 'page_white_h.png' + , '.cc': 'page_white_cplusplus.png' + , '.php': 'page_white_php.png' + , '.rb': 'page_white_ruby.png' + , '.cpp': 'page_white_cplusplus.png' + , '.swf': 'page_white_flash.png' + , '.pdf': 'page_white_acrobat.png' + , 'folder': 'folder.png' + , 'default': 'page_white.png' +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js new file mode 100644 index 00000000..56e96830 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js @@ -0,0 +1,86 @@ +/*! + * Connect - errorHandler + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils') + , fs = require('fs'); + +// environment + +var env = process.env.NODE_ENV || 'development'; + +/** + * Error handler: + * + * Development error handler, providing stack traces + * and error message responses for requests accepting text, html, + * or json. + * + * Text: + * + * By default, and when _text/plain_ is accepted a simple stack trace + * or error message will be returned. + * + * JSON: + * + * When _application/json_ is accepted, connect will respond with + * an object in the form of `{ "error": error }`. + * + * HTML: + * + * When accepted connect will output a nice html stack trace. + * + * @return {Function} + * @api public + */ + +exports = module.exports = function errorHandler(){ + return function errorHandler(err, req, res, next){ + if (err.status) res.statusCode = err.status; + if (res.statusCode < 400) res.statusCode = 500; + if ('test' != env) console.error(err.stack); + var accept = req.headers.accept || ''; + // html + if (~accept.indexOf('html')) { + fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){ + fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){ + var stack = (err.stack || '') + .split('\n').slice(1) + .map(function(v){ return '
  • ' + v + '
  • '; }).join(''); + html = html + .replace('{style}', style) + .replace('{stack}', stack) + .replace('{title}', exports.title) + .replace('{statusCode}', res.statusCode) + .replace(/\{error\}/g, utils.escape(err.toString().replace(/\n/g, '
    '))); + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + res.end(html); + }); + }); + // json + } else if (~accept.indexOf('json')) { + var error = { message: err.message, stack: err.stack }; + for (var prop in err) error[prop] = err[prop]; + var json = JSON.stringify({ error: error }); + res.setHeader('Content-Type', 'application/json'); + res.end(json); + // plain text + } else { + res.setHeader('Content-Type', 'text/plain'); + res.end(err.stack); + } + }; +}; + +/** + * Template title, framework authors may override this value. + */ + +exports.title = 'Connect'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/node_modules/express/node_modules/connect/lib/middleware/favicon.js new file mode 100644 index 00000000..ef543544 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/favicon.js @@ -0,0 +1,80 @@ +/*! + * Connect - favicon + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var fs = require('fs') + , utils = require('../utils'); + +/** + * Favicon: + * + * By default serves the connect favicon, or the favicon + * located by the given `path`. + * + * Options: + * + * - `maxAge` cache-control max-age directive, defaulting to 1 day + * + * Examples: + * + * Serve default favicon: + * + * connect() + * .use(connect.favicon()) + * + * Serve favicon before logging for brevity: + * + * connect() + * .use(connect.favicon()) + * .use(connect.logger('dev')) + * + * Serve custom favicon: + * + * connect() + * .use(connect.favicon('public/favicon.ico')) + * + * @param {String} path + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function favicon(path, options){ + var options = options || {} + , path = path || __dirname + '/../public/favicon.ico' + , maxAge = options.maxAge || 86400000 + , icon; // favicon cache + + return function favicon(req, res, next){ + if ('/favicon.ico' == req.url) { + if (icon) { + res.writeHead(200, icon.headers); + res.end(icon.body); + } else { + fs.readFile(path, function(err, buf){ + if (err) return next(err); + icon = { + headers: { + 'Content-Type': 'image/x-icon' + , 'Content-Length': buf.length + , 'ETag': '"' + utils.md5(buf) + '"' + , 'Cache-Control': 'public, max-age=' + (maxAge / 1000) + }, + body: buf + }; + res.writeHead(200, icon.headers); + res.end(icon.body); + }); + } + } else { + next(); + } + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/json.js b/node_modules/express/node_modules/connect/lib/middleware/json.js new file mode 100644 index 00000000..ef489852 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/json.js @@ -0,0 +1,87 @@ + +/*! + * Connect - json + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils'); +var getBody = require('raw-body'); + +/** + * JSON: + * + * Parse JSON request bodies, providing the + * parsed object as `req.body`. + * + * Options: + * + * - `strict` when `false` anything `JSON.parse()` accepts will be parsed + * - `reviver` used as the second "reviver" argument for JSON.parse + * - `limit` byte limit [1mb] + * + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function(options){ + options = options || {}; + var strict = options.strict !== false; + var verify = typeof options.verify === 'function' && options.verify; + + return function json(req, res, next) { + if (req._body) return next(); + req.body = req.body || {}; + + if (!utils.hasBody(req)) return next(); + + // check Content-Type + if (!exports.regexp.test(utils.mime(req))) return next(); + + // flag as parsed + req._body = true; + + // parse + getBody(req, { + limit: options.limit || '1mb', + length: req.headers['content-length'], + encoding: 'utf8' + }, function (err, buf) { + if (err) return next(err); + + if (verify) { + try { + verify(req, res, buf) + } catch (err) { + if (!err.status) err.status = 403; + return next(err); + } + } + + var first = buf.trim()[0]; + + if (0 == buf.length) { + return next(utils.error(400, 'invalid json, empty body')); + } + + if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json')); + try { + req.body = JSON.parse(buf, options.reviver); + } catch (err){ + err.body = buf; + err.status = 400; + return next(err); + } + next(); + }) + }; +}; + +exports.regexp = /^application\/([\w!#\$%&\*`\-\.\^~]*\+)?json$/i; + diff --git a/node_modules/express/node_modules/connect/lib/middleware/limit.js b/node_modules/express/node_modules/connect/lib/middleware/limit.js new file mode 100644 index 00000000..2b895f97 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/limit.js @@ -0,0 +1,89 @@ + +/*! + * Connect - limit + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils'), + brokenPause = utils.brokenPause; + +/** + * Limit: + * + * Status: Deprecated. This middleware will be removed in Connect 3.0. + * If you still wish to use some type of limit middleware, + * you may be interested in: + * + * - [raw-body](https://github.com/stream-utils/raw-body) + * + * Limit request bodies to the given size in `bytes`. + * + * A string representation of the bytesize may also be passed, + * for example "5mb", "200kb", "1gb", etc. + * + * connect() + * .use(connect.limit('5.5mb')) + * .use(handleImageUpload) + * + * @param {Number|String} bytes + * @return {Function} + * @api public + */ + +module.exports = function limit(bytes){ + if ('string' == typeof bytes) bytes = utils.parseBytes(bytes); + if ('number' != typeof bytes) throw new Error('limit() bytes required'); + + if (process.env.NODE_ENV !== 'test') { + console.warn('connect.limit() will be removed in connect 3.0'); + } + + return function limit(req, res, next){ + var received = 0 + , len = req.headers['content-length'] + ? parseInt(req.headers['content-length'], 10) + : null; + + // self-awareness + if (req._limit) return next(); + req._limit = true; + + // limit by content-length + if (len && len > bytes) return next(utils.error(413)); + + // limit + if (brokenPause) { + listen(); + } else { + req.on('newListener', function handler(event) { + if (event !== 'data') return; + + req.removeListener('newListener', handler); + // Start listening at the end of the current loop + // otherwise the request will be consumed too early. + // Sideaffect is `limit` will miss the first chunk, + // but that's not a big deal. + // Unfortunately, the tests don't have large enough + // request bodies to test this. + process.nextTick(listen); + }); + }; + + next(); + + function listen() { + req.on('data', function(chunk) { + received += Buffer.isBuffer(chunk) + ? chunk.length : + Buffer.byteLength(chunk); + + if (received > bytes) req.destroy(); + }); + }; + }; +}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/logger.js b/node_modules/express/node_modules/connect/lib/middleware/logger.js new file mode 100644 index 00000000..fba43e41 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/logger.js @@ -0,0 +1,342 @@ +/*! + * Connect - logger + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var bytes = require('bytes'); + +/*! + * Log buffer. + */ + +var buf = []; + +/*! + * Default log buffer duration. + */ + +var defaultBufferDuration = 1000; + +/** + * Logger: + * + * Log requests with the given `options` or a `format` string. + * + * Options: + * + * - `format` Format string, see below for tokens + * - `stream` Output stream, defaults to _stdout_ + * - `buffer` Buffer duration, defaults to 1000ms when _true_ + * - `immediate` Write log line on request instead of response (for response times) + * + * Tokens: + * + * - `:req[header]` ex: `:req[Accept]` + * - `:res[header]` ex: `:res[Content-Length]` + * - `:http-version` + * - `:response-time` + * - `:remote-addr` + * - `:date` + * - `:method` + * - `:url` + * - `:referrer` + * - `:user-agent` + * - `:status` + * + * Formats: + * + * Pre-defined formats that ship with connect: + * + * - `default` ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"' + * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms' + * - `tiny` ':method :url :status :res[content-length] - :response-time ms' + * - `dev` concise output colored by response status for development use + * + * Examples: + * + * connect.logger() // default + * connect.logger('short') + * connect.logger('tiny') + * connect.logger({ immediate: true, format: 'dev' }) + * connect.logger(':method :url - :referrer') + * connect.logger(':req[content-type] -> :res[content-type]') + * connect.logger(function(tokens, req, res){ return 'some format string' }) + * + * Defining Tokens: + * + * To define a token, simply invoke `connect.logger.token()` with the + * name and a callback function. The value returned is then available + * as ":type" in this case. + * + * connect.logger.token('type', function(req, res){ return req.headers['content-type']; }) + * + * Defining Formats: + * + * All default formats are defined this way, however it's public API as well: + * + * connect.logger.format('name', 'string or function') + * + * @param {String|Function|Object} format or options + * @return {Function} + * @api public + */ + +exports = module.exports = function logger(options) { + if ('object' == typeof options) { + options = options || {}; + } else if (options) { + options = { format: options }; + } else { + options = {}; + } + + // output on request instead of response + var immediate = options.immediate; + + // format name + var fmt = exports[options.format] || options.format || exports.default; + + // compile format + if ('function' != typeof fmt) fmt = compile(fmt); + + // options + var stream = options.stream || process.stdout + , buffer = options.buffer; + + // buffering support + if (buffer) { + var realStream = stream + , interval = 'number' == typeof buffer + ? buffer + : defaultBufferDuration; + + // flush interval + setInterval(function(){ + if (buf.length) { + realStream.write(buf.join('')); + buf.length = 0; + } + }, interval); + + // swap the stream + stream = { + write: function(str){ + buf.push(str); + } + }; + } + + return function logger(req, res, next) { + var sock = req.socket; + req._startTime = new Date; + req._remoteAddress = sock.socket ? sock.socket.remoteAddress : sock.remoteAddress; + + function logRequest(){ + res.removeListener('finish', logRequest); + res.removeListener('close', logRequest); + var line = fmt(exports, req, res); + if (null == line) return; + stream.write(line + '\n'); + }; + + // immediate + if (immediate) { + logRequest(); + // proxy end to output logging + } else { + res.on('finish', logRequest); + res.on('close', logRequest); + } + + + next(); + }; +}; + +/** + * Compile `fmt` into a function. + * + * @param {String} fmt + * @return {Function} + * @api private + */ + +function compile(fmt) { + fmt = fmt.replace(/"/g, '\\"'); + var js = ' return "' + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function(_, name, arg){ + return '"\n + (tokens["' + name + '"](req, res, "' + arg + '") || "-") + "'; + }) + '";' + return new Function('tokens, req, res', js); +}; + +/** + * Define a token function with the given `name`, + * and callback `fn(req, res)`. + * + * @param {String} name + * @param {Function} fn + * @return {Object} exports for chaining + * @api public + */ + +exports.token = function(name, fn) { + exports[name] = fn; + return this; +}; + +/** + * Define a `fmt` with the given `name`. + * + * @param {String} name + * @param {String|Function} fmt + * @return {Object} exports for chaining + * @api public + */ + +exports.format = function(name, str){ + exports[name] = str; + return this; +}; + +/** + * Default format. + */ + +exports.format('default', ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'); + +/** + * Short format. + */ + +exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'); + +/** + * Tiny format. + */ + +exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms'); + +/** + * dev (colored) + */ + +exports.format('dev', function(tokens, req, res){ + var status = res.statusCode + , len = parseInt(res.getHeader('Content-Length'), 10) + , color = 32; + + if (status >= 500) color = 31 + else if (status >= 400) color = 33 + else if (status >= 300) color = 36; + + len = isNaN(len) + ? '' + : len = ' - ' + bytes(len); + + return '\x1b[90m' + req.method + + ' ' + req.originalUrl + ' ' + + '\x1b[' + color + 'm' + res.statusCode + + ' \x1b[90m' + + (new Date - req._startTime) + + 'ms' + len + + '\x1b[0m'; +}); + +/** + * request url + */ + +exports.token('url', function(req){ + return req.originalUrl || req.url; +}); + +/** + * request method + */ + +exports.token('method', function(req){ + return req.method; +}); + +/** + * response time in milliseconds + */ + +exports.token('response-time', function(req){ + return String(Date.now() - req._startTime); +}); + +/** + * UTC date + */ + +exports.token('date', function(){ + return new Date().toUTCString(); +}); + +/** + * response status code + */ + +exports.token('status', function(req, res){ + return res.headerSent ? res.statusCode : null; +}); + +/** + * normalized referrer + */ + +exports.token('referrer', function(req){ + return req.headers['referer'] || req.headers['referrer']; +}); + +/** + * remote address + */ + +exports.token('remote-addr', function(req){ + if (req.ip) return req.ip; + if (req._remoteAddress) return req._remoteAddress; + var sock = req.socket; + if (sock.socket) return sock.socket.remoteAddress; + return sock.remoteAddress; +}); + +/** + * HTTP version + */ + +exports.token('http-version', function(req){ + return req.httpVersionMajor + '.' + req.httpVersionMinor; +}); + +/** + * UA string + */ + +exports.token('user-agent', function(req){ + return req.headers['user-agent']; +}); + +/** + * request header + */ + +exports.token('req', function(req, res, field){ + return req.headers[field.toLowerCase()]; +}); + +/** + * response header + */ + +exports.token('res', function(req, res, field){ + return (res._headers || {})[field.toLowerCase()]; +}); + diff --git a/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js new file mode 100644 index 00000000..a729d136 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js @@ -0,0 +1,58 @@ +/*! + * Connect - methodOverride + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var methods = require('methods'); + +/** + * Method Override: + * + * Provides faux HTTP method support. + * + * Pass an optional `key` to use when checking for + * a method override, otherwise defaults to _\_method_. + * The original method is available via `req.originalMethod`. + * + * @param {String} key + * @return {Function} + * @api public + */ + +module.exports = function methodOverride(key){ + key = key || "_method"; + return function methodOverride(req, res, next) { + var method; + req.originalMethod = req.originalMethod || req.method; + + // req.body + if (req.body && typeof req.body === 'object' && key in req.body) { + method = req.body[key].toLowerCase(); + delete req.body[key]; + } + + // check X-HTTP-Method-Override + if (req.headers['x-http-method-override']) { + method = req.headers['x-http-method-override'].toLowerCase(); + } + + // replace + if (supports(method)) req.method = method.toUpperCase(); + + next(); + }; +}; + +/** + * Check if node supports `method`. + */ + +function supports(method) { + return ~methods.indexOf(method); +} diff --git a/node_modules/express/node_modules/connect/lib/middleware/multipart.js b/node_modules/express/node_modules/connect/lib/middleware/multipart.js new file mode 100644 index 00000000..8bf66389 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/multipart.js @@ -0,0 +1,171 @@ +/*! + * Connect - multipart + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var multiparty = require('multiparty') + , _limit = require('./limit') + , utils = require('../utils') + , qs = require('qs'); + +/** + * Multipart: + * + * Status: Deprecated. The multipart parser will be removed in Connect 3.0. + * Please use one of the following parsers/middleware directly: + * + * - [formidable](https://github.com/felixge/node-formidable) + * - [connect-multiparty](https://github.com/superjoe30/connect-multiparty) or [multiparty] + * - [connect-busboy](https://github.com/mscdex/connect-busboy) or [busboy](https://github.com/mscdex/busboy) + * + * Parse multipart/form-data request bodies, + * providing the parsed object as `req.body` + * and `req.files`. + * + * Configuration: + * + * The options passed are merged with [multiparty](https://github.com/superjoe30/node-multiparty)'s + * `Form` object, allowing you to configure the upload directory, + * size limits, etc. For example if you wish to change the upload dir do the following. + * + * app.use(connect.multipart({ uploadDir: path })); + * + * Options: + * + * - `limit` byte limit defaulting to [100mb] + * - `defer` defers processing and exposes the multiparty form object as `req.form`. + * `next()` is called without waiting for the form's "end" event. + * This option is useful if you need to bind to the "progress" or "part" events, for example. + * + * Temporary Files: + * + * By default temporary files are used, stored in `os.tmpDir()`. These + * are not automatically garbage collected, you are in charge of moving them + * or deleting them. When `defer` is not used and these files are created you + * may refernce them via the `req.files` object. + * + * req.files.images.forEach(function(file){ + * console.log(' uploaded : %s %skb : %s', file.originalFilename, file.size / 1024 | 0, file.path); + * }); + * + * It is highly recommended to monitor and clean up tempfiles in any production + * environment, you may use tools like [reap](https://github.com/visionmedia/reap) + * to do so. + * + * Streaming: + * + * When `defer` is used files are _not_ streamed to tmpfiles, you may + * access them via the "part" events and stream them accordingly: + * + * req.form.on('part', function(part){ + * // transfer to s3 etc + * console.log('upload %s %s', part.name, part.filename); + * var out = fs.createWriteStream('/tmp/' + part.filename); + * part.pipe(out); + * }); + * + * req.form.on('close', function(){ + * res.end('uploaded!'); + * }); + * + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function(options){ + options = options || {}; + + if (process.env.NODE_ENV !== 'test') { + console.warn('connect.multipart() will be removed in connect 3.0'); + console.warn('visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives'); + } + + var limit = _limit(options.limit || '100mb'); + + return function multipart(req, res, next) { + if (req._body) return next(); + req.body = req.body || {}; + req.files = req.files || {}; + + if (!utils.hasBody(req)) return next(); + + // ignore GET + if ('GET' == req.method || 'HEAD' == req.method) return next(); + + // check Content-Type + if ('multipart/form-data' != utils.mime(req)) return next(); + + // flag as parsed + req._body = true; + + // parse + limit(req, res, function(err){ + if (err) return next(err); + + var form = new multiparty.Form(options) + , data = {} + , files = {} + , done; + + Object.keys(options).forEach(function(key){ + form[key] = options[key]; + }); + + function ondata(name, val, data){ + if (Array.isArray(data[name])) { + data[name].push(val); + } else if (data[name]) { + data[name] = [data[name], val]; + } else { + data[name] = val; + } + } + + form.on('field', function(name, val){ + ondata(name, val, data); + }); + + if (!options.defer) { + form.on('file', function(name, val){ + val.name = val.originalFilename; + val.type = val.headers['content-type'] || null; + ondata(name, val, files); + }); + } + + form.on('error', function(err){ + if (!options.defer) { + err.status = 400; + next(err); + } + done = true; + }); + + form.on('close', function(){ + if (done) return; + try { + req.body = qs.parse(data); + req.files = qs.parse(files); + } catch (err) { + form.emit('error', err); + return; + } + if (!options.defer) next(); + }); + + form.parse(req); + + if (options.defer) { + req.form = form; + next(); + } + }); + } +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/query.js b/node_modules/express/node_modules/connect/lib/middleware/query.js new file mode 100644 index 00000000..f0fb50fc --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/query.js @@ -0,0 +1,47 @@ +/*! + * Connect - query + * Copyright(c) 2011 TJ Holowaychuk + * Copyright(c) 2011 Sencha Inc. + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var qs = require('qs') + , parse = require('../utils').parseUrl; + +/** + * Query: + * + * Automatically parse the query-string when available, + * populating the `req.query` object using + * [qs](https://github.com/visionmedia/node-querystring). + * + * Examples: + * + * connect() + * .use(connect.query()) + * .use(function(req, res){ + * res.end(JSON.stringify(req.query)); + * }); + * + * The `options` passed are provided to qs.parse function. + * + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function query(options){ + return function query(req, res, next){ + if (!req.query) { + req.query = ~req.url.indexOf('?') + ? qs.parse(parse(req).query, options) + : {}; + } + + next(); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib/middleware/responseTime.js new file mode 100644 index 00000000..62abc049 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/responseTime.js @@ -0,0 +1,32 @@ + +/*! + * Connect - responseTime + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Reponse time: + * + * Adds the `X-Response-Time` header displaying the response + * duration in milliseconds. + * + * @return {Function} + * @api public + */ + +module.exports = function responseTime(){ + return function(req, res, next){ + var start = new Date; + + if (res._responseTime) return next(); + res._responseTime = true; + + res.on('header', function(){ + var duration = new Date - start; + res.setHeader('X-Response-Time', duration + 'ms'); + }); + + next(); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session.js b/node_modules/express/node_modules/connect/lib/middleware/session.js new file mode 100644 index 00000000..128bc591 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/session.js @@ -0,0 +1,358 @@ +/*! + * Connect - session + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Session = require('./session/session') + , debug = require('debug')('connect:session') + , MemoryStore = require('./session/memory') + , signature = require('cookie-signature') + , Cookie = require('./session/cookie') + , Store = require('./session/store') + , utils = require('./../utils') + , uid = require('uid2') + , crc32 = require('buffer-crc32') + , parse = require('url').parse; + +// environment + +var env = process.env.NODE_ENV; + +/** + * Expose the middleware. + */ + +exports = module.exports = session; + +/** + * Expose constructors. + */ + +exports.Store = Store; +exports.Cookie = Cookie; +exports.Session = Session; +exports.MemoryStore = MemoryStore; + +/** + * Warning message for `MemoryStore` usage in production. + */ + +var warning = 'Warning: connection.session() MemoryStore is not\n' + + 'designed for a production environment, as it will leak\n' + + 'memory, and will not scale past a single process.'; + +/** + * Session: + * + * Setup session store with the given `options`. + * + * Session data is _not_ saved in the cookie itself, however + * cookies are used, so we must use the [cookieParser()](cookieParser.html) + * middleware _before_ `session()`. + * + * Examples: + * + * connect() + * .use(connect.cookieParser()) + * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }})) + * + * Options: + * + * - `key` cookie name defaulting to `connect.sid` + * - `store` session store instance + * - `secret` session cookie is signed with this secret to prevent tampering + * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` + * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") + * + * Cookie option: + * + * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set + * so the cookie becomes a browser-session cookie. When the user closes the + * browser the cookie (and session) will be removed. + * + * ## req.session + * + * To store or access session data, simply use the request property `req.session`, + * which is (generally) serialized as JSON by the store, so nested objects + * are typically fine. For example below is a user-specific view counter: + * + * connect() + * .use(connect.favicon()) + * .use(connect.cookieParser()) + * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) + * .use(function(req, res, next){ + * var sess = req.session; + * if (sess.views) { + * res.setHeader('Content-Type', 'text/html'); + * res.write('

    views: ' + sess.views + '

    '); + * res.write('

    expires in: ' + (sess.cookie.maxAge / 1000) + 's

    '); + * res.end(); + * sess.views++; + * } else { + * sess.views = 1; + * res.end('welcome to the session demo. refresh!'); + * } + * } + * )).listen(3000); + * + * ## Session#regenerate() + * + * To regenerate the session simply invoke the method, once complete + * a new SID and `Session` instance will be initialized at `req.session`. + * + * req.session.regenerate(function(err){ + * // will have a new session here + * }); + * + * ## Session#destroy() + * + * Destroys the session, removing `req.session`, will be re-generated next request. + * + * req.session.destroy(function(err){ + * // cannot access session here + * }); + * + * ## Session#reload() + * + * Reloads the session data. + * + * req.session.reload(function(err){ + * // session updated + * }); + * + * ## Session#save() + * + * Save the session. + * + * req.session.save(function(err){ + * // session saved + * }); + * + * ## Session#touch() + * + * Updates the `.maxAge` property. Typically this is + * not necessary to call, as the session middleware does this for you. + * + * ## Session#cookie + * + * Each session has a unique cookie object accompany it. This allows + * you to alter the session cookie per visitor. For example we can + * set `req.session.cookie.expires` to `false` to enable the cookie + * to remain for only the duration of the user-agent. + * + * ## Session#maxAge + * + * Alternatively `req.session.cookie.maxAge` will return the time + * remaining in milliseconds, which we may also re-assign a new value + * to adjust the `.expires` property appropriately. The following + * are essentially equivalent + * + * var hour = 3600000; + * req.session.cookie.expires = new Date(Date.now() + hour); + * req.session.cookie.maxAge = hour; + * + * For example when `maxAge` is set to `60000` (one minute), and 30 seconds + * has elapsed it will return `30000` until the current request has completed, + * at which time `req.session.touch()` is called to reset `req.session.maxAge` + * to its original value. + * + * req.session.cookie.maxAge; + * // => 30000 + * + * Session Store Implementation: + * + * Every session store _must_ implement the following methods + * + * - `.get(sid, callback)` + * - `.set(sid, session, callback)` + * - `.destroy(sid, callback)` + * + * Recommended methods include, but are not limited to: + * + * - `.length(callback)` + * - `.clear(callback)` + * + * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo. + * + * @param {Object} options + * @return {Function} + * @api public + */ + +function session(options){ + var options = options || {} + , key = options.key || 'connect.sid' + , store = options.store || new MemoryStore + , cookie = options.cookie || {} + , trustProxy = options.proxy + , storeReady = true + , rollingSessions = options.rolling || false; + + // notify user that this store is not + // meant for a production environment + if ('production' == env && store instanceof MemoryStore) { + console.warn(warning); + } + + // generates the new session + store.generate = function(req){ + req.sessionID = uid(24); + req.session = new Session(req); + req.session.cookie = new Cookie(cookie); + }; + + store.on('disconnect', function(){ storeReady = false; }); + store.on('connect', function(){ storeReady = true; }); + + return function session(req, res, next) { + // self-awareness + if (req.session) return next(); + + // Handle connection as if there is no session if + // the store has temporarily disconnected etc + if (!storeReady) return debug('store is disconnected'), next(); + + // pathname mismatch + var originalPath = parse(req.originalUrl).pathname; + if (0 != originalPath.indexOf(cookie.path || '/')) return next(); + + // backwards compatibility for signed cookies + // req.secret is passed from the cookie parser middleware + var secret = options.secret || req.secret; + + // ensure secret is available or bail + if (!secret) throw new Error('`secret` option required for sessions'); + + var originalHash + , originalId; + + // expose store + req.sessionStore = store; + + // grab the session cookie value and check the signature + var rawCookie = req.cookies[key]; + + // get signedCookies for backwards compat with signed cookies + var unsignedCookie = req.signedCookies[key]; + + if (!unsignedCookie && rawCookie) { + unsignedCookie = utils.parseSignedCookie(rawCookie, secret); + } + + // set-cookie + res.on('header', function(){ + if (!req.session) return; + var cookie = req.session.cookie + , proto = (req.headers['x-forwarded-proto'] || '').split(',')[0].toLowerCase().trim() + , tls = req.connection.encrypted || (trustProxy && 'https' == proto) + , isNew = unsignedCookie != req.sessionID; + + // only send secure cookies via https + if (cookie.secure && !tls) return debug('not secured'); + + // in case of rolling session, always reset the cookie + if (!rollingSessions) { + + // browser-session length cookie + if (null == cookie.expires) { + if (!isNew) return debug('already set browser-session cookie'); + // compare hashes and ids + } else if (originalHash == hash(req.session) && originalId == req.session.id) { + return debug('unmodified session'); + } + + } + + var val = 's:' + signature.sign(req.sessionID, secret); + val = cookie.serialize(key, val); + debug('set-cookie %s', val); + res.setHeader('Set-Cookie', val); + }); + + // proxy end() to commit the session + var end = res.end; + res.end = function(data, encoding){ + res.end = end; + if (!req.session) return res.end(data, encoding); + debug('saving'); + req.session.resetMaxAge(); + req.session.save(function(err){ + if (err) console.error(err.stack); + debug('saved'); + res.end(data, encoding); + }); + }; + + // generate the session + function generate() { + store.generate(req); + } + + // get the sessionID from the cookie + req.sessionID = unsignedCookie; + + // generate a session if the browser doesn't send a sessionID + if (!req.sessionID) { + debug('no SID sent, generating session'); + generate(); + next(); + return; + } + + // generate the session object + var pause = utils.pause(req); + debug('fetching %s', req.sessionID); + store.get(req.sessionID, function(err, sess){ + // proxy to resume() events + var _next = next; + next = function(err){ + _next(err); + pause.resume(); + }; + + // error handling + if (err) { + debug('error %j', err); + if ('ENOENT' == err.code) { + generate(); + next(); + } else { + next(err); + } + // no session + } else if (!sess) { + debug('no session found'); + generate(); + next(); + // populate req.session + } else { + debug('session found'); + store.createSession(req, sess); + originalId = req.sessionID; + originalHash = hash(sess); + next(); + } + }); + }; +}; + +/** + * Hash the given `sess` object omitting changes + * to `.cookie`. + * + * @param {Object} sess + * @return {String} + * @api private + */ + +function hash(sess) { + return crc32.signed(JSON.stringify(sess, function(key, val){ + if ('cookie' != key) return val; + })); +} diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js new file mode 100644 index 00000000..3125410d --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js @@ -0,0 +1,128 @@ + +/*! + * Connect - session - Cookie + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../../utils') + , cookie = require('cookie'); + +/** + * Initialize a new `Cookie` with the given `options`. + * + * @param {IncomingMessage} req + * @param {Object} options + * @api private + */ + +var Cookie = module.exports = function Cookie(options) { + this.path = '/'; + this.maxAge = null; + this.httpOnly = true; + if (options) utils.merge(this, options); + this.originalMaxAge = undefined == this.originalMaxAge + ? this.maxAge + : this.originalMaxAge; +}; + +/*! + * Prototype. + */ + +Cookie.prototype = { + + /** + * Set expires `date`. + * + * @param {Date} date + * @api public + */ + + set expires(date) { + this._expires = date; + this.originalMaxAge = this.maxAge; + }, + + /** + * Get expires `date`. + * + * @return {Date} + * @api public + */ + + get expires() { + return this._expires; + }, + + /** + * Set expires via max-age in `ms`. + * + * @param {Number} ms + * @api public + */ + + set maxAge(ms) { + this.expires = 'number' == typeof ms + ? new Date(Date.now() + ms) + : ms; + }, + + /** + * Get expires max-age in `ms`. + * + * @return {Number} + * @api public + */ + + get maxAge() { + return this.expires instanceof Date + ? this.expires.valueOf() - Date.now() + : this.expires; + }, + + /** + * Return cookie data object. + * + * @return {Object} + * @api private + */ + + get data() { + return { + originalMaxAge: this.originalMaxAge + , expires: this._expires + , secure: this.secure + , httpOnly: this.httpOnly + , domain: this.domain + , path: this.path + } + }, + + /** + * Return a serialized cookie string. + * + * @return {String} + * @api public + */ + + serialize: function(name, val){ + return cookie.serialize(name, val, this.data); + }, + + /** + * Return JSON representation of this cookie. + * + * @return {Object} + * @api private + */ + + toJSON: function(){ + return this.data; + } +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib/middleware/session/memory.js new file mode 100644 index 00000000..fb939392 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/session/memory.js @@ -0,0 +1,129 @@ + +/*! + * Connect - session - MemoryStore + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Store = require('./store'); + +/** + * Initialize a new `MemoryStore`. + * + * @api public + */ + +var MemoryStore = module.exports = function MemoryStore() { + this.sessions = {}; +}; + +/** + * Inherit from `Store.prototype`. + */ + +MemoryStore.prototype.__proto__ = Store.prototype; + +/** + * Attempt to fetch session by the given `sid`. + * + * @param {String} sid + * @param {Function} fn + * @api public + */ + +MemoryStore.prototype.get = function(sid, fn){ + var self = this; + process.nextTick(function(){ + var expires + , sess = self.sessions[sid]; + if (sess) { + sess = JSON.parse(sess); + expires = 'string' == typeof sess.cookie.expires + ? new Date(sess.cookie.expires) + : sess.cookie.expires; + if (!expires || new Date < expires) { + fn(null, sess); + } else { + self.destroy(sid, fn); + } + } else { + fn(); + } + }); +}; + +/** + * Commit the given `sess` object associated with the given `sid`. + * + * @param {String} sid + * @param {Session} sess + * @param {Function} fn + * @api public + */ + +MemoryStore.prototype.set = function(sid, sess, fn){ + var self = this; + process.nextTick(function(){ + self.sessions[sid] = JSON.stringify(sess); + fn && fn(); + }); +}; + +/** + * Destroy the session associated with the given `sid`. + * + * @param {String} sid + * @api public + */ + +MemoryStore.prototype.destroy = function(sid, fn){ + var self = this; + process.nextTick(function(){ + delete self.sessions[sid]; + fn && fn(); + }); +}; + +/** + * Invoke the given callback `fn` with all active sessions. + * + * @param {Function} fn + * @api public + */ + +MemoryStore.prototype.all = function(fn){ + var arr = [] + , keys = Object.keys(this.sessions); + for (var i = 0, len = keys.length; i < len; ++i) { + arr.push(this.sessions[keys[i]]); + } + fn(null, arr); +}; + +/** + * Clear all sessions. + * + * @param {Function} fn + * @api public + */ + +MemoryStore.prototype.clear = function(fn){ + this.sessions = {}; + fn && fn(); +}; + +/** + * Fetch number of sessions. + * + * @param {Function} fn + * @api public + */ + +MemoryStore.prototype.length = function(fn){ + fn(null, Object.keys(this.sessions).length); +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/session.js b/node_modules/express/node_modules/connect/lib/middleware/session/session.js new file mode 100644 index 00000000..0dd4b400 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/session/session.js @@ -0,0 +1,116 @@ + +/*! + * Connect - session - Session + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../../utils'); + +/** + * Create a new `Session` with the given request and `data`. + * + * @param {IncomingRequest} req + * @param {Object} data + * @api private + */ + +var Session = module.exports = function Session(req, data) { + Object.defineProperty(this, 'req', { value: req }); + Object.defineProperty(this, 'id', { value: req.sessionID }); + if ('object' == typeof data) utils.merge(this, data); +}; + +/** + * Update reset `.cookie.maxAge` to prevent + * the cookie from expiring when the + * session is still active. + * + * @return {Session} for chaining + * @api public + */ + +Session.prototype.touch = function(){ + return this.resetMaxAge(); +}; + +/** + * Reset `.maxAge` to `.originalMaxAge`. + * + * @return {Session} for chaining + * @api public + */ + +Session.prototype.resetMaxAge = function(){ + this.cookie.maxAge = this.cookie.originalMaxAge; + return this; +}; + +/** + * Save the session data with optional callback `fn(err)`. + * + * @param {Function} fn + * @return {Session} for chaining + * @api public + */ + +Session.prototype.save = function(fn){ + this.req.sessionStore.set(this.id, this, fn || function(){}); + return this; +}; + +/** + * Re-loads the session data _without_ altering + * the maxAge properties. Invokes the callback `fn(err)`, + * after which time if no exception has occurred the + * `req.session` property will be a new `Session` object, + * although representing the same session. + * + * @param {Function} fn + * @return {Session} for chaining + * @api public + */ + +Session.prototype.reload = function(fn){ + var req = this.req + , store = this.req.sessionStore; + store.get(this.id, function(err, sess){ + if (err) return fn(err); + if (!sess) return fn(new Error('failed to load session')); + store.createSession(req, sess); + fn(); + }); + return this; +}; + +/** + * Destroy `this` session. + * + * @param {Function} fn + * @return {Session} for chaining + * @api public + */ + +Session.prototype.destroy = function(fn){ + delete this.req.session; + this.req.sessionStore.destroy(this.id, fn); + return this; +}; + +/** + * Regenerate this request's session. + * + * @param {Function} fn + * @return {Session} for chaining + * @api public + */ + +Session.prototype.regenerate = function(fn){ + this.req.sessionStore.regenerate(this.req, fn); + return this; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/store.js b/node_modules/express/node_modules/connect/lib/middleware/session/store.js new file mode 100644 index 00000000..54294cbd --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/session/store.js @@ -0,0 +1,84 @@ + +/*! + * Connect - session - Store + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , Session = require('./session') + , Cookie = require('./cookie'); + +/** + * Initialize abstract `Store`. + * + * @api private + */ + +var Store = module.exports = function Store(options){}; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Store.prototype.__proto__ = EventEmitter.prototype; + +/** + * Re-generate the given requests's session. + * + * @param {IncomingRequest} req + * @return {Function} fn + * @api public + */ + +Store.prototype.regenerate = function(req, fn){ + var self = this; + this.destroy(req.sessionID, function(err){ + self.generate(req); + fn(err); + }); +}; + +/** + * Load a `Session` instance via the given `sid` + * and invoke the callback `fn(err, sess)`. + * + * @param {String} sid + * @param {Function} fn + * @api public + */ + +Store.prototype.load = function(sid, fn){ + var self = this; + this.get(sid, function(err, sess){ + if (err) return fn(err); + if (!sess) return fn(); + var req = { sessionID: sid, sessionStore: self }; + sess = self.createSession(req, sess); + fn(null, sess); + }); +}; + +/** + * Create session from JSON `sess` data. + * + * @param {IncomingRequest} req + * @param {Object} sess + * @return {Session} + * @api private + */ + +Store.prototype.createSession = function(req, sess){ + var expires = sess.cookie.expires + , orig = sess.cookie.originalMaxAge; + sess.cookie = new Cookie(sess.cookie); + if ('string' == typeof expires) sess.cookie.expires = new Date(expires); + sess.cookie.originalMaxAge = orig; + req.session = new Session(req, sess); + return req.session; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/static.js b/node_modules/express/node_modules/connect/lib/middleware/static.js new file mode 100644 index 00000000..67970dab --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/static.js @@ -0,0 +1,102 @@ +/*! + * Connect - static + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var send = require('send') + , utils = require('../utils') + , parse = utils.parseUrl + , url = require('url'); + +/** + * Static: + * + * Static file server with the given `root` path. + * + * Examples: + * + * var oneDay = 86400000; + * + * connect() + * .use(connect.static(__dirname + '/public')) + * + * connect() + * .use(connect.static(__dirname + '/public', { maxAge: oneDay })) + * + * Options: + * + * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 + * - `hidden` Allow transfer of hidden files. defaults to false + * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true + * - `index` Default file name, defaults to 'index.html' + * + * @param {String} root + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function(root, options){ + options = options || {}; + + // root required + if (!root) throw new Error('static() root path required'); + + // default redirect + var redirect = false !== options.redirect; + + return function staticMiddleware(req, res, next) { + if ('GET' != req.method && 'HEAD' != req.method) return next(); + var originalUrl = url.parse(req.originalUrl); + var path = parse(req).pathname; + var pause = utils.pause(req); + + if (path == '/' && originalUrl.pathname[originalUrl.pathname.length - 1] != '/') { + return directory(); + } + + function resume() { + next(); + pause.resume(); + } + + function directory() { + if (!redirect) return resume(); + var target; + originalUrl.pathname += '/'; + target = url.format(originalUrl); + res.statusCode = 303; + res.setHeader('Location', target); + res.end('Redirecting to ' + utils.escape(target)); + } + + function error(err) { + if (404 == err.status) return resume(); + next(err); + } + + send(req, path) + .maxage(options.maxAge || 0) + .root(root) + .index(options.index || 'index.html') + .hidden(options.hidden) + .on('error', error) + .on('directory', directory) + .pipe(res); + }; +}; + +/** + * Expose mime module. + * + * If you wish to extend the mime table use this + * reference to the "mime" module in the npm registry. + */ + +exports.mime = send.mime; diff --git a/node_modules/express/node_modules/connect/lib/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib/middleware/staticCache.js new file mode 100644 index 00000000..66d3c1f6 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/staticCache.js @@ -0,0 +1,238 @@ + +/*! + * Connect - staticCache + * Copyright(c) 2011 Sencha Inc. + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils') + , Cache = require('../cache') + , fresh = require('fresh'); + +/** + * Static cache: + * + * Status: Deprecated. This middleware will be removed in + * Connect 3.0. You may be interested in: + * + * - [st](https://github.com/isaacs/st) + * + * Enables a memory cache layer on top of + * the `static()` middleware, serving popular + * static files. + * + * By default a maximum of 128 objects are + * held in cache, with a max of 256k each, + * totalling ~32mb. + * + * A Least-Recently-Used (LRU) cache algo + * is implemented through the `Cache` object, + * simply rotating cache objects as they are + * hit. This means that increasingly popular + * objects maintain their positions while + * others get shoved out of the stack and + * garbage collected. + * + * Benchmarks: + * + * static(): 2700 rps + * node-static: 5300 rps + * static() + staticCache(): 7500 rps + * + * Options: + * + * - `maxObjects` max cache objects [128] + * - `maxLength` max cache object length 256kb + * + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function staticCache(options){ + var options = options || {} + , cache = new Cache(options.maxObjects || 128) + , maxlen = options.maxLength || 1024 * 256; + + if (process.env.NODE_ENV !== 'test') { + console.warn('connect.staticCache() is deprecated and will be removed in 3.0'); + console.warn('use varnish or similar reverse proxy caches.'); + } + + return function staticCache(req, res, next){ + var key = cacheKey(req) + , ranges = req.headers.range + , hasCookies = req.headers.cookie + , hit = cache.get(key); + + // cache static + // TODO: change from staticCache() -> cache() + // and make this work for any request + req.on('static', function(stream){ + var headers = res._headers + , cc = utils.parseCacheControl(headers['cache-control'] || '') + , contentLength = headers['content-length'] + , hit; + + // dont cache set-cookie responses + if (headers['set-cookie']) return hasCookies = true; + + // dont cache when cookies are present + if (hasCookies) return; + + // ignore larger files + if (!contentLength || contentLength > maxlen) return; + + // don't cache partial files + if (headers['content-range']) return; + + // dont cache items we shouldn't be + // TODO: real support for must-revalidate / no-cache + if ( cc['no-cache'] + || cc['no-store'] + || cc['private'] + || cc['must-revalidate']) return; + + // if already in cache then validate + if (hit = cache.get(key)){ + if (headers.etag == hit[0].etag) { + hit[0].date = new Date; + return; + } else { + cache.remove(key); + } + } + + // validation notifiactions don't contain a steam + if (null == stream) return; + + // add the cache object + var arr = []; + + // store the chunks + stream.on('data', function(chunk){ + arr.push(chunk); + }); + + // flag it as complete + stream.on('end', function(){ + var cacheEntry = cache.add(key); + delete headers['x-cache']; // Clean up (TODO: others) + cacheEntry.push(200); + cacheEntry.push(headers); + cacheEntry.push.apply(cacheEntry, arr); + }); + }); + + if (req.method == 'GET' || req.method == 'HEAD') { + if (ranges) { + next(); + } else if (!hasCookies && hit && !mustRevalidate(req, hit)) { + res.setHeader('X-Cache', 'HIT'); + respondFromCache(req, res, hit); + } else { + res.setHeader('X-Cache', 'MISS'); + next(); + } + } else { + next(); + } + } +}; + +/** + * Respond with the provided cached value. + * TODO: Assume 200 code, that's iffy. + * + * @param {Object} req + * @param {Object} res + * @param {Object} cacheEntry + * @return {String} + * @api private + */ + +function respondFromCache(req, res, cacheEntry) { + var status = cacheEntry[0] + , headers = utils.merge({}, cacheEntry[1]) + , content = cacheEntry.slice(2); + + headers.age = (new Date - new Date(headers.date)) / 1000 || 0; + + switch (req.method) { + case 'HEAD': + res.writeHead(status, headers); + res.end(); + break; + case 'GET': + if (utils.conditionalGET(req) && fresh(req.headers, headers)) { + headers['content-length'] = 0; + res.writeHead(304, headers); + res.end(); + } else { + res.writeHead(status, headers); + + function write() { + while (content.length) { + if (false === res.write(content.shift())) { + res.once('drain', write); + return; + } + } + res.end(); + } + + write(); + } + break; + default: + // This should never happen. + res.writeHead(500, ''); + res.end(); + } +} + +/** + * Determine whether or not a cached value must be revalidated. + * + * @param {Object} req + * @param {Object} cacheEntry + * @return {String} + * @api private + */ + +function mustRevalidate(req, cacheEntry) { + var cacheHeaders = cacheEntry[1] + , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '') + , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '') + , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0; + + if ( cacheCC['no-cache'] + || cacheCC['must-revalidate'] + || cacheCC['proxy-revalidate']) return true; + + if (reqCC['no-cache']) return true; + + if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge; + + if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge; + + return false; +} + +/** + * The key to use in the cache. For now, this is the URL path and query. + * + * 'http://example.com?key=value' -> '/?key=value' + * + * @param {Object} req + * @return {String} + * @api private + */ + +function cacheKey(req) { + return utils.parseUrl(req).path; +} diff --git a/node_modules/express/node_modules/connect/lib/middleware/timeout.js b/node_modules/express/node_modules/connect/lib/middleware/timeout.js new file mode 100644 index 00000000..5496c024 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/timeout.js @@ -0,0 +1,55 @@ +/*! + * Connect - timeout + * Ported from https://github.com/LearnBoost/connect-timeout + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var debug = require('debug')('connect:timeout'); + +/** + * Timeout: + * + * Times out the request in `ms`, defaulting to `5000`. The + * method `req.clearTimeout()` is added to revert this behaviour + * programmatically within your application's middleware, routes, etc. + * + * The timeout error is passed to `next()` so that you may customize + * the response behaviour. This error has the `.timeout` property as + * well as `.status == 503`. + * + * @param {Number} ms + * @return {Function} + * @api public + */ + +module.exports = function timeout(ms) { + ms = ms || 5000; + + return function(req, res, next) { + var id = setTimeout(function(){ + req.emit('timeout', ms); + }, ms); + + req.on('timeout', function(){ + if (res.headerSent) return debug('response started, cannot timeout'); + var err = new Error('Response timeout'); + err.timeout = ms; + err.status = 503; + next(err); + }); + + req.clearTimeout = function(){ + clearTimeout(id); + }; + + res.on('header', function(){ + clearTimeout(id); + }); + + next(); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js new file mode 100644 index 00000000..ebc6f5fc --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js @@ -0,0 +1,77 @@ + +/*! + * Connect - urlencoded + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var utils = require('../utils'); +var getBody = require('raw-body'); +var qs = require('qs'); + +/** + * Urlencoded: + * + * Parse x-ww-form-urlencoded request bodies, + * providing the parsed object as `req.body` using + * [qs](https://github.com/visionmedia/node-querystring). + * + * Options: + * + * - `limit` byte limit [1mb] + * + * @param {Object} options + * @return {Function} + * @api public + */ + +exports = module.exports = function(options){ + options = options || {}; + var verify = typeof options.verify === 'function' && options.verify; + + return function urlencoded(req, res, next) { + if (req._body) return next(); + req.body = req.body || {}; + + if (!utils.hasBody(req)) return next(); + + // check Content-Type + if ('application/x-www-form-urlencoded' != utils.mime(req)) return next(); + + // flag as parsed + req._body = true; + + // parse + getBody(req, { + limit: options.limit || '1mb', + length: req.headers['content-length'], + encoding: 'utf8' + }, function (err, buf) { + if (err) return next(err); + + if (verify) { + try { + verify(req, res, buf) + } catch (err) { + if (!err.status) err.status = 403; + return next(err); + } + } + + try { + req.body = buf.length + ? qs.parse(buf, options) + : {}; + } catch (err){ + err.body = buf; + return next(err); + } + next(); + }) + } +}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/node_modules/express/node_modules/connect/lib/middleware/vhost.js new file mode 100644 index 00000000..abbb0500 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/middleware/vhost.js @@ -0,0 +1,40 @@ + +/*! + * Connect - vhost + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Vhost: + * + * Setup vhost for the given `hostname` and `server`. + * + * connect() + * .use(connect.vhost('foo.com', fooApp)) + * .use(connect.vhost('bar.com', barApp)) + * .use(connect.vhost('*.com', mainApp)) + * + * The `server` may be a Connect server or + * a regular Node `http.Server`. + * + * @param {String} hostname + * @param {Server} server + * @return {Function} + * @api public + */ + +module.exports = function vhost(hostname, server){ + if (!hostname) throw new Error('vhost hostname required'); + if (!server) throw new Error('vhost server required'); + var regexp = new RegExp('^' + hostname.replace(/[^*\w]/g, '\\$&').replace(/[*]/g, '(?:.*?)') + '$', 'i'); + if (server.onvhost) server.onvhost(hostname); + return function vhost(req, res, next){ + if (!req.headers.host) return next(); + var host = req.headers.host.split(':')[0]; + if (!regexp.test(host)) return next(); + if ('function' == typeof server) return server(req, res, next); + server.emit('request', req, res); + }; +}; diff --git a/node_modules/express/node_modules/connect/lib/patch.js b/node_modules/express/node_modules/connect/lib/patch.js new file mode 100644 index 00000000..22bcbc62 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/patch.js @@ -0,0 +1,89 @@ + +/*! + * Connect + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var http = require('http') + , res = http.ServerResponse.prototype + , setHeader = res.setHeader + , _renderHeaders = res._renderHeaders + , writeHead = res.writeHead; + +// apply only once + +if (!res._hasConnectPatch) { + + /** + * Provide a public "header sent" flag + * until node does. + * + * @return {Boolean} + * @api public + */ + + res.__defineGetter__('headerSent', function(){ + return this._header; + }); + + /** + * Set header `field` to `val`, special-casing + * the `Set-Cookie` field for multiple support. + * + * @param {String} field + * @param {String} val + * @api public + */ + + res.setHeader = function(field, val){ + var key = field.toLowerCase() + , prev; + + // special-case Set-Cookie + if (this._headers && 'set-cookie' == key) { + if (prev = this.getHeader(field)) { + if (Array.isArray(prev)) { + val = prev.concat(val); + } else if (Array.isArray(val)) { + val = val.concat(prev); + } else { + val = [prev, val]; + } + } + // charset + } else if ('content-type' == key && this.charset) { + val += '; charset=' + this.charset; + } + + return setHeader.call(this, field, val); + }; + + /** + * Proxy to emit "header" event. + */ + + res._renderHeaders = function(){ + if (!this._emittedHeader) this.emit('header'); + this._emittedHeader = true; + return _renderHeaders.call(this); + }; + + res.writeHead = function(statusCode, reasonPhrase, headers){ + if (typeof reasonPhrase === 'object') headers = reasonPhrase; + if (typeof headers === 'object') { + Object.keys(headers).forEach(function(key){ + this.setHeader(key, headers[key]); + }, this); + } + if (!this._emittedHeader) this.emit('header'); + this._emittedHeader = true; + return writeHead.call(this, statusCode, reasonPhrase); + }; + + res._hasConnectPatch = true; +} diff --git a/node_modules/express/node_modules/connect/lib/proto.js b/node_modules/express/node_modules/connect/lib/proto.js new file mode 100644 index 00000000..a945bc28 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/proto.js @@ -0,0 +1,233 @@ +/*! + * Connect - HTTPServer + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var http = require('http') + , utils = require('./utils') + , debug = require('debug')('connect:dispatcher'); + +// prototype + +var app = module.exports = {}; + +// environment + +var env = process.env.NODE_ENV || 'development'; + +/** + * Utilize the given middleware `handle` to the given `route`, + * defaulting to _/_. This "route" is the mount-point for the + * middleware, when given a value other than _/_ the middleware + * is only effective when that segment is present in the request's + * pathname. + * + * For example if we were to mount a function at _/admin_, it would + * be invoked on _/admin_, and _/admin/settings_, however it would + * not be invoked for _/_, or _/posts_. + * + * Examples: + * + * var app = connect(); + * app.use(connect.favicon()); + * app.use(connect.logger()); + * app.use(connect.static(__dirname + '/public')); + * + * If we wanted to prefix static files with _/public_, we could + * "mount" the `static()` middleware: + * + * app.use('/public', connect.static(__dirname + '/public')); + * + * This api is chainable, so the following is valid: + * + * connect() + * .use(connect.favicon()) + * .use(connect.logger()) + * .use(connect.static(__dirname + '/public')) + * .listen(3000); + * + * @param {String|Function|Server} route, callback or server + * @param {Function|Server} callback or server + * @return {Server} for chaining + * @api public + */ + +app.use = function(route, fn){ + // default route to '/' + if ('string' != typeof route) { + fn = route; + route = '/'; + } + + // wrap sub-apps + if ('function' == typeof fn.handle) { + var server = fn; + fn.route = route; + fn = function(req, res, next){ + server.handle(req, res, next); + }; + } + + // wrap vanilla http.Servers + if (fn instanceof http.Server) { + fn = fn.listeners('request')[0]; + } + + // strip trailing slash + if ('/' == route[route.length - 1]) { + route = route.slice(0, -1); + } + + // add the middleware + debug('use %s %s', route || '/', fn.name || 'anonymous'); + this.stack.push({ route: route, handle: fn }); + + return this; +}; + +/** + * Handle server requests, punting them down + * the middleware stack. + * + * @api private + */ + +app.handle = function(req, res, out) { + var stack = this.stack + , search = 1 + req.url.indexOf('?') + , pathlength = search ? search - 1 : req.url.length + , fqdn = 1 + req.url.substr(0, pathlength).indexOf('://') + , protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : '' + , removed = '' + , slashAdded = false + , index = 0; + + function next(err) { + var layer, path, c; + + if (slashAdded) { + req.url = req.url.substr(1); + slashAdded = false; + } + + req.url = protohost + removed + req.url.substr(protohost.length); + req.originalUrl = req.originalUrl || req.url; + removed = ''; + + // next callback + layer = stack[index++]; + + // all done + if (!layer || res.headerSent) { + // delegate to parent + if (out) return out(err); + + // unhandled error + if (err) { + // default to 500 + if (res.statusCode < 400) res.statusCode = 500; + debug('default %s', res.statusCode); + + // respect err.status + if (err.status) res.statusCode = err.status; + + // production gets a basic error message + var msg = 'production' == env + ? http.STATUS_CODES[res.statusCode] + : err.stack || err.toString(); + msg = utils.escape(msg); + + // log to stderr in a non-test env + if ('test' != env) console.error(err.stack || err.toString()); + if (res.headerSent) return req.socket.destroy(); + res.setHeader('Content-Type', 'text/html'); + res.setHeader('Content-Length', Buffer.byteLength(msg)); + if ('HEAD' == req.method) return res.end(); + res.end(msg); + } else { + debug('default 404'); + res.statusCode = 404; + res.setHeader('Content-Type', 'text/html'); + if ('HEAD' == req.method) return res.end(); + res.end('Cannot ' + utils.escape(req.method) + ' ' + utils.escape(req.originalUrl) + '\n'); + } + return; + } + + try { + path = utils.parseUrl(req).pathname; + if (undefined == path) path = '/'; + + // skip this layer if the route doesn't match. + if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err); + + c = path[layer.route.length]; + if (c && '/' != c && '.' != c) return next(err); + + // Call the layer handler + // Trim off the part of the url that matches the route + removed = layer.route; + req.url = protohost + req.url.substr(protohost.length + removed.length); + + // Ensure leading slash + if (!fqdn && '/' != req.url[0]) { + req.url = '/' + req.url; + slashAdded = true; + } + + debug('%s %s : %s', layer.handle.name || 'anonymous', layer.route, req.originalUrl); + var arity = layer.handle.length; + if (err) { + if (arity === 4) { + layer.handle(err, req, res, next); + } else { + next(err); + } + } else if (arity < 4) { + layer.handle(req, res, next); + } else { + next(); + } + } catch (e) { + next(e); + } + } + next(); +}; + +/** + * Listen for connections. + * + * This method takes the same arguments + * as node's `http.Server#listen()`. + * + * HTTP and HTTPS: + * + * If you run your application both as HTTP + * and HTTPS you may wrap them individually, + * since your Connect "server" is really just + * a JavaScript `Function`. + * + * var connect = require('connect') + * , http = require('http') + * , https = require('https'); + * + * var app = connect(); + * + * http.createServer(app).listen(80); + * https.createServer(options, app).listen(443); + * + * @return {http.Server} + * @api public + */ + +app.listen = function(){ + var server = http.createServer(this); + return server.listen.apply(server, arguments); +}; diff --git a/node_modules/express/node_modules/connect/lib/public/directory.html b/node_modules/express/node_modules/connect/lib/public/directory.html new file mode 100644 index 00000000..8ed8b4ae --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/public/directory.html @@ -0,0 +1,82 @@ + + + + + + listing directory {directory} + + + + + +
    +

    {linked-path}

    + {files} +
    + + \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/public/error.html b/node_modules/express/node_modules/connect/lib/public/error.html new file mode 100644 index 00000000..a6d3fafd --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/public/error.html @@ -0,0 +1,14 @@ + + + + {error} + + + +
    +

    {title}

    +

    {statusCode} {error}

    +
      {stack}
    +
    + + diff --git a/node_modules/express/node_modules/connect/lib/public/favicon.ico b/node_modules/express/node_modules/connect/lib/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..895fc96a76b68b4924f1c51d022e1b82fa0f461f GIT binary patch literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F3ph+MhN1^33zoMD^Qf+OIbI z_vzZRHrl2)_1={G_UPKGHvRhX{`~jauQl4MHQJ#z@6?p>&M@@WPy6!9|NZ*z&vNe1 zcIC=+{`~Ov-**4~_}ZE_{`~gl&3W(8didmy*|aqN{{8galk(9!_1RtU%O?2h!v6g6 z@6v$ShAi&Ri1pr);lf_`?X&*+@B8=a>A`dH&}{P1Iqk}7_~w-M;jG)XJpcav^w(GX_Sp8| zeD>+d|NQmh!(aL7q50{g`taQP?5y|Wi}BKO^V3K9=$!J?dHCj)_~nuG-KX{2W%k~7 z_u_^3;eqtqp7hsL^3;F!-g5KWmi5|W^Vp8_*M|Q4?%I?!*^V>*{PNg`E&luOc;lI#g?V|#d$J3Kmj3P0WE89Ckq2LIayw2pn#a5gpo&Z zVQHa4ab7tqP=LQ&$tt8Y(8pAfn~9ADC?Kw4<`Nkj738QR#l^@06i_yI4UbPrP71Km zmgHmy3go+mC8TC%r^k5N=}PAV1qvb()3S1MGvcB>ZS@L34yh=rfP$h5Ln6Ee02${e U&JJnEtpET307*qoM6N<$g314QZvX%Q literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page.png b/node_modules/express/node_modules/connect/lib/public/icons/page.png new file mode 100644 index 0000000000000000000000000000000000000000..03ddd799fa0a3aec561c75d4221f195db65d6eb9 GIT binary patch literal 635 zcmV->0)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png new file mode 100644 index 0000000000000000000000000000000000000000..89ee2da0753040d1ba0a3487473a715a8fe89322 GIT binary patch literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_code.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ea90419d950f9e69d977a1f5847456d96a5f0b GIT binary patch literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..195dc6d6c365d298e466026b37c1959d96119ea7 GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib/public/icons/page_error.png new file mode 100644 index 0000000000000000000000000000000000000000..f07f449a44ff2761bfc7b752db3d08d0e1238b02 GIT binary patch literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9 GIT binary patch literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_find.png new file mode 100644 index 0000000000000000000000000000000000000000..2f193889f7ea091c292acdd684c595dcb206b5c4 GIT binary patch literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib/public/icons/page_go.png new file mode 100644 index 0000000000000000000000000000000000000000..80fe1ed0cc75fbb67e9398ae686641f8fb287238 GIT binary patch literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d6626cb09eb11a298b90a8a27b0d8eab41f49a82 GIT binary patch literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..7e568703d6432c530224e443771a04fc1e2e59c6 GIT binary patch literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_link.png new file mode 100644 index 0000000000000000000000000000000000000000..312eab0914ab59271384686255d1be913a6b3add GIT binary patch literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png new file mode 100644 index 0000000000000000000000000000000000000000..246a2f0b426faa0c7f5ba009e32b1deaf88d1288 GIT binary patch literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png new file mode 100644 index 0000000000000000000000000000000000000000..968f073fdddc1cc0f0800b1ac4001cd9a55f053d GIT binary patch literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_red.png new file mode 100644 index 0000000000000000000000000000000000000000..0b18247da5850f3c2486373a3e179acd2772e8aa GIT binary patch literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..cf347c7d4685128a4a447abb9fb8e939417644f4 GIT binary patch literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8b1ca0000bc8fa8d0379926736029f8fabe364 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png new file mode 100644 index 0000000000000000000000000000000000000000..159b24075191fc259cfd80c797a1b0d74c168422 GIT binary patch literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png new file mode 100644 index 0000000000000000000000000000000000000000..0c76bd1297751b66230f74719504b2adb02b1615 GIT binary patch literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png new file mode 100644 index 0000000000000000000000000000000000000000..87a69145075afd8f8fd8b391c5da1249ec8b2889 GIT binary patch literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png new file mode 100644 index 0000000000000000000000000000000000000000..c66011fb0fbdcbf210483d676b7131542a0e282b GIT binary patch literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f31a278e17993d8d4e13beac2f9d5f7b42d08f GIT binary patch literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..b93e77600def75c9a144d3d0a5088a62c02cbb0b GIT binary patch literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png new file mode 100644 index 0000000000000000000000000000000000000000..b977d7e52e2446ea01201c5c7209ac3a05f12c9f GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png new file mode 100644 index 0000000000000000000000000000000000000000..581843637079359a6a58fcdccf0763690c67b063 GIT binary patch literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png new file mode 100644 index 0000000000000000000000000000000000000000..8d719df5205f7415ce657e5c277db4533c82f346 GIT binary patch literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png new file mode 100644 index 0000000000000000000000000000000000000000..106f5aa3611a4807ec8c21701c631730275089a4 GIT binary patch literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a1ecba1b60e54f3777717ed105cdde745b7184 GIT binary patch literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d61648452284da1bc28b10385f95b5d2bf027901 GIT binary patch literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7bd1c9bfd78d689c73ba67cf914182933ee68c GIT binary patch literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e GIT binary patch literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png new file mode 100644 index 0000000000000000000000000000000000000000..a65bcb3e1e9613cd9e4950850db43d7025a5fdf9 GIT binary patch literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png new file mode 100644 index 0000000000000000000000000000000000000000..23a37b891c2f5faa3b8128d45373ceab794ca609 GIT binary patch literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..134b6693687b2fa5fe36d48a9c0b8001f937c741 GIT binary patch literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..c4eff0387d5888c638ba09473ba6d2369f7b56f0 GIT binary patch literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png new file mode 100644 index 0000000000000000000000000000000000000000..f59b7c4365fa1720af1aa04eb47167ddaa6eeed4 GIT binary patch literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..44084add79b9a0fc3354d16bbd4b4b5ff8095da7 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1441c9a12062a4bb3d706000d3ca14399aebca GIT binary patch literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png new file mode 100644 index 0000000000000000000000000000000000000000..e7708292adabf4821612bfca032cbd019c63180b GIT binary patch literal 634 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 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb880947ddf3e745c29e8d9dc90f09c7e6e323c GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8ecbf47672a874c0958d0d113a56162c2bd364 GIT binary patch literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2490ed1432d5d667a76235360824a1088e928 GIT binary patch literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..fecadd08afed92536be91ab12d8e37b6bf410d5d GIT binary patch literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4bbccdf1643f4ff5022fbc59b82546e259317e GIT binary patch literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/lib/public/style.css b/node_modules/express/node_modules/connect/lib/public/style.css new file mode 100644 index 00000000..0709908a --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/public/style.css @@ -0,0 +1,257 @@ +* { + margin: 0; + padding: 0; + outline: 0; +} + +body { + padding: 80px 100px; + font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; + background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); + background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); + background-repeat: no-repeat; + color: #555; + -webkit-font-smoothing: antialiased; +} +h1, h2, h3 { + font-size: 22px; + color: #343434; +} +h1 em, h2 em { + padding: 0 5px; + font-weight: normal; +} +h1 { + font-size: 60px; +} +h2 { + margin-top: 10px; +} +h3 { + margin: 5px 0 10px 0; + padding-bottom: 5px; + border-bottom: 1px solid #eee; + font-size: 18px; +} +ul li { + list-style: none; +} +ul li:hover { + cursor: pointer; + color: #2e2e2e; +} +ul li .path { + padding-left: 5px; + font-weight: bold; +} +ul li .line { + padding-right: 5px; + font-style: italic; +} +ul li:first-child .path { + padding-left: 0; +} +p { + line-height: 1.5; +} +a { + color: #555; + text-decoration: none; +} +a:hover { + color: #303030; +} +#stacktrace { + margin-top: 15px; +} +.directory h1 { + margin-bottom: 15px; + font-size: 18px; +} +ul#files { + width: 100%; + height: 100%; + overflow: hidden; +} +ul#files li { + float: left; + width: 30%; + line-height: 25px; + margin: 1px; +} +ul#files li a { + display: block; + height: 25px; + border: 1px solid transparent; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + overflow: hidden; + white-space: nowrap; +} +ul#files li a:focus, +ul#files li a:hover { + background: rgba(255,255,255,0.65); + border: 1px solid #ececec; +} +ul#files li a.highlight { + -webkit-transition: background .4s ease-in-out; + background: #ffff4f; + border-color: #E9DC51; +} +#search { + display: block; + position: fixed; + top: 20px; + right: 20px; + width: 90px; + -webkit-transition: width ease 0.2s, opacity ease 0.4s; + -moz-transition: width ease 0.2s, opacity ease 0.4s; + -webkit-border-radius: 32px; + -moz-border-radius: 32px; + -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); + -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); + -webkit-font-smoothing: antialiased; + text-align: left; + font: 13px "Helvetica Neue", Arial, sans-serif; + padding: 4px 10px; + border: none; + background: transparent; + margin-bottom: 0; + outline: none; + opacity: 0.7; + color: #888; +} +#search:focus { + width: 120px; + opacity: 1.0; +} + +/*views*/ +#files span { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + text-indent: 10px; +} +#files .name { + background-repeat: no-repeat; +} +#files .icon .name { + text-indent: 28px; +} + +/*tiles*/ +.view-tiles .name { + width: 100%; + background-position: 8px 5px; +} +.view-tiles .size, +.view-tiles .date { + display: none; +} + +/*details*/ +ul#files.view-details li { + float: none; + display: block; + width: 90%; +} +ul#files.view-details li.header { + height: 25px; + background: #000; + color: #fff; + font-weight: bold; +} +.view-details .header { + border-radius: 5px; +} +.view-details .name { + width: 60%; + background-position: 8px 5px; +} +.view-details .size { + width: 10%; +} +.view-details .date { + width: 30%; +} +.view-details .size, +.view-details .date { + text-align: right; + direction: rtl; +} + +/*mobile*/ +@media (max-width: 768px) { + body { + font-size: 13px; + line-height: 16px; + padding: 0; + } + #search { + position: static; + width: 100%; + font-size: 2em; + line-height: 1.8em; + text-indent: 10px; + border: 0; + border-radius: 0; + padding: 10px 0; + margin: 0; + } + #search:focus { + width: 100%; + border: 0; + opacity: 1; + } + .directory h1 { + font-size: 2em; + line-height: 1.5em; + color: #fff; + background: #000; + padding: 15px 10px; + margin: 0; + } + ul#files { + border-top: 1px solid #cacaca; + } + ul#files li { + float: none; + width: auto !important; + display: block; + border-bottom: 1px solid #cacaca; + font-size: 2em; + line-height: 1.2em; + text-indent: 0; + margin: 0; + } + ul#files li:nth-child(odd) { + background: #e0e0e0; + } + ul#files li a { + height: auto; + border: 0; + border-radius: 0; + padding: 15px 10px; + } + ul#files li a:focus, + ul#files li a:hover { + border: 0; + } + #files .header, + #files .size, + #files .date { + display: none !important; + } + #files .name { + float: none; + display: inline-block; + width: 100%; + text-indent: 0; + background-position: 0 0; + } + #files .icon .name { + text-indent: 41px; + } +} diff --git a/node_modules/express/node_modules/connect/lib/utils.js b/node_modules/express/node_modules/connect/lib/utils.js new file mode 100644 index 00000000..9839bc33 --- /dev/null +++ b/node_modules/express/node_modules/connect/lib/utils.js @@ -0,0 +1,408 @@ + +/*! + * Connect - utils + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var http = require('http') + , crypto = require('crypto') + , parse = require('url').parse + , sep = require('path').sep + , signature = require('cookie-signature') + , nodeVersion = process.versions.node.split('.'); + +// pause is broken in node < 0.10 +exports.brokenPause = parseInt(nodeVersion[0], 10) === 0 + && parseInt(nodeVersion[1], 10) < 10; + +/** + * Return `true` if the request has a body, otherwise return `false`. + * + * @param {IncomingMessage} req + * @return {Boolean} + * @api private + */ + +exports.hasBody = function(req) { + var encoding = 'transfer-encoding' in req.headers; + var length = 'content-length' in req.headers && req.headers['content-length'] !== '0'; + return encoding || length; +}; + +/** + * Extract the mime type from the given request's + * _Content-Type_ header. + * + * @param {IncomingMessage} req + * @return {String} + * @api private + */ + +exports.mime = function(req) { + var str = req.headers['content-type'] || ''; + return str.split(';')[0]; +}; + +/** + * Generate an `Error` from the given status `code` + * and optional `msg`. + * + * @param {Number} code + * @param {String} msg + * @return {Error} + * @api private + */ + +exports.error = function(code, msg){ + var err = new Error(msg || http.STATUS_CODES[code]); + err.status = code; + return err; +}; + +/** + * Return md5 hash of the given string and optional encoding, + * defaulting to hex. + * + * utils.md5('wahoo'); + * // => "e493298061761236c96b02ea6aa8a2ad" + * + * @param {String} str + * @param {String} encoding + * @return {String} + * @api private + */ + +exports.md5 = function(str, encoding){ + return crypto + .createHash('md5') + .update(str, 'utf8') + .digest(encoding || 'hex'); +}; + +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * utils.merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api private + */ + +exports.merge = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Sign the given `val` with `secret`. + * + * @param {String} val + * @param {String} secret + * @return {String} + * @api private + */ + +exports.sign = function(val, secret){ + console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature') + return val + '.' + crypto + .createHmac('sha256', secret) + .update(val) + .digest('base64') + .replace(/=+$/, ''); +}; + +/** + * Unsign and decode the given `val` with `secret`, + * returning `false` if the signature is invalid. + * + * @param {String} val + * @param {String} secret + * @return {String|Boolean} + * @api private + */ + +exports.unsign = function(val, secret){ + console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature') + var str = val.slice(0, val.lastIndexOf('.')); + return exports.sign(str, secret) == val + ? str + : false; +}; + +/** + * Parse signed cookies, returning an object + * containing the decoded key/value pairs, + * while removing the signed key from `obj`. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +exports.parseSignedCookies = function(obj, secret){ + var ret = {}; + Object.keys(obj).forEach(function(key){ + var val = obj[key]; + if (0 == val.indexOf('s:')) { + val = signature.unsign(val.slice(2), secret); + if (val) { + ret[key] = val; + delete obj[key]; + } + } + }); + return ret; +}; + +/** + * Parse a signed cookie string, return the decoded value + * + * @param {String} str signed cookie string + * @param {String} secret + * @return {String} decoded value + * @api private + */ + +exports.parseSignedCookie = function(str, secret){ + return 0 == str.indexOf('s:') + ? signature.unsign(str.slice(2), secret) + : str; +}; + +/** + * Parse JSON cookies. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +exports.parseJSONCookies = function(obj){ + Object.keys(obj).forEach(function(key){ + var val = obj[key]; + var res = exports.parseJSONCookie(val); + if (res) obj[key] = res; + }); + return obj; +}; + +/** + * Parse JSON cookie string + * + * @param {String} str + * @return {Object} Parsed object or null if not json cookie + * @api private + */ + +exports.parseJSONCookie = function(str) { + if (0 == str.indexOf('j:')) { + try { + return JSON.parse(str.slice(2)); + } catch (err) { + // no op + } + } +}; + +/** + * Pause `data` and `end` events on the given `obj`. + * Middleware performing async tasks _should_ utilize + * this utility (or similar), to re-emit data once + * the async operation has completed, otherwise these + * events may be lost. Pause is only required for + * node versions less than 10, and is replaced with + * noop's otherwise. + * + * var pause = utils.pause(req); + * fs.readFile(path, function(){ + * next(); + * pause.resume(); + * }); + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +exports.pause = exports.brokenPause + ? require('pause') + : function () { + return { + end: noop, + resume: noop + } + } + +/** + * Strip `Content-*` headers from `res`. + * + * @param {ServerResponse} res + * @api private + */ + +exports.removeContentHeaders = function(res){ + if (!res._headers) return; + Object.keys(res._headers).forEach(function(field){ + if (0 == field.indexOf('content')) { + res.removeHeader(field); + } + }); +}; + +/** + * Check if `req` is a conditional GET request. + * + * @param {IncomingMessage} req + * @return {Boolean} + * @api private + */ + +exports.conditionalGET = function(req) { + return req.headers['if-modified-since'] + || req.headers['if-none-match']; +}; + +/** + * Respond with 401 "Unauthorized". + * + * @param {ServerResponse} res + * @param {String} realm + * @api private + */ + +exports.unauthorized = function(res, realm) { + res.statusCode = 401; + res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"'); + res.end('Unauthorized'); +}; + +/** + * Respond with 304 "Not Modified". + * + * @param {ServerResponse} res + * @param {Object} headers + * @api private + */ + +exports.notModified = function(res) { + exports.removeContentHeaders(res); + res.statusCode = 304; + res.end(); +}; + +/** + * Return an ETag in the form of `"-"` + * from the given `stat`. + * + * @param {Object} stat + * @return {String} + * @api private + */ + +exports.etag = function(stat) { + return '"' + stat.size + '-' + Number(stat.mtime) + '"'; +}; + +/** + * Parse the given Cache-Control `str`. + * + * @param {String} str + * @return {Object} + * @api private + */ + +exports.parseCacheControl = function(str){ + var directives = str.split(',') + , obj = {}; + + for(var i = 0, len = directives.length; i < len; i++) { + var parts = directives[i].split('=') + , key = parts.shift().trim() + , val = parseInt(parts.shift(), 10); + + obj[key] = isNaN(val) ? true : val; + } + + return obj; +}; + +/** + * Parse the `req` url with memoization. + * + * @param {ServerRequest} req + * @return {Object} + * @api private + */ + +exports.parseUrl = function(req){ + var parsed = req._parsedUrl; + if (parsed && parsed.href == req.url) { + return parsed; + } else { + parsed = parse(req.url); + + if (parsed.auth && !parsed.protocol && ~parsed.href.indexOf('//')) { + // This parses pathnames, and a strange pathname like //r@e should work + parsed = parse(req.url.replace(/@/g, '%40')); + } + + return req._parsedUrl = parsed; + } +}; + +/** + * Parse byte `size` string. + * + * @param {String} size + * @return {Number} + * @api private + */ + +exports.parseBytes = require('bytes'); + +/** + * Normalizes the path separator from system separator + * to URL separator, aka `/`. + * + * @param {String} path + * @return {String} + * @api private + */ + +exports.normalizeSlashes = function normalizeSlashes(path) { + return path.split(sep).join('/'); +}; + +function noop() {} diff --git a/node_modules/express/node_modules/connect/node_modules/batch/.npmignore b/node_modules/express/node_modules/connect/node_modules/batch/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/express/node_modules/connect/node_modules/batch/History.md b/node_modules/express/node_modules/connect/node_modules/batch/History.md new file mode 100644 index 00000000..b1b77526 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/History.md @@ -0,0 +1,66 @@ + +0.5.0 / 2013-07-29 +================== + + * add `.throws(true)` to opt-in to responding with an array of error objects + * make `new` optional + +0.4.0 / 2013-06-05 +================== + + * add catching of immediate callback errors + +0.3.2 / 2013-03-15 +================== + + * remove Emitter call in constructor + +0.3.1 / 2013-03-13 +================== + + * add Emitter() mixin for client. Closes #8 + +0.3.0 / 2013-03-13 +================== + + * add component.json + * add result example + * add .concurrency support + * add concurrency example + * add parallel example + +0.2.1 / 2012-11-08 +================== + + * add .start, .end, and .duration properties + * change dependencies to devDependencies + +0.2.0 / 2012-10-04 +================== + + * add progress events. Closes #5 (__BREAKING CHANGE__) + +0.1.1 / 2012-07-03 +================== + + * change "complete" event to "progress" + +0.1.0 / 2012-07-03 +================== + + * add Emitter inheritance and emit "complete" [burcu] + +0.0.3 / 2012-06-02 +================== + + * Callback results should be in the order of the queued functions. + +0.0.2 / 2012-02-12 +================== + + * any node + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/node_modules/connect/node_modules/batch/Makefile b/node_modules/express/node_modules/connect/node_modules/batch/Makefile new file mode 100644 index 00000000..634e3721 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/Makefile @@ -0,0 +1,6 @@ + +test: + @./node_modules/.bin/mocha \ + --require should + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/batch/Readme.md b/node_modules/express/node_modules/connect/node_modules/batch/Readme.md new file mode 100644 index 00000000..f2345c67 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/Readme.md @@ -0,0 +1,74 @@ + +# batch + + Simple async batch with concurrency control and progress reporting. + +## Installation + +``` +$ npm install batch +``` + +## API + +```js +var Batch = require('batch') + , batch = new Batch; + +batch.concurrency(4); + +ids.forEach(function(id){ + batch.push(function(done){ + User.get(id, done); + }); +}); + +batch.on('progress', function(e){ + +}); + +batch.end(function(err, users){ + +}); +``` + +### Progress events + + Contain the "job" index, response value, duration information, and completion data. + +```js +{ index: 1, + value: 'bar', + pending: 2, + total: 3, + complete: 2, + percent: 66, + start: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT), + end: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT), + duration: 0 } +``` + +## License + +(The MIT License) + +Copyright (c) 2013 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/express/node_modules/connect/node_modules/batch/component.json b/node_modules/express/node_modules/connect/node_modules/batch/component.json new file mode 100644 index 00000000..0ea7e582 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/component.json @@ -0,0 +1,14 @@ +{ + "name": "batch", + "repo": "visionmedia/batch", + "description": "Async task batching", + "version": "0.5.0", + "keywords": ["batch", "async", "utility", "concurrency", "concurrent"], + "dependencies": { + "component/emitter": "*" + }, + "development": {}, + "scripts": [ + "index.js" + ] +} diff --git a/node_modules/express/node_modules/connect/node_modules/batch/index.js b/node_modules/express/node_modules/connect/node_modules/batch/index.js new file mode 100644 index 00000000..932d4045 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/index.js @@ -0,0 +1,158 @@ +/** + * Module dependencies. + */ + +try { + var EventEmitter = require('events').EventEmitter; +} catch (err) { + var Emitter = require('emitter'); +} + +/** + * Noop. + */ + +function noop(){} + +/** + * Expose `Batch`. + */ + +module.exports = Batch; + +/** + * Create a new Batch. + */ + +function Batch() { + if (!(this instanceof Batch)) return new Batch; + this.fns = []; + this.concurrency(Infinity); + this.throws(true); + for (var i = 0, len = arguments.length; i < len; ++i) { + this.push(arguments[i]); + } +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +if (EventEmitter) { + Batch.prototype.__proto__ = EventEmitter.prototype; +} else { + Emitter(Batch.prototype); +} + +/** + * Set concurrency to `n`. + * + * @param {Number} n + * @return {Batch} + * @api public + */ + +Batch.prototype.concurrency = function(n){ + this.n = n; + return this; +}; + +/** + * Queue a function. + * + * @param {Function} fn + * @return {Batch} + * @api public + */ + +Batch.prototype.push = function(fn){ + this.fns.push(fn); + return this; +}; + +/** + * Set wether Batch will or will not throw up. + * + * @param {Boolean} throws + * @return {Batch} + * @api public + */ +Batch.prototype.throws = function(throws) { + this.e = !!throws; + return this; +}; + +/** + * Execute all queued functions in parallel, + * executing `cb(err, results)`. + * + * @param {Function} cb + * @return {Batch} + * @api public + */ + +Batch.prototype.end = function(cb){ + var self = this + , total = this.fns.length + , pending = total + , results = [] + , errors = [] + , cb = cb || noop + , fns = this.fns + , max = this.n + , throws = this.e + , index = 0 + , done; + + // empty + if (!fns.length) return cb(null, results); + + // process + function next() { + var i = index++; + var fn = fns[i]; + if (!fn) return; + var start = new Date; + + try { + fn(callback); + } catch (err) { + callback(err); + } + + function callback(err, res){ + if (done) return; + if (err && throws) return done = true, cb(err); + var complete = total - pending + 1; + var end = new Date; + + results[i] = res; + errors[i] = err; + + self.emit('progress', { + index: i, + value: res, + error: err, + pending: pending, + total: total, + complete: complete, + percent: complete / total * 100 | 0, + start: start, + end: end, + duration: end - start + }); + + if (--pending) next() + else if(!throws) cb(errors, results); + else cb(null, results); + } + } + + // concurrency + for (var i = 0; i < fns.length; i++) { + if (i == max) break; + next(); + } + + return this; +}; diff --git a/node_modules/express/node_modules/connect/node_modules/batch/package.json b/node_modules/express/node_modules/connect/node_modules/batch/package.json new file mode 100644 index 00000000..4c2c1758 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/batch/package.json @@ -0,0 +1,22 @@ +{ + "name": "batch", + "version": "0.5.0", + "description": "Simple async batch", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "main": "index", + "readme": "\n# batch\n\n Simple async batch with concurrency control and progress reporting.\n\n## Installation\n\n```\n$ npm install batch\n```\n\n## API\n\n```js\nvar Batch = require('batch')\n , batch = new Batch;\n\nbatch.concurrency(4);\n\nids.forEach(function(id){\n batch.push(function(done){\n User.get(id, done);\n });\n});\n\nbatch.on('progress', function(e){\n\n});\n\nbatch.end(function(err, users){\n\n});\n```\n\n### Progress events\n\n Contain the \"job\" index, response value, duration information, and completion data.\n\n```js\n{ index: 1,\n value: 'bar',\n pending: 2,\n total: 3,\n complete: 2,\n percent: 66,\n start: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT),\n end: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT),\n duration: 0 }\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2013 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "_id": "batch@0.5.0", + "dist": { + "shasum": "4f41ac9cbe3be6cd5aaa900854ac3ce7b627fa21" + }, + "_from": "batch@0.5.0", + "_resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore b/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore @@ -0,0 +1 @@ +test diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/History.md b/node_modules/express/node_modules/connect/node_modules/bytes/History.md new file mode 100644 index 00000000..f233ed16 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/History.md @@ -0,0 +1,15 @@ + +0.2.1 / 2013-04-01 +================== + + * add .component + +0.2.0 / 2012-10-28 +================== + + * bytes(200).should.eql('200b') + +0.1.0 / 2012-07-04 +================== + + * add bytes to string conversion [yields] diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Makefile b/node_modules/express/node_modules/connect/node_modules/bytes/Makefile new file mode 100644 index 00000000..8e8640f2 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --reporter spec \ + --require should + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md b/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md new file mode 100644 index 00000000..9325d5bf --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md @@ -0,0 +1,51 @@ +# node-bytes + + Byte string parser / formatter. + +## Example: + +```js +bytes('1kb') +// => 1024 + +bytes('2mb') +// => 2097152 + +bytes('1gb') +// => 1073741824 + +bytes(1073741824) +// => 1gb +``` + +## Installation + +``` +$ npm install bytes +$ component install visionmedia/bytes.js +``` + +## License + +(The MIT License) + +Copyright (c) 2012 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/express/node_modules/connect/node_modules/bytes/component.json b/node_modules/express/node_modules/connect/node_modules/bytes/component.json new file mode 100644 index 00000000..2929c25d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/component.json @@ -0,0 +1,7 @@ +{ + "name": "bytes", + "description": "byte size string parser / serializer", + "keywords": ["bytes", "utility"], + "version": "0.2.1", + "scripts": ["index.js"] +} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/index.js b/node_modules/express/node_modules/connect/node_modules/bytes/index.js new file mode 100644 index 00000000..70b2e01a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/index.js @@ -0,0 +1,39 @@ + +/** + * Parse byte `size` string. + * + * @param {String} size + * @return {Number} + * @api public + */ + +module.exports = function(size) { + if ('number' == typeof size) return convert(size); + var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/) + , n = parseFloat(parts[1]) + , type = parts[2]; + + var map = { + kb: 1 << 10 + , mb: 1 << 20 + , gb: 1 << 30 + }; + + return map[type] * n; +}; + +/** + * convert bytes into string. + * + * @param {Number} b - bytes to convert + * @return {String} + * @api public + */ + +function convert (b) { + var gb = 1 << 30, mb = 1 << 20, kb = 1 << 10; + if (b >= gb) return (Math.round(b / gb * 100) / 100) + 'gb'; + if (b >= mb) return (Math.round(b / mb * 100) / 100) + 'mb'; + if (b >= kb) return (Math.round(b / kb * 100) / 100) + 'kb'; + return b + 'b'; +} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/package.json b/node_modules/express/node_modules/connect/node_modules/bytes/package.json new file mode 100644 index 00000000..601b1102 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/bytes/package.json @@ -0,0 +1,29 @@ +{ + "name": "bytes", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "description": "byte size string parser / serializer", + "version": "0.2.1", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "component": { + "scripts": { + "bytes/index.js": "index.js" + } + }, + "readme": "# node-bytes\n\n Byte string parser / formatter.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n\nbytes(1073741824)\n// => 1gb\n```\n\n## Installation\n\n```\n$ npm install bytes\n$ component install visionmedia/bytes.js\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "_id": "bytes@0.2.1", + "dist": { + "shasum": "586572818c283774f959f5c5762ece7bdf522f03" + }, + "_from": "bytes@0.2.1", + "_resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/.jshintrc b/node_modules/express/node_modules/connect/node_modules/multiparty/.jshintrc new file mode 100644 index 00000000..a93b50cf --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/.jshintrc @@ -0,0 +1,70 @@ +{ + // Settings + "passfail" : false, // Stop on first error. + "maxerr" : 100, // Maximum errors before stopping. + + + // Predefined globals whom JSHint will ignore. + "browser" : false, // Standard browser globals e.g. `window`, `document`. + + "node" : true, + "rhino" : false, + "couch" : false, + "wsh" : false, // Windows Scripting Host. + + "jquery" : false, + "prototypejs" : false, + "mootools" : false, + "dojo" : false, + + + "predef" : [ + "describe", "it", "before", "after" + ], + + // Development. + "debug" : true, // Allow debugger statements e.g. browser breakpoints. + "devel" : true, // Allow development statements e.g. `console.log();`. + + + // EcmaScript 5. + "es5" : true, // Allow EcmaScript 5 syntax. + "strict" : false, // Require `use strict` pragma in every file. + "globalstrict" : true, // Allow global "use strict" (also enables 'strict'). + + + // The Good Parts. + "asi" : true, // Tolerate Automatic Semicolon Insertion (no semicolons). + "laxbreak" : false, // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons. + "laxcomma" : true, + "bitwise" : false, // Prohibit bitwise operators (&, |, ^, etc.). + "boss" : true, // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments. + "curly" : false, // Require {} for every new block or scope. + "eqeqeq" : true, // Require triple equals i.e. `===`. + "eqnull" : true, // Tolerate use of `== null`. + "evil" : false, // Tolerate use of `eval`. + "expr" : false, // Tolerate `ExpressionStatement` as Programs. + "forin" : false, // Prohibt `for in` loops without `hasOwnProperty`. + "immed" : true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );` + "latedef" : false, // Prohibit variable use before definition. + "loopfunc" : false, // Allow functions to be defined within loops. + "noarg" : true, // Prohibit use of `arguments.caller` and `arguments.callee`. + "regexp" : false, // Prohibit `.` and `[^...]` in regular expressions. + "regexdash" : false, // Tolerate unescaped last dash i.e. `[-...]`. + "scripturl" : false, // Tolerate script-targeted URLs. + "shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`. + "supernew" : false, // Tolerate `new function () { ... };` and `new Object;`. + "undef" : true, // Require all non-global variables be declared before they are used. + + + // Persone styling prefrences. + "newcap" : true, // Require capitalization of all constructor functions e.g. `new F()`. + "noempty" : true, // Prohibit use of empty blocks. + "nonew" : true, // Prohibit use of constructors for side-effects. + "nomen" : false, // Prohibit use of initial or trailing underbars in names. + "onevar" : false, // Allow only one `var` statement per function. + "plusplus" : false, // Prohibit use of `++` & `--`. + "sub" : false, // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`. + "trailing" : true, // Prohibit trailing whitespaces. + "white" : false // Check against strict whitespace and indentation rules. +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/.npmignore b/node_modules/express/node_modules/connect/node_modules/multiparty/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/.travis.yml b/node_modules/express/node_modules/connect/node_modules/multiparty/.travis.yml new file mode 100644 index 00000000..b1fc4b01 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.8" + - "0.10" +before_script: + - ulimit -n 500 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/CHANGELOG.md b/node_modules/express/node_modules/connect/node_modules/multiparty/CHANGELOG.md new file mode 100644 index 00000000..ea54d9a1 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/CHANGELOG.md @@ -0,0 +1,191 @@ +### 2.2.0 + + * additional callback API to support multiple files with same field name + * fix assertion crash when max field count is exceeded + * fix assertion crash when client aborts an invalid request + * (>=v0.10 only) unpipe the request when an error occurs to save resources. + * update readable-stream to ~1.1.9 + * fix assertion crash when EMFILE occurrs + * (no more assertions - only 'error' events) + +### 2.1.9 + + * relax content-type detection regex. (thanks amitaibu) + +### 2.1.8 + + * replace deprecated Buffer.write(). (thanks hueniverse) + +### 2.1.7 + + * add repository field to package.json + +### 2.1.6 + + * expose `hash` as an option to `Form`. (thanks wookiehangover) + +### 2.1.5 + + * fix possible 'close' event before all temp files are done + +### 2.1.4 + + * fix crash for invalid requests + +### 2.1.3 + + * add `file.size` + +### 2.1.2 + + * proper backpressure support + * update s3 example + +### 2.1.1 + + * fix uploads larger than 2KB + * fix both s3 and upload example + * add part.byteCount and part.byteOffset + +### 2.1.0 (recalled) + + * Complete rewrite. See README for changes and new API. + +### v1.0.13 + +* Only update hash if update method exists (Sven Lito) +* According to travis v0.10 needs to go quoted (Sven Lito) +* Bumping build node versions (Sven Lito) +* Additional fix for empty requests (Eugene Girshov) +* Change the default to 1000, to match the new Node behaviour. (OrangeDog) +* Add ability to control maxKeys in the querystring parser. (OrangeDog) +* Adjust test case to work with node 0.9.x (Eugene Girshov) +* Update package.json (Sven Lito) +* Path adjustment according to eb4468b (Markus Ast) + +### v1.0.12 + +* Emit error on aborted connections (Eugene Girshov) +* Add support for empty requests (Eugene Girshov) +* Fix name/filename handling in Content-Disposition (jesperp) +* Tolerate malformed closing boundary in multipart (Eugene Girshov) +* Ignore preamble in multipart messages (Eugene Girshov) +* Add support for application/json (Mike Frey, Carlos Rodriguez) +* Add support for Base64 encoding (Elmer Bulthuis) +* Add File#toJSON (TJ Holowaychuk) +* Remove support for Node.js 0.4 & 0.6 (Andrew Kelley) +* Documentation improvements (Sven Lito, Andre Azevedo) +* Add support for application/octet-stream (Ion Lupascu, Chris Scribner) +* Use os.tmpDir() to get tmp directory (Andrew Kelley) +* Improve package.json (Andrew Kelley, Sven Lito) +* Fix benchmark script (Andrew Kelley) +* Fix scope issue in incoming_forms (Sven Lito) +* Fix file handle leak on error (OrangeDog) + +### v1.0.11 + +* Calculate checksums for incoming files (sreuter) +* Add definition parameters to "IncomingForm" as an argument (Math-) + +### v1.0.10 + +* Make parts to be proper Streams (Matt Robenolt) + +### v1.0.9 + +* Emit progress when content length header parsed (Tim Koschützki) +* Fix Readme syntax due to GitHub changes (goob) +* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara) + +### v1.0.8 + +* Strip potentially unsafe characters when using `keepExtensions: true`. +* Switch to utest / urun for testing +* Add travis build + +### v1.0.7 + +* Remove file from package that was causing problems when installing on windows. (#102) +* Fix typos in Readme (Jason Davies). + +### v1.0.6 + +* Do not default to the default to the field name for file uploads where + filename="". + +### v1.0.5 + +* Support filename="" in multipart parts +* Explain unexpected end() errors in parser better + +**Note:** Starting with this version, formidable emits 'file' events for empty +file input fields. Previously those were incorrectly emitted as regular file +input fields with value = "". + +### v1.0.4 + +* Detect a good default tmp directory regardless of platform. (#88) + +### v1.0.3 + +* Fix problems with utf8 characters (#84) / semicolons in filenames (#58) +* Small performance improvements +* New test suite and fixture system + +### v1.0.2 + +* Exclude node\_modules folder from git +* Implement new `'aborted'` event +* Fix files in example folder to work with recent node versions +* Make gently a devDependency + +[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2) + +### v1.0.1 + +* Fix package.json to refer to proper main directory. (#68, Dean Landolt) + +[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1) + +### v1.0.0 + +* Add support for multipart boundaries that are quoted strings. (Jeff Craig) + +This marks the beginning of development on version 2.0 which will include +several architectural improvements. + +[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0) + +### v0.9.11 + +* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki) +* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class + +**Important:** The old property names of the File class will be removed in a +future release. + +[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11) + +### Older releases + +These releases were done before starting to maintain the above Changelog: + +* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10) +* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9) +* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8) +* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7) +* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6) +* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5) +* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4) +* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3) +* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2) +* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) +* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0) diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/LICENSE b/node_modules/express/node_modules/connect/node_modules/multiparty/LICENSE new file mode 100644 index 00000000..8488a405 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/LICENSE @@ -0,0 +1,7 @@ +Copyright (C) 2011-2013 Felix Geisendörfer, Andrew Kelley + +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/express/node_modules/connect/node_modules/multiparty/README.md b/node_modules/express/node_modules/connect/node_modules/multiparty/README.md new file mode 100644 index 00000000..f149ac04 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/README.md @@ -0,0 +1,177 @@ +[![Build Status](https://travis-ci.org/superjoe30/node-multiparty.png?branch=master)](https://travis-ci.org/superjoe30/node-multiparty) +# multiparty + +Parse http requests with content-type `multipart/form-data`, also known as file uploads. + +See also [busboy](https://github.com/mscdex/busboy) - a +[faster](https://github.com/mscdex/dicer/wiki/Benchmarks) alternative +which may be worth looking into. + +### Why the fork? + + * This module uses the Node.js v0.10 streams properly, *even in Node.js v0.8* + * It will not create a temp file for you unless you want it to. + * Counts bytes and does math to help you figure out the `Content-Length` of + each part. + * You can easily stream uploads to s3 with + [knox](https://github.com/LearnBoost/knox), for [example](examples/s3.js). + * Less bugs. This code is simpler, has all deprecated functionality removed, + has cleaner tests, and does not try to do anything beyond multipart stream + parsing. + +## Installation + +``` +npm install multiparty +``` + +## Usage + + * See [examples](examples). + +Parse an incoming `multipart/form-data` request. + +```js +var multiparty = require('multiparty') + , http = require('http') + , util = require('util') + +http.createServer(function(req, res) { + if (req.url === '/upload' && req.method === 'POST') { + // parse a file upload + var form = new multiparty.Form(); + + form.parse(req, function(err, fields, files) { + res.writeHead(200, {'content-type': 'text/plain'}); + res.write('received upload:\n\n'); + res.end(util.inspect({fields: fields, files: files})); + }); + + return; + } + + // show a file upload form + res.writeHead(200, {'content-type': 'text/html'}); + res.end( + '
    '+ + '
    '+ + '
    '+ + ''+ + '
    ' + ); +}).listen(8080); +``` + +## API + +### multiparty.Form +```js +var form = new multiparty.Form(options) +``` +Creates a new form. Options: + + * `encoding` - sets encoding for the incoming form fields. Defaults to `utf8`. + * `maxFieldSize` - Limits the amount of memory a field (not a file) can + allocate in bytes. If this value is exceeded, an `error` event is emitted. + The default size is 2MB. + * `maxFields` - Limits the number of fields that will be parsed before + emitting an `error` event. A file counts as a field in this case. + Defaults to 1000. + * `autoFields` - Enables `field` events. This is automatically set to `true` + if you add a `field` listener. + * `autoFiles` - Enables `file` events. This is automatically set to `true` + if you add a `file` listener. + * `uploadDir` - Only relevant when `autoFiles` is `true`. The directory for + placing file uploads in. You can move them later using `fs.rename()`. + Defaults to `os.tmpDir()`. + * `hash` - Only relevant when `autoFiles` is `true`. If you want checksums + calculated for incoming files, set this to either `sha1` or `md5`. + Defaults to off. + +#### form.parse(request, [cb]) + +Parses an incoming node.js `request` containing form data. If `cb` is +provided, `autoFields` and `autoFiles` are set to `true` and all fields and +files are collected and passed to the callback: + +```js +form.parse(req, function(err, fieldsObject, filesObject, fieldsList, filesList) { + // ... +}); +``` + +It is often convenient to access a field or file by name. In this situation, +use `fieldsObject` or `filesObject`. However sometimes, as in the case of a +`` the multipart stream will contain +multiple files of the same input name, and you are interested in all of them. +In this case, use `filesList`. + +Another example is when you do not care what the field name of a file is; you +are merely interested in a single upload. In this case, set `maxFields` to 1 +(assuming no other fields expected besides the file) and use `filesList[0]`. + +#### form.bytesReceived + +The amount of bytes received for this form so far. + +#### form.bytesExpected + +The expected number of bytes in this form. + +### Events + +#### 'error' (err) + +You definitely want to handle this event. If not your server *will* crash when +users submit bogus multipart requests! + +#### 'part' (part) + +Emitted when a part is encountered in the request. `part` is a +`ReadableStream`. It also has the following properties: + + * `headers` - the headers for this part. For example, you may be interested + in `content-type`. + * `name` - the field name for this part + * `filename` - only if the part is an incoming file + * `byteOffset` - the byte offset of this part in the request body + * `byteCount` - assuming that this is the last part in the request, + this is the size of this part in bytes. You could use this, for + example, to set the `Content-Length` header if uploading to S3. + If the part had a `Content-Length` header then that value is used + here instead. + +#### 'aborted' + +Emitted when the request is aborted. This event will be followed shortly +by an `error` event. In practice you do not need to handle this event. + +#### 'progress' (bytesReceived, bytesExpected) + +#### 'close' + +Emitted after all parts have been parsed and emitted. Not emitted if an `error` +event is emitted. This is typically when you would send your response. + +#### 'file' (name, file) + +**By default multiparty will not touch your hard drive.** But if you add this +listener, multiparty automatically sets `form.autoFiles` to `true` and will +stream uploads to disk for you. + + * `name` - the field name for this file + * `file` - an object with these properties: + - `fieldName` - same as `name` - the field name for this file + - `originalFilename` - the filename that the user reports for the file + - `path` - the absolute path of the uploaded file on disk + - `headers` - the HTTP headers that were sent along with this file + - `size` - size of the file in bytes + +If you set the `form.hash` option, then `file` will also contain a `hash` +property which is the checksum of the file. + +#### 'field' (name, value) + + * `name` - field name + * `value` - string field value + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/examples/azureblobstorage.js b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/azureblobstorage.js new file mode 100644 index 00000000..273c3321 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/azureblobstorage.js @@ -0,0 +1,41 @@ +var http = require('http') + , util = require('util') + , multiparty = require('../') + , azure = require('azure') + , PORT = process.env.PORT || 27372 + +var server = http.createServer(function(req, res) { + if (req.url === '/') { + res.writeHead(200, {'content-type': 'text/html'}); + res.end( + '
    '+ + '
    '+ + '
    '+ + ''+ + '
    ' + ); + } else if (req.url === '/upload') { + + var blobService = azure.createBlobService(); + var form = new multiparty.Form(); + form.on('part', function(part) { + if (!part.filename) return; + + var size = part.byteCount - part.byteOffset; + var name = part.filename; + var container = 'blobContainerName'; + + blobService.createBlockBlobFromStream(container, name, part, size, function(error) { + if (error) { + // error handling + } + }); + }); + form.parse(req); + + res.send('File uploaded successfully'); + } +}); +server.listen(PORT, function() { + console.info('listening on http://0.0.0.0:'+PORT+'/'); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/examples/s3.js b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/s3.js new file mode 100644 index 00000000..60617ba2 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/s3.js @@ -0,0 +1,74 @@ +var http = require('http') + , util = require('util') + , multiparty = require('../') + , knox = require('knox') + , Batch = require('batch') + , PORT = process.env.PORT || 27372 + +var s3Client = knox.createClient({ + secure: false, + key: process.env.S3_KEY, + secret: process.env.S3_SECRET, + bucket: process.env.S3_BUCKET, +}); + +var server = http.createServer(function(req, res) { + if (req.url === '/') { + res.writeHead(200, {'content-type': 'text/html'}); + res.end( + '
    '+ + '
    '+ + '
    '+ + ''+ + '
    ' + ); + } else if (req.url === '/upload') { + var headers = { + 'x-amz-acl': 'public-read', + }; + var form = new multiparty.Form(); + var batch = new Batch(); + batch.push(function(cb) { + form.on('field', function(name, value) { + if (name === 'path') { + var destPath = value; + if (destPath[0] !== '/') destPath = '/' + destPath; + cb(null, destPath); + } + }); + }); + batch.push(function(cb) { + form.on('part', function(part) { + if (! part.filename) return; + cb(null, part); + }); + }); + batch.end(function(err, results) { + if (err) throw err; + form.removeListener('close', onEnd); + var destPath = results[0] + , part = results[1]; + + headers['Content-Length'] = part.byteCount; + s3Client.putStream(part, destPath, headers, function(err, s3Response) { + if (err) throw err; + res.statusCode = s3Response.statusCode; + s3Response.pipe(res); + console.log("https://s3.amazonaws.com/" + process.env.S3_BUCKET + destPath); + }); + }); + form.on('close', onEnd); + form.parse(req); + + } else { + res.writeHead(404, {'content-type': 'text/plain'}); + res.end('404'); + } + + function onEnd() { + throw new Error("no uploaded file"); + } +}); +server.listen(PORT, function() { + console.info('listening on http://0.0.0.0:'+PORT+'/'); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/examples/upload.js b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/upload.js new file mode 100644 index 00000000..5dd39268 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/examples/upload.js @@ -0,0 +1,37 @@ +var http = require('http') + , util = require('util') + , multiparty = require('../') + , PORT = process.env.PORT || 27372 + +var server = http.createServer(function(req, res) { + if (req.url === '/') { + res.writeHead(200, {'content-type': 'text/html'}); + res.end( + '
    '+ + '
    '+ + '
    '+ + ''+ + '
    ' + ); + } else if (req.url === '/upload') { + var form = new multiparty.Form(); + + form.parse(req, function(err, fields, files) { + if (err) { + res.writeHead(400, {'content-type': 'text/plain'}); + res.end("invalid request: " + err.message); + return; + } + res.writeHead(200, {'content-type': 'text/plain'}); + res.write('received fields:\n\n '+util.inspect(fields)); + res.write('\n\n'); + res.end('received files:\n\n '+util.inspect(files)); + }); + } else { + res.writeHead(404, {'content-type': 'text/plain'}); + res.end('404'); + } +}); +server.listen(PORT, function() { + console.info('listening on http://0.0.0.0:'+PORT+'/'); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/index.js b/node_modules/express/node_modules/connect/node_modules/multiparty/index.js new file mode 100755 index 00000000..71c88ae3 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/index.js @@ -0,0 +1,618 @@ +exports.Form = Form; + +var stream = require('readable-stream') + , util = require('util') + , fs = require('fs') + , crypto = require('crypto') + , path = require('path') + , os = require('os') + , StringDecoder = require('string_decoder').StringDecoder + , StreamCounter = require('stream-counter') + +var START = 0 + , START_BOUNDARY = 1 + , HEADER_FIELD_START = 2 + , HEADER_FIELD = 3 + , HEADER_VALUE_START = 4 + , HEADER_VALUE = 5 + , HEADER_VALUE_ALMOST_DONE = 6 + , HEADERS_ALMOST_DONE = 7 + , PART_DATA_START = 8 + , PART_DATA = 9 + , PART_END = 10 + , END = 11 + + , LF = 10 + , CR = 13 + , SPACE = 32 + , HYPHEN = 45 + , COLON = 58 + , A = 97 + , Z = 122 + +var CONTENT_TYPE_RE = /^multipart\/(form-data|related);\s*boundary=(?:"([^"]+)"|([^;]+))$/i; +var FILE_EXT_RE = /(\.[_\-a-zA-Z0-9]{0,16}).*/; +var LAST_BOUNDARY_SUFFIX_LEN = 4; // --\r\n + +util.inherits(Form, stream.Writable); +function Form(options) { + var self = this; + stream.Writable.call(self); + + options = options || {}; + + self.error = null; + self.finished = false; + + self.autoFields = !!options.autoFields; + self.autoFiles = !!options.autoFields; + + self.maxFields = options.maxFields || 1000; + self.maxFieldsSize = options.maxFieldsSize || 2 * 1024 * 1024; + self.uploadDir = options.uploadDir || os.tmpDir(); + self.encoding = options.encoding || 'utf8'; + self.hash = options.hash || false; + + self.bytesReceived = 0; + self.bytesExpected = null; + + self.openedFiles = []; + self.totalFieldSize = 0; + self.totalFieldCount = 0; + self.flushing = 0; + + self.backpressure = false; + self.writeCbs = []; + + if (options.boundary) setUpParser(self, options.boundary); + + self.on('newListener', function(eventName) { + if (eventName === 'file') { + self.autoFiles = true; + } else if (eventName === 'field') { + self.autoFields = true; + } + }); +} + +Form.prototype.parse = function(req, cb) { + var self = this; + + // if the user supplies a callback, this implies autoFields and autoFiles + if (cb) { + self.autoFields = true; + self.autoFiles = true; + } + + self.handleError = handleError; + self.bytesExpected = getBytesExpected(req.headers); + + req.on('error', handleError); + req.on('aborted', onReqAborted); + + var contentType = req.headers['content-type']; + if (!contentType) { + handleError(new Error('missing content-type header')); + return; + } + + var m = contentType.match(CONTENT_TYPE_RE); + if (!m) { + handleError(new Error('unrecognized content-type: ' + contentType)); + return; + } + var boundary = m[2] || m[3]; + setUpParser(self, boundary); + req.pipe(self); + + if (cb) { + var fieldsTable = {}; + var filesTable = {}; + var fieldsList = []; + var filesList = []; + self.on('error', function(err) { + cb(err); + }); + self.on('field', function(name, value) { + fieldsTable[name] = value; + fieldsList.push({name: name, value: value}); + }); + self.on('file', function(name, file) { + filesTable[name] = file; + filesList.push(file); + }); + self.on('close', function() { + cb(null, fieldsTable, filesTable, fieldsList, filesList); + }); + } + + function onReqAborted() { + self.emit('aborted'); + handleError(new Error("Request aborted")); + } + + function handleError(err) { + var first = !self.error; + if (first) { + self.error = err; + req.removeListener('aborted', onReqAborted); + + // welp. 0.8 doesn't support unpipe, too bad so sad. + // let's drop support for 0.8 soon. + if (req.unpipe) { + req.unpipe(self); + } + } + + self.openedFiles.forEach(function(file) { + file.ws.destroy(); + fs.unlink(file.path, function(err) { + // this is already an error condition, ignore 2nd error + }); + }); + self.openedFiles = []; + + if (first) { + self.emit('error', err); + } + } + +}; + +Form.prototype._write = function(buffer, encoding, cb) { + var self = this + , i = 0 + , len = buffer.length + , prevIndex = self.index + , index = self.index + , state = self.state + , lookbehind = self.lookbehind + , boundary = self.boundary + , boundaryChars = self.boundaryChars + , boundaryLength = self.boundary.length + , boundaryEnd = boundaryLength - 1 + , bufferLength = buffer.length + , c + , cl + + for (i = 0; i < len; i++) { + c = buffer[i]; + switch (state) { + case START: + index = 0; + state = START_BOUNDARY; + /* falls through */ + case START_BOUNDARY: + if (index === boundaryLength - 2) { + if (c !== CR) return self.handleError(new Error("Expected CR Received " + c)); + index++; + break; + } else if (index === boundaryLength - 1) { + if (c !== LF) return self.handleError(new Error("Expected LF Received " + c)); + index = 0; + self.onParsePartBegin(); + state = HEADER_FIELD_START; + break; + } + + if (c !== boundary[index+2]) index = -2; + if (c === boundary[index+2]) index++; + break; + case HEADER_FIELD_START: + state = HEADER_FIELD; + self.headerFieldMark = i; + index = 0; + /* falls through */ + case HEADER_FIELD: + if (c === CR) { + self.headerFieldMark = null; + state = HEADERS_ALMOST_DONE; + break; + } + + index++; + if (c === HYPHEN) break; + + if (c === COLON) { + if (index === 1) { + // empty header field + self.handleError(new Error("Empty header field")); + return; + } + self.onParseHeaderField(buffer.slice(self.headerFieldMark, i)); + self.headerFieldMark = null; + state = HEADER_VALUE_START; + break; + } + + cl = lower(c); + if (cl < A || cl > Z) { + self.handleError(new Error("Expected alphabetic character, received " + c)); + return; + } + break; + case HEADER_VALUE_START: + if (c === SPACE) break; + + self.headerValueMark = i; + state = HEADER_VALUE; + /* falls through */ + case HEADER_VALUE: + if (c === CR) { + self.onParseHeaderValue(buffer.slice(self.headerValueMark, i)); + self.headerValueMark = null; + self.onParseHeaderEnd(); + state = HEADER_VALUE_ALMOST_DONE; + } + break; + case HEADER_VALUE_ALMOST_DONE: + if (c !== LF) return self.handleError(new Error("Expected LF Received " + c)); + state = HEADER_FIELD_START; + break; + case HEADERS_ALMOST_DONE: + if (c !== LF) return self.handleError(new Error("Expected LF Received " + c)); + var err = self.onParseHeadersEnd(i + 1); + if (err) return self.handleError(err); + state = PART_DATA_START; + break; + case PART_DATA_START: + state = PART_DATA; + self.partDataMark = i; + /* falls through */ + case PART_DATA: + prevIndex = index; + + if (index === 0) { + // boyer-moore derrived algorithm to safely skip non-boundary data + i += boundaryEnd; + while (i < bufferLength && !(buffer[i] in boundaryChars)) { + i += boundaryLength; + } + i -= boundaryEnd; + c = buffer[i]; + } + + if (index < boundaryLength) { + if (boundary[index] === c) { + if (index === 0) { + self.onParsePartData(buffer.slice(self.partDataMark, i)); + self.partDataMark = null; + } + index++; + } else { + index = 0; + } + } else if (index === boundaryLength) { + index++; + if (c === CR) { + // CR = part boundary + self.partBoundaryFlag = true; + } else if (c === HYPHEN) { + // HYPHEN = end boundary + self.lastBoundaryFlag = true; + } else { + index = 0; + } + } else if (index - 1 === boundaryLength) { + if (self.partBoundaryFlag) { + index = 0; + if (c === LF) { + self.partBoundaryFlag = false; + self.onParsePartEnd(); + self.onParsePartBegin(); + state = HEADER_FIELD_START; + break; + } + } else if (self.lastBoundaryFlag) { + if (c === HYPHEN) { + self.onParsePartEnd(); + self.end(); + state = END; + } else { + index = 0; + } + } else { + index = 0; + } + } + + if (index > 0) { + // when matching a possible boundary, keep a lookbehind reference + // in case it turns out to be a false lead + lookbehind[index-1] = c; + } else if (prevIndex > 0) { + // if our boundary turned out to be rubbish, the captured lookbehind + // belongs to partData + self.onParsePartData(lookbehind.slice(0, prevIndex)); + prevIndex = 0; + self.partDataMark = i; + + // reconsider the current character even so it interrupted the sequence + // it could be the beginning of a new sequence + i--; + } + + break; + case END: + break; + default: + self.handleError(new Error("Parser has invalid state.")); + return; + } + } + + if (self.headerFieldMark != null) { + self.onParseHeaderField(buffer.slice(self.headerFieldMark)); + self.headerFieldMark = 0; + } + if (self.headerValueMark != null) { + self.onParseHeaderValue(buffer.slice(self.headerValueMark)); + self.headerValueMark = 0; + } + if (self.partDataMark != null) { + self.onParsePartData(buffer.slice(self.partDataMark)); + self.partDataMark = 0; + } + + self.index = index; + self.state = state; + + self.bytesReceived += buffer.length; + self.emit('progress', self.bytesReceived, self.bytesExpected); + + if (self.backpressure) { + self.writeCbs.push(cb); + } else { + cb(); + } +}; + +Form.prototype.onParsePartBegin = function() { + clearPartVars(this); +} + +Form.prototype.onParseHeaderField = function(b) { + this.headerField += this.headerFieldDecoder.write(b); +} + +Form.prototype.onParseHeaderValue = function(b) { + this.headerValue += this.headerValueDecoder.write(b); +} + +Form.prototype.onParseHeaderEnd = function() { + this.headerField = this.headerField.toLowerCase(); + this.partHeaders[this.headerField] = this.headerValue; + + var m; + if (this.headerField === 'content-disposition') { + if (m = this.headerValue.match(/\bname="([^"]+)"/i)) { + this.partName = m[1]; + } + this.partFilename = parseFilename(this.headerValue); + } else if (this.headerField === 'content-transfer-encoding') { + this.partTransferEncoding = this.headerValue.toLowerCase(); + } + + this.headerFieldDecoder = new StringDecoder(this.encoding); + this.headerField = ''; + this.headerValueDecoder = new StringDecoder(this.encoding); + this.headerValue = ''; +} + +Form.prototype.onParsePartData = function(b) { + if (this.partTransferEncoding === 'base64') { + this.backpressure = ! this.destStream.write(b.toString('ascii'), 'base64'); + } else { + this.backpressure = ! this.destStream.write(b); + } +} + +Form.prototype.onParsePartEnd = function() { + if (this.destStream) { + flushWriteCbs(this); + var s = this.destStream; + process.nextTick(function() { + s.end(); + }); + } + clearPartVars(this); +} + +Form.prototype.onParseHeadersEnd = function(offset) { + var self = this; + switch(self.partTransferEncoding){ + case 'binary': + case '7bit': + case '8bit': + self.partTransferEncoding = 'binary'; + break; + + case 'base64': break; + default: + return new Error("unknown transfer-encoding: " + self.partTransferEncoding); + } + + self.totalFieldCount += 1; + if (self.totalFieldCount >= self.maxFields) { + return new Error("maxFields " + self.maxFields + " exceeded."); + } + + self.destStream = new stream.PassThrough(); + self.destStream.on('drain', function() { + flushWriteCbs(self); + }); + self.destStream.headers = self.partHeaders; + self.destStream.name = self.partName; + self.destStream.filename = self.partFilename; + self.destStream.byteOffset = self.bytesReceived + offset; + var partContentLength = self.destStream.headers['content-length']; + self.destStream.byteCount = partContentLength ? + parseInt(partContentLength, 10) : + (self.bytesExpected - self.destStream.byteOffset - + self.boundary.length - LAST_BOUNDARY_SUFFIX_LEN); + + self.emit('part', self.destStream); + if (self.destStream.filename == null && self.autoFields) { + handleField(self, self.destStream); + } else if (self.destStream.filename != null && self.autoFiles) { + handleFile(self, self.destStream); + } +} + +function flushWriteCbs(self) { + self.writeCbs.forEach(function(cb) { + process.nextTick(cb); + }); + self.writeCbs = []; + self.backpressure = false; +} + +function getBytesExpected(headers) { + var contentLength = headers['content-length']; + if (contentLength) { + return parseInt(contentLength, 10); + } else if (headers['transfer-encoding'] == null) { + return 0; + } else { + return null; + } +} + +function beginFlush(self) { + self.flushing += 1; +} + +function endFlush(self) { + self.flushing -= 1; + maybeClose(self); +} + +function maybeClose(self) { + if (!self.flushing && self.finished && !self.error) { + self.emit('close'); + } +} + +function handleFile(self, fileStream) { + beginFlush(self); + var file = { + fieldName: fileStream.name, + originalFilename: fileStream.filename, + path: uploadPath(self.uploadDir, fileStream.filename), + headers: fileStream.headers, + }; + file.ws = fs.createWriteStream(file.path); + self.openedFiles.push(file); + fileStream.pipe(file.ws); + var counter = new StreamCounter(); + fileStream.pipe(counter); + var hashWorkaroundStream + , hash = null; + if (self.hash) { + // workaround stream because https://github.com/joyent/node/issues/5216 + hashWorkaroundStream = stream.Writable(); + hash = crypto.createHash(self.hash); + hashWorkaroundStream._write = function(buffer, encoding, callback) { + hash.update(buffer); + callback(); + }; + fileStream.pipe(hashWorkaroundStream); + } + file.ws.on('error', function(err) { + if (!self.error) self.handleError(err); + }); + file.ws.on('close', function() { + if (hash) file.hash = hash.digest('hex'); + file.size = counter.bytes; + self.emit('file', fileStream.name, file); + endFlush(self); + }); +} + +function handleField(self, fieldStream) { + var value = ''; + var decoder = new StringDecoder(self.encoding); + + beginFlush(self); + fieldStream.on('readable', function() { + var buffer = fieldStream.read(); + if (!buffer) return; + + self.totalFieldSize += buffer.length; + if (self.totalFieldSize > self.maxFieldsSize) { + self.handleError(new Error("maxFieldsSize " + self.maxFieldsSize + " exceeded")); + return; + } + value += decoder.write(buffer); + }); + + fieldStream.on('end', function() { + self.emit('field', fieldStream.name, value); + endFlush(self); + }); +} + +function clearPartVars(self) { + self.partHeaders = {}; + self.partName = null; + self.partFilename = null; + self.partTransferEncoding = 'binary'; + self.destStream = null; + + self.headerFieldDecoder = new StringDecoder(self.encoding); + self.headerField = ""; + self.headerValueDecoder = new StringDecoder(self.encoding); + self.headerValue = ""; +} + +function setUpParser(self, boundary) { + self.boundary = new Buffer(boundary.length + 4); + self.boundary.write('\r\n--', 0, boundary.length + 4, 'ascii'); + self.boundary.write(boundary, 4, boundary.length, 'ascii'); + self.lookbehind = new Buffer(self.boundary.length + 8); + self.state = START; + self.boundaryChars = {}; + for (var i = 0; i < self.boundary.length; i++) { + self.boundaryChars[self.boundary[i]] = true; + } + + self.index = null; + self.partBoundaryFlag = false; + self.lastBoundaryFlag = false; + + self.on('finish', function() { + if ((self.state === HEADER_FIELD_START && self.index === 0) || + (self.state === PART_DATA && self.index === self.boundary.length)) + { + self.onParsePartEnd(); + } else if (self.state !== END) { + self.handleError(new Error('stream ended unexpectedly')); + } + self.finished = true; + maybeClose(self); + }); +} + +function uploadPath(baseDir, filename) { + var ext = path.extname(filename).replace(FILE_EXT_RE, '$1'); + var name = process.pid + '-' + + (Math.random() * 0x100000000 + 1).toString(36) + ext; + return path.join(baseDir, name); +} + +function parseFilename(headerValue) { + var m = headerValue.match(/\bfilename="(.*?)"($|; )/i); + if (!m) return; + + var filename = m[1].substr(m[1].lastIndexOf('\\') + 1); + filename = filename.replace(/%22/g, '"'); + filename = filename.replace(/&#([\d]{4});/g, function(m, code) { + return String.fromCharCode(code); + }); + return filename; +} + +function lower(c) { + return c | 0x20; +} + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/.npmignore b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/.npmignore new file mode 100644 index 00000000..38344f87 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/.npmignore @@ -0,0 +1,5 @@ +build/ +test/ +examples/ +fs.js +zlib.js \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/LICENSE b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/LICENSE new file mode 100644 index 00000000..e3d4e695 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +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/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/README.md b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/README.md new file mode 100644 index 00000000..be976683 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/README.md @@ -0,0 +1,768 @@ +# readable-stream + +A new class of streams for Node.js + +This module provides the new Stream base classes introduced in Node +v0.10, for use in Node v0.8. You can use it to have programs that +have to work with node v0.8, while being forward-compatible for v0.10 +and beyond. When you drop support for v0.8, you can remove this +module, and only use the native streams. + +This is almost exactly the same codebase as appears in Node v0.10. +However: + +1. The exported object is actually the Readable class. Decorating the + native `stream` module would be global pollution. +2. In v0.10, you can safely use `base64` as an argument to + `setEncoding` in Readable streams. However, in v0.8, the + StringDecoder class has no `end()` method, which is problematic for + Base64. So, don't use that, because it'll break and be weird. + +Other than that, the API is the same as `require('stream')` in v0.10, +so the API docs are reproduced below. + +---------- + + Stability: 2 - Unstable + +A stream is an abstract interface implemented by various objects in +Node. For example a request to an HTTP server is a stream, as is +stdout. Streams are readable, writable, or both. All streams are +instances of [EventEmitter][] + +You can load the Stream base classes by doing `require('stream')`. +There are base classes provided for Readable streams, Writable +streams, Duplex streams, and Transform streams. + +## Compatibility + +In earlier versions of Node, the Readable stream interface was +simpler, but also less powerful and less useful. + +* Rather than waiting for you to call the `read()` method, `'data'` + events would start emitting immediately. If you needed to do some + I/O to decide how to handle data, then you had to store the chunks + in some kind of buffer so that they would not be lost. +* The `pause()` method was advisory, rather than guaranteed. This + meant that you still had to be prepared to receive `'data'` events + even when the stream was in a paused state. + +In Node v0.10, the Readable class described below was added. For +backwards compatibility with older Node programs, Readable streams +switch into "old mode" when a `'data'` event handler is added, or when +the `pause()` or `resume()` methods are called. The effect is that, +even if you are not using the new `read()` method and `'readable'` +event, you no longer have to worry about losing `'data'` chunks. + +Most programs will continue to function normally. However, this +introduces an edge case in the following conditions: + +* No `'data'` event handler is added. +* The `pause()` and `resume()` methods are never called. + +For example, consider the following code: + +```javascript +// WARNING! BROKEN! +net.createServer(function(socket) { + + // we add an 'end' method, but never consume the data + socket.on('end', function() { + // It will never get here. + socket.end('I got your message (but didnt read it)\n'); + }); + +}).listen(1337); +``` + +In versions of node prior to v0.10, the incoming message data would be +simply discarded. However, in Node v0.10 and beyond, the socket will +remain paused forever. + +The workaround in this situation is to call the `resume()` method to +trigger "old mode" behavior: + +```javascript +// Workaround +net.createServer(function(socket) { + + socket.on('end', function() { + socket.end('I got your message (but didnt read it)\n'); + }); + + // start the flow of data, discarding it. + socket.resume(); + +}).listen(1337); +``` + +In addition to new Readable streams switching into old-mode, pre-v0.10 +style streams can be wrapped in a Readable class using the `wrap()` +method. + +## Class: stream.Readable + + + +A `Readable Stream` has the following methods, members, and events. + +Note that `stream.Readable` is an abstract class designed to be +extended with an underlying implementation of the `_read(size)` +method. (See below.) + +### new stream.Readable([options]) + +* `options` {Object} + * `highWaterMark` {Number} The maximum number of bytes to store in + the internal buffer before ceasing to read from the underlying + resource. Default=16kb + * `encoding` {String} If specified, then buffers will be decoded to + strings using the specified encoding. Default=null + * `objectMode` {Boolean} Whether this stream should behave + as a stream of objects. Meaning that stream.read(n) returns + a single value instead of a Buffer of size n + +In classes that extend the Readable class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +### readable.\_read(size) + +* `size` {Number} Number of bytes to read asynchronously + +Note: **This function should NOT be called directly.** It should be +implemented by child classes, and called by the internal Readable +class methods only. + +All Readable stream implementations must provide a `_read` method +to fetch data from the underlying resource. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +When data is available, put it into the read queue by calling +`readable.push(chunk)`. If `push` returns false, then you should stop +reading. When `_read` is called again, you should start pushing more +data. + +The `size` argument is advisory. Implementations where a "read" is a +single call that returns data can use this to know how much data to +fetch. Implementations where that is not relevant, such as TCP or +TLS, may ignore this argument, and simply provide data whenever it +becomes available. There is no need, for example to "wait" until +`size` bytes are available before calling `stream.push(chunk)`. + +### readable.push(chunk) + +* `chunk` {Buffer | null | String} Chunk of data to push into the read queue +* return {Boolean} Whether or not more pushes should be performed + +Note: **This function should be called by Readable implementors, NOT +by consumers of Readable subclasses.** The `_read()` function will not +be called again until at least one `push(chunk)` call is made. If no +data is available, then you MAY call `push('')` (an empty string) to +allow a future `_read` call, without adding any data to the queue. + +The `Readable` class works by putting data into a read queue to be +pulled out later by calling the `read()` method when the `'readable'` +event fires. + +The `push()` method will explicitly insert some data into the read +queue. If it is called with `null` then it will signal the end of the +data. + +In some cases, you may be wrapping a lower-level source which has some +sort of pause/resume mechanism, and a data callback. In those cases, +you could wrap the low-level source object by doing something like +this: + +```javascript +// source is an object with readStop() and readStart() methods, +// and an `ondata` member that gets called when it has data, and +// an `onend` member that gets called when the data is over. + +var stream = new Readable(); + +source.ondata = function(chunk) { + // if push() returns false, then we need to stop reading from source + if (!stream.push(chunk)) + source.readStop(); +}; + +source.onend = function() { + stream.push(null); +}; + +// _read will be called when the stream wants to pull more data in +// the advisory size argument is ignored in this case. +stream._read = function(n) { + source.readStart(); +}; +``` + +### readable.unshift(chunk) + +* `chunk` {Buffer | null | String} Chunk of data to unshift onto the read queue +* return {Boolean} Whether or not more pushes should be performed + +This is the corollary of `readable.push(chunk)`. Rather than putting +the data at the *end* of the read queue, it puts it at the *front* of +the read queue. + +This is useful in certain use-cases where a stream is being consumed +by a parser, which needs to "un-consume" some data that it has +optimistically pulled out of the source. + +```javascript +// A parser for a simple data protocol. +// The "header" is a JSON object, followed by 2 \n characters, and +// then a message body. +// +// Note: This can be done more simply as a Transform stream. See below. + +function SimpleProtocol(source, options) { + if (!(this instanceof SimpleProtocol)) + return new SimpleProtocol(options); + + Readable.call(this, options); + this._inBody = false; + this._sawFirstCr = false; + + // source is a readable stream, such as a socket or file + this._source = source; + + var self = this; + source.on('end', function() { + self.push(null); + }); + + // give it a kick whenever the source is readable + // read(0) will not consume any bytes + source.on('readable', function() { + self.read(0); + }); + + this._rawHeader = []; + this.header = null; +} + +SimpleProtocol.prototype = Object.create( + Readable.prototype, { constructor: { value: SimpleProtocol }}); + +SimpleProtocol.prototype._read = function(n) { + if (!this._inBody) { + var chunk = this._source.read(); + + // if the source doesn't have data, we don't have data yet. + if (chunk === null) + return this.push(''); + + // check if the chunk has a \n\n + var split = -1; + for (var i = 0; i < chunk.length; i++) { + if (chunk[i] === 10) { // '\n' + if (this._sawFirstCr) { + split = i; + break; + } else { + this._sawFirstCr = true; + } + } else { + this._sawFirstCr = false; + } + } + + if (split === -1) { + // still waiting for the \n\n + // stash the chunk, and try again. + this._rawHeader.push(chunk); + this.push(''); + } else { + this._inBody = true; + var h = chunk.slice(0, split); + this._rawHeader.push(h); + var header = Buffer.concat(this._rawHeader).toString(); + try { + this.header = JSON.parse(header); + } catch (er) { + this.emit('error', new Error('invalid simple protocol data')); + return; + } + // now, because we got some extra data, unshift the rest + // back into the read queue so that our consumer will see it. + var b = chunk.slice(split); + this.unshift(b); + + // and let them know that we are done parsing the header. + this.emit('header', this.header); + } + } else { + // from there on, just provide the data to our consumer. + // careful not to push(null), since that would indicate EOF. + var chunk = this._source.read(); + if (chunk) this.push(chunk); + } +}; + +// Usage: +var parser = new SimpleProtocol(source); +// Now parser is a readable stream that will emit 'header' +// with the parsed header data. +``` + +### readable.wrap(stream) + +* `stream` {Stream} An "old style" readable stream + +If you are using an older Node library that emits `'data'` events and +has a `pause()` method that is advisory only, then you can use the +`wrap()` method to create a Readable stream that uses the old stream +as its data source. + +For example: + +```javascript +var OldReader = require('./old-api-module.js').OldReader; +var oreader = new OldReader; +var Readable = require('stream').Readable; +var myReader = new Readable().wrap(oreader); + +myReader.on('readable', function() { + myReader.read(); // etc. +}); +``` + +### Event: 'readable' + +When there is data ready to be consumed, this event will fire. + +When this event emits, call the `read()` method to consume the data. + +### Event: 'end' + +Emitted when the stream has received an EOF (FIN in TCP terminology). +Indicates that no more `'data'` events will happen. If the stream is +also writable, it may be possible to continue writing. + +### Event: 'data' + +The `'data'` event emits either a `Buffer` (by default) or a string if +`setEncoding()` was used. + +Note that adding a `'data'` event listener will switch the Readable +stream into "old mode", where data is emitted as soon as it is +available, rather than waiting for you to call `read()` to consume it. + +### Event: 'error' + +Emitted if there was an error receiving data. + +### Event: 'close' + +Emitted when the underlying resource (for example, the backing file +descriptor) has been closed. Not all streams will emit this. + +### readable.setEncoding(encoding) + +Makes the `'data'` event emit a string instead of a `Buffer`. `encoding` +can be `'utf8'`, `'utf16le'` (`'ucs2'`), `'ascii'`, or `'hex'`. + +The encoding can also be set by specifying an `encoding` field to the +constructor. + +### readable.read([size]) + +* `size` {Number | null} Optional number of bytes to read. +* Return: {Buffer | String | null} + +Note: **This function SHOULD be called by Readable stream users.** + +Call this method to consume data once the `'readable'` event is +emitted. + +The `size` argument will set a minimum number of bytes that you are +interested in. If not set, then the entire content of the internal +buffer is returned. + +If there is no data to consume, or if there are fewer bytes in the +internal buffer than the `size` argument, then `null` is returned, and +a future `'readable'` event will be emitted when more is available. + +Calling `stream.read(0)` will always return `null`, and will trigger a +refresh of the internal buffer, but otherwise be a no-op. + +### readable.pipe(destination, [options]) + +* `destination` {Writable Stream} +* `options` {Object} Optional + * `end` {Boolean} Default=true + +Connects this readable stream to `destination` WriteStream. Incoming +data on this stream gets written to `destination`. Properly manages +back-pressure so that a slow destination will not be overwhelmed by a +fast readable stream. + +This function returns the `destination` stream. + +For example, emulating the Unix `cat` command: + + process.stdin.pipe(process.stdout); + +By default `end()` is called on the destination when the source stream +emits `end`, so that `destination` is no longer writable. Pass `{ end: +false }` as `options` to keep the destination stream open. + +This keeps `writer` open so that "Goodbye" can be written at the +end. + + reader.pipe(writer, { end: false }); + reader.on("end", function() { + writer.end("Goodbye\n"); + }); + +Note that `process.stderr` and `process.stdout` are never closed until +the process exits, regardless of the specified options. + +### readable.unpipe([destination]) + +* `destination` {Writable Stream} Optional + +Undo a previously established `pipe()`. If no destination is +provided, then all previously established pipes are removed. + +### readable.pause() + +Switches the readable stream into "old mode", where data is emitted +using a `'data'` event rather than being buffered for consumption via +the `read()` method. + +Ceases the flow of data. No `'data'` events are emitted while the +stream is in a paused state. + +### readable.resume() + +Switches the readable stream into "old mode", where data is emitted +using a `'data'` event rather than being buffered for consumption via +the `read()` method. + +Resumes the incoming `'data'` events after a `pause()`. + + +## Class: stream.Writable + + + +A `Writable` Stream has the following methods, members, and events. + +Note that `stream.Writable` is an abstract class designed to be +extended with an underlying implementation of the +`_write(chunk, encoding, cb)` method. (See below.) + +### new stream.Writable([options]) + +* `options` {Object} + * `highWaterMark` {Number} Buffer level when `write()` starts + returning false. Default=16kb + * `decodeStrings` {Boolean} Whether or not to decode strings into + Buffers before passing them to `_write()`. Default=true + +In classes that extend the Writable class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +### writable.\_write(chunk, encoding, callback) + +* `chunk` {Buffer | String} The chunk to be written. Will always + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. Ignore chunk is a buffer. Note that chunk will + **always** be a buffer unless the `decodeStrings` option is + explicitly set to `false`. +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunk. + +All Writable stream implementations must provide a `_write` method to +send data to the underlying resource. + +Note: **This function MUST NOT be called directly.** It should be +implemented by child classes, and called by the internal Writable +class methods only. + +Call the callback using the standard `callback(error)` pattern to +signal that the write completed successfully or with an error. + +If the `decodeStrings` flag is set in the constructor options, then +`chunk` may be a string rather than a Buffer, and `encoding` will +indicate the sort of string that it is. This is to support +implementations that have an optimized handling for certain string +data encodings. If you do not explicitly set the `decodeStrings` +option to `false`, then you can safely ignore the `encoding` argument, +and assume that `chunk` will always be a Buffer. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + + +### writable.write(chunk, [encoding], [callback]) + +* `chunk` {Buffer | String} Data to be written +* `encoding` {String} Optional. If `chunk` is a string, then encoding + defaults to `'utf8'` +* `callback` {Function} Optional. Called when this chunk is + successfully written. +* Returns {Boolean} + +Writes `chunk` to the stream. Returns `true` if the data has been +flushed to the underlying resource. Returns `false` to indicate that +the buffer is full, and the data will be sent out in the future. The +`'drain'` event will indicate when the buffer is empty again. + +The specifics of when `write()` will return false, is determined by +the `highWaterMark` option provided to the constructor. + +### writable.end([chunk], [encoding], [callback]) + +* `chunk` {Buffer | String} Optional final data to be written +* `encoding` {String} Optional. If `chunk` is a string, then encoding + defaults to `'utf8'` +* `callback` {Function} Optional. Called when the final chunk is + successfully written. + +Call this method to signal the end of the data being written to the +stream. + +### Event: 'drain' + +Emitted when the stream's write queue empties and it's safe to write +without buffering again. Listen for it when `stream.write()` returns +`false`. + +### Event: 'close' + +Emitted when the underlying resource (for example, the backing file +descriptor) has been closed. Not all streams will emit this. + +### Event: 'finish' + +When `end()` is called and there are no more chunks to write, this +event is emitted. + +### Event: 'pipe' + +* `source` {Readable Stream} + +Emitted when the stream is passed to a readable stream's pipe method. + +### Event 'unpipe' + +* `source` {Readable Stream} + +Emitted when a previously established `pipe()` is removed using the +source Readable stream's `unpipe()` method. + +## Class: stream.Duplex + + + +A "duplex" stream is one that is both Readable and Writable, such as a +TCP socket connection. + +Note that `stream.Duplex` is an abstract class designed to be +extended with an underlying implementation of the `_read(size)` +and `_write(chunk, encoding, callback)` methods as you would with a Readable or +Writable stream class. + +Since JavaScript doesn't have multiple prototypal inheritance, this +class prototypally inherits from Readable, and then parasitically from +Writable. It is thus up to the user to implement both the lowlevel +`_read(n)` method as well as the lowlevel `_write(chunk, encoding, cb)` method +on extension duplex classes. + +### new stream.Duplex(options) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `allowHalfOpen` {Boolean} Default=true. If set to `false`, then + the stream will automatically end the readable side when the + writable side ends and vice versa. + +In classes that extend the Duplex class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +## Class: stream.Transform + +A "transform" stream is a duplex stream where the output is causally +connected in some way to the input, such as a zlib stream or a crypto +stream. + +There is no requirement that the output be the same size as the input, +the same number of chunks, or arrive at the same time. For example, a +Hash stream will only ever have a single chunk of output which is +provided when the input is ended. A zlib stream will either produce +much smaller or much larger than its input. + +Rather than implement the `_read()` and `_write()` methods, Transform +classes must implement the `_transform()` method, and may optionally +also implement the `_flush()` method. (See below.) + +### new stream.Transform([options]) + +* `options` {Object} Passed to both Writable and Readable + constructors. + +In classes that extend the Transform class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +### transform.\_transform(chunk, encoding, callback) + +* `chunk` {Buffer | String} The chunk to be transformed. Will always + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. (Ignore if `decodeStrings` chunk is a buffer.) +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunk. + +Note: **This function MUST NOT be called directly.** It should be +implemented by child classes, and called by the internal Transform +class methods only. + +All Transform stream implementations must provide a `_transform` +method to accept input and produce output. + +`_transform` should do whatever has to be done in this specific +Transform class, to handle the bytes being written, and pass them off +to the readable portion of the interface. Do asynchronous I/O, +process things, and so on. + +Call `transform.push(outputChunk)` 0 or more times to generate output +from this input chunk, depending on how much data you want to output +as a result of this chunk. + +Call the callback function only when the current chunk is completely +consumed. Note that there may or may not be output as a result of any +particular input chunk. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +### transform.\_flush(callback) + +* `callback` {Function} Call this function (optionally with an error + argument) when you are done flushing any remaining data. + +Note: **This function MUST NOT be called directly.** It MAY be implemented +by child classes, and if so, will be called by the internal Transform +class methods only. + +In some cases, your transform operation may need to emit a bit more +data at the end of the stream. For example, a `Zlib` compression +stream will store up some internal state so that it can optimally +compress the output. At the end, however, it needs to do the best it +can with what is left, so that the data will be complete. + +In those cases, you can implement a `_flush` method, which will be +called at the very end, after all the written data is consumed, but +before emitting `end` to signal the end of the readable side. Just +like with `_transform`, call `transform.push(chunk)` zero or more +times, as appropriate, and call `callback` when the flush operation is +complete. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +### Example: `SimpleProtocol` parser + +The example above of a simple protocol parser can be implemented much +more simply by using the higher level `Transform` stream class. + +In this example, rather than providing the input as an argument, it +would be piped into the parser, which is a more idiomatic Node stream +approach. + +```javascript +function SimpleProtocol(options) { + if (!(this instanceof SimpleProtocol)) + return new SimpleProtocol(options); + + Transform.call(this, options); + this._inBody = false; + this._sawFirstCr = false; + this._rawHeader = []; + this.header = null; +} + +SimpleProtocol.prototype = Object.create( + Transform.prototype, { constructor: { value: SimpleProtocol }}); + +SimpleProtocol.prototype._transform = function(chunk, encoding, done) { + if (!this._inBody) { + // check if the chunk has a \n\n + var split = -1; + for (var i = 0; i < chunk.length; i++) { + if (chunk[i] === 10) { // '\n' + if (this._sawFirstCr) { + split = i; + break; + } else { + this._sawFirstCr = true; + } + } else { + this._sawFirstCr = false; + } + } + + if (split === -1) { + // still waiting for the \n\n + // stash the chunk, and try again. + this._rawHeader.push(chunk); + } else { + this._inBody = true; + var h = chunk.slice(0, split); + this._rawHeader.push(h); + var header = Buffer.concat(this._rawHeader).toString(); + try { + this.header = JSON.parse(header); + } catch (er) { + this.emit('error', new Error('invalid simple protocol data')); + return; + } + // and let them know that we are done parsing the header. + this.emit('header', this.header); + + // now, because we got some extra data, emit this first. + this.push(b); + } + } else { + // from there on, just provide the data to our consumer as-is. + this.push(b); + } + done(); +}; + +var parser = new SimpleProtocol(); +source.pipe(parser) + +// Now parser is a readable stream that will emit 'header' +// with the parsed header data. +``` + + +## Class: stream.PassThrough + +This is a trivial implementation of a `Transform` stream that simply +passes the input bytes across to the output. Its purpose is mainly +for examples and testing, but there are occasionally use cases where +it can come in handy. + + +[EventEmitter]: events.html#events_class_events_eventemitter diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/duplex.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/duplex.js new file mode 100644 index 00000000..ca807af8 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/float.patch b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/float.patch new file mode 100644 index 00000000..b984607a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/float.patch @@ -0,0 +1,923 @@ +diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js +index c5a741c..a2e0d8e 100644 +--- a/lib/_stream_duplex.js ++++ b/lib/_stream_duplex.js +@@ -26,8 +26,8 @@ + + module.exports = Duplex; + var util = require('util'); +-var Readable = require('_stream_readable'); +-var Writable = require('_stream_writable'); ++var Readable = require('./_stream_readable'); ++var Writable = require('./_stream_writable'); + + util.inherits(Duplex, Readable); + +diff --git a/lib/_stream_passthrough.js b/lib/_stream_passthrough.js +index a5e9864..330c247 100644 +--- a/lib/_stream_passthrough.js ++++ b/lib/_stream_passthrough.js +@@ -25,7 +25,7 @@ + + module.exports = PassThrough; + +-var Transform = require('_stream_transform'); ++var Transform = require('./_stream_transform'); + var util = require('util'); + util.inherits(PassThrough, Transform); + +diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js +index 0c3fe3e..90a8298 100644 +--- a/lib/_stream_readable.js ++++ b/lib/_stream_readable.js +@@ -23,10 +23,34 @@ module.exports = Readable; + Readable.ReadableState = ReadableState; + + var EE = require('events').EventEmitter; ++if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { ++ return emitter.listeners(type).length; ++}; ++ ++if (!global.setImmediate) global.setImmediate = function setImmediate(fn) { ++ return setTimeout(fn, 0); ++}; ++if (!global.clearImmediate) global.clearImmediate = function clearImmediate(i) { ++ return clearTimeout(i); ++}; ++ + var Stream = require('stream'); + var util = require('util'); ++if (!util.isUndefined) { ++ var utilIs = require('core-util-is'); ++ for (var f in utilIs) { ++ util[f] = utilIs[f]; ++ } ++} + var StringDecoder; +-var debug = util.debuglog('stream'); ++var debug; ++if (util.debuglog) ++ debug = util.debuglog('stream'); ++else try { ++ debug = require('debuglog')('stream'); ++} catch (er) { ++ debug = function() {}; ++} + + util.inherits(Readable, Stream); + +@@ -380,7 +404,7 @@ function chunkInvalid(state, chunk) { + + + function onEofChunk(stream, state) { +- if (state.decoder && !state.ended) { ++ if (state.decoder && !state.ended && state.decoder.end) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); +diff --git a/lib/_stream_transform.js b/lib/_stream_transform.js +index b1f9fcc..b0caf57 100644 +--- a/lib/_stream_transform.js ++++ b/lib/_stream_transform.js +@@ -64,8 +64,14 @@ + + module.exports = Transform; + +-var Duplex = require('_stream_duplex'); ++var Duplex = require('./_stream_duplex'); + var util = require('util'); ++if (!util.isUndefined) { ++ var utilIs = require('core-util-is'); ++ for (var f in utilIs) { ++ util[f] = utilIs[f]; ++ } ++} + util.inherits(Transform, Duplex); + + +diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js +index ba2e920..f49288b 100644 +--- a/lib/_stream_writable.js ++++ b/lib/_stream_writable.js +@@ -27,6 +27,12 @@ module.exports = Writable; + Writable.WritableState = WritableState; + + var util = require('util'); ++if (!util.isUndefined) { ++ var utilIs = require('core-util-is'); ++ for (var f in utilIs) { ++ util[f] = utilIs[f]; ++ } ++} + var Stream = require('stream'); + + util.inherits(Writable, Stream); +@@ -119,7 +125,7 @@ function WritableState(options, stream) { + function Writable(options) { + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. +- if (!(this instanceof Writable) && !(this instanceof Stream.Duplex)) ++ if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex'))) + return new Writable(options); + + this._writableState = new WritableState(options, this); +diff --git a/test/simple/test-stream-big-push.js b/test/simple/test-stream-big-push.js +index e3787e4..8cd2127 100644 +--- a/test/simple/test-stream-big-push.js ++++ b/test/simple/test-stream-big-push.js +@@ -21,7 +21,7 @@ + + var common = require('../common'); + var assert = require('assert'); +-var stream = require('stream'); ++var stream = require('../../'); + var str = 'asdfasdfasdfasdfasdf'; + + var r = new stream.Readable({ +diff --git a/test/simple/test-stream-end-paused.js b/test/simple/test-stream-end-paused.js +index bb73777..d40efc7 100644 +--- a/test/simple/test-stream-end-paused.js ++++ b/test/simple/test-stream-end-paused.js +@@ -25,7 +25,7 @@ var gotEnd = false; + + // Make sure we don't miss the end event for paused 0-length streams + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + var stream = new Readable(); + var calledRead = false; + stream._read = function() { +diff --git a/test/simple/test-stream-pipe-after-end.js b/test/simple/test-stream-pipe-after-end.js +index b46ee90..0be8366 100644 +--- a/test/simple/test-stream-pipe-after-end.js ++++ b/test/simple/test-stream-pipe-after-end.js +@@ -22,8 +22,8 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('_stream_readable'); +-var Writable = require('_stream_writable'); ++var Readable = require('../../lib/_stream_readable'); ++var Writable = require('../../lib/_stream_writable'); + var util = require('util'); + + util.inherits(TestReadable, Readable); +diff --git a/test/simple/test-stream-pipe-cleanup.js b/test/simple/test-stream-pipe-cleanup.js +deleted file mode 100644 +index f689358..0000000 +--- a/test/simple/test-stream-pipe-cleanup.js ++++ /dev/null +@@ -1,122 +0,0 @@ +-// Copyright Joyent, Inc. and other Node contributors. +-// +-// 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. +- +-// This test asserts that Stream.prototype.pipe does not leave listeners +-// hanging on the source or dest. +- +-var common = require('../common'); +-var stream = require('stream'); +-var assert = require('assert'); +-var util = require('util'); +- +-function Writable() { +- this.writable = true; +- this.endCalls = 0; +- stream.Stream.call(this); +-} +-util.inherits(Writable, stream.Stream); +-Writable.prototype.end = function() { +- this.endCalls++; +-}; +- +-Writable.prototype.destroy = function() { +- this.endCalls++; +-}; +- +-function Readable() { +- this.readable = true; +- stream.Stream.call(this); +-} +-util.inherits(Readable, stream.Stream); +- +-function Duplex() { +- this.readable = true; +- Writable.call(this); +-} +-util.inherits(Duplex, Writable); +- +-var i = 0; +-var limit = 100; +- +-var w = new Writable(); +- +-var r; +- +-for (i = 0; i < limit; i++) { +- r = new Readable(); +- r.pipe(w); +- r.emit('end'); +-} +-assert.equal(0, r.listeners('end').length); +-assert.equal(limit, w.endCalls); +- +-w.endCalls = 0; +- +-for (i = 0; i < limit; i++) { +- r = new Readable(); +- r.pipe(w); +- r.emit('close'); +-} +-assert.equal(0, r.listeners('close').length); +-assert.equal(limit, w.endCalls); +- +-w.endCalls = 0; +- +-r = new Readable(); +- +-for (i = 0; i < limit; i++) { +- w = new Writable(); +- r.pipe(w); +- w.emit('close'); +-} +-assert.equal(0, w.listeners('close').length); +- +-r = new Readable(); +-w = new Writable(); +-var d = new Duplex(); +-r.pipe(d); // pipeline A +-d.pipe(w); // pipeline B +-assert.equal(r.listeners('end').length, 2); // A.onend, A.cleanup +-assert.equal(r.listeners('close').length, 2); // A.onclose, A.cleanup +-assert.equal(d.listeners('end').length, 2); // B.onend, B.cleanup +-assert.equal(d.listeners('close').length, 3); // A.cleanup, B.onclose, B.cleanup +-assert.equal(w.listeners('end').length, 0); +-assert.equal(w.listeners('close').length, 1); // B.cleanup +- +-r.emit('end'); +-assert.equal(d.endCalls, 1); +-assert.equal(w.endCalls, 0); +-assert.equal(r.listeners('end').length, 0); +-assert.equal(r.listeners('close').length, 0); +-assert.equal(d.listeners('end').length, 2); // B.onend, B.cleanup +-assert.equal(d.listeners('close').length, 2); // B.onclose, B.cleanup +-assert.equal(w.listeners('end').length, 0); +-assert.equal(w.listeners('close').length, 1); // B.cleanup +- +-d.emit('end'); +-assert.equal(d.endCalls, 1); +-assert.equal(w.endCalls, 1); +-assert.equal(r.listeners('end').length, 0); +-assert.equal(r.listeners('close').length, 0); +-assert.equal(d.listeners('end').length, 0); +-assert.equal(d.listeners('close').length, 0); +-assert.equal(w.listeners('end').length, 0); +-assert.equal(w.listeners('close').length, 0); +diff --git a/test/simple/test-stream-pipe-error-handling.js b/test/simple/test-stream-pipe-error-handling.js +index c5d724b..c7d6b7d 100644 +--- a/test/simple/test-stream-pipe-error-handling.js ++++ b/test/simple/test-stream-pipe-error-handling.js +@@ -21,7 +21,7 @@ + + var common = require('../common'); + var assert = require('assert'); +-var Stream = require('stream').Stream; ++var Stream = require('../../').Stream; + + (function testErrorListenerCatches() { + var source = new Stream(); +diff --git a/test/simple/test-stream-pipe-event.js b/test/simple/test-stream-pipe-event.js +index cb9d5fe..56f8d61 100644 +--- a/test/simple/test-stream-pipe-event.js ++++ b/test/simple/test-stream-pipe-event.js +@@ -20,7 +20,7 @@ + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var common = require('../common'); +-var stream = require('stream'); ++var stream = require('../../'); + var assert = require('assert'); + var util = require('util'); + +diff --git a/test/simple/test-stream-push-order.js b/test/simple/test-stream-push-order.js +index f2e6ec2..a5c9bf9 100644 +--- a/test/simple/test-stream-push-order.js ++++ b/test/simple/test-stream-push-order.js +@@ -20,7 +20,7 @@ + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var common = require('../common.js'); +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + var assert = require('assert'); + + var s = new Readable({ +diff --git a/test/simple/test-stream-push-strings.js b/test/simple/test-stream-push-strings.js +index 06f43dc..1701a9a 100644 +--- a/test/simple/test-stream-push-strings.js ++++ b/test/simple/test-stream-push-strings.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + var util = require('util'); + + util.inherits(MyStream, Readable); +diff --git a/test/simple/test-stream-readable-event.js b/test/simple/test-stream-readable-event.js +index ba6a577..a8e6f7b 100644 +--- a/test/simple/test-stream-readable-event.js ++++ b/test/simple/test-stream-readable-event.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + + (function first() { + // First test, not reading when the readable is added. +diff --git a/test/simple/test-stream-readable-flow-recursion.js b/test/simple/test-stream-readable-flow-recursion.js +index 2891ad6..11689ba 100644 +--- a/test/simple/test-stream-readable-flow-recursion.js ++++ b/test/simple/test-stream-readable-flow-recursion.js +@@ -27,7 +27,7 @@ var assert = require('assert'); + // more data continuously, but without triggering a nextTick + // warning or RangeError. + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + + // throw an error if we trigger a nextTick warning. + process.throwDeprecation = true; +diff --git a/test/simple/test-stream-unshift-empty-chunk.js b/test/simple/test-stream-unshift-empty-chunk.js +index 0c96476..7827538 100644 +--- a/test/simple/test-stream-unshift-empty-chunk.js ++++ b/test/simple/test-stream-unshift-empty-chunk.js +@@ -24,7 +24,7 @@ var assert = require('assert'); + + // This test verifies that stream.unshift(Buffer(0)) or + // stream.unshift('') does not set state.reading=false. +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + + var r = new Readable(); + var nChunks = 10; +diff --git a/test/simple/test-stream-unshift-read-race.js b/test/simple/test-stream-unshift-read-race.js +index 83fd9fa..17c18aa 100644 +--- a/test/simple/test-stream-unshift-read-race.js ++++ b/test/simple/test-stream-unshift-read-race.js +@@ -29,7 +29,7 @@ var assert = require('assert'); + // 3. push() after the EOF signaling null is an error. + // 4. _read() is not called after pushing the EOF null chunk. + +-var stream = require('stream'); ++var stream = require('../../'); + var hwm = 10; + var r = stream.Readable({ highWaterMark: hwm }); + var chunks = 10; +@@ -51,7 +51,14 @@ r._read = function(n) { + + function push(fast) { + assert(!pushedNull, 'push() after null push'); +- var c = pos >= data.length ? null : data.slice(pos, pos + n); ++ var c; ++ if (pos >= data.length) ++ c = null; ++ else { ++ if (n + pos > data.length) ++ n = data.length - pos; ++ c = data.slice(pos, pos + n); ++ } + pushedNull = c === null; + if (fast) { + pos += n; +diff --git a/test/simple/test-stream-writev.js b/test/simple/test-stream-writev.js +index 5b49e6e..b5321f3 100644 +--- a/test/simple/test-stream-writev.js ++++ b/test/simple/test-stream-writev.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var stream = require('stream'); ++var stream = require('../../'); + + var queue = []; + for (var decode = 0; decode < 2; decode++) { +diff --git a/test/simple/test-stream2-basic.js b/test/simple/test-stream2-basic.js +index 3814bf0..248c1be 100644 +--- a/test/simple/test-stream2-basic.js ++++ b/test/simple/test-stream2-basic.js +@@ -21,7 +21,7 @@ + + + var common = require('../common.js'); +-var R = require('_stream_readable'); ++var R = require('../../lib/_stream_readable'); + var assert = require('assert'); + + var util = require('util'); +diff --git a/test/simple/test-stream2-compatibility.js b/test/simple/test-stream2-compatibility.js +index 6cdd4e9..f0fa84b 100644 +--- a/test/simple/test-stream2-compatibility.js ++++ b/test/simple/test-stream2-compatibility.js +@@ -21,7 +21,7 @@ + + + var common = require('../common.js'); +-var R = require('_stream_readable'); ++var R = require('../../lib/_stream_readable'); + var assert = require('assert'); + + var util = require('util'); +diff --git a/test/simple/test-stream2-finish-pipe.js b/test/simple/test-stream2-finish-pipe.js +index 39b274f..006a19b 100644 +--- a/test/simple/test-stream2-finish-pipe.js ++++ b/test/simple/test-stream2-finish-pipe.js +@@ -20,7 +20,7 @@ + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var common = require('../common.js'); +-var stream = require('stream'); ++var stream = require('../../'); + var Buffer = require('buffer').Buffer; + + var r = new stream.Readable(); +diff --git a/test/simple/test-stream2-fs.js b/test/simple/test-stream2-fs.js +deleted file mode 100644 +index e162406..0000000 +--- a/test/simple/test-stream2-fs.js ++++ /dev/null +@@ -1,72 +0,0 @@ +-// Copyright Joyent, Inc. and other Node contributors. +-// +-// 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. +- +- +-var common = require('../common.js'); +-var R = require('_stream_readable'); +-var assert = require('assert'); +- +-var fs = require('fs'); +-var FSReadable = fs.ReadStream; +- +-var path = require('path'); +-var file = path.resolve(common.fixturesDir, 'x1024.txt'); +- +-var size = fs.statSync(file).size; +- +-var expectLengths = [1024]; +- +-var util = require('util'); +-var Stream = require('stream'); +- +-util.inherits(TestWriter, Stream); +- +-function TestWriter() { +- Stream.apply(this); +- this.buffer = []; +- this.length = 0; +-} +- +-TestWriter.prototype.write = function(c) { +- this.buffer.push(c.toString()); +- this.length += c.length; +- return true; +-}; +- +-TestWriter.prototype.end = function(c) { +- if (c) this.buffer.push(c.toString()); +- this.emit('results', this.buffer); +-} +- +-var r = new FSReadable(file); +-var w = new TestWriter(); +- +-w.on('results', function(res) { +- console.error(res, w.length); +- assert.equal(w.length, size); +- var l = 0; +- assert.deepEqual(res.map(function (c) { +- return c.length; +- }), expectLengths); +- console.log('ok'); +-}); +- +-r.pipe(w); +diff --git a/test/simple/test-stream2-httpclient-response-end.js b/test/simple/test-stream2-httpclient-response-end.js +deleted file mode 100644 +index 15cffc2..0000000 +--- a/test/simple/test-stream2-httpclient-response-end.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// Copyright Joyent, Inc. and other Node contributors. +-// +-// 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. +- +-var common = require('../common.js'); +-var assert = require('assert'); +-var http = require('http'); +-var msg = 'Hello'; +-var readable_event = false; +-var end_event = false; +-var server = http.createServer(function(req, res) { +- res.writeHead(200, {'Content-Type': 'text/plain'}); +- res.end(msg); +-}).listen(common.PORT, function() { +- http.get({port: common.PORT}, function(res) { +- var data = ''; +- res.on('readable', function() { +- console.log('readable event'); +- readable_event = true; +- data += res.read(); +- }); +- res.on('end', function() { +- console.log('end event'); +- end_event = true; +- assert.strictEqual(msg, data); +- server.close(); +- }); +- }); +-}); +- +-process.on('exit', function() { +- assert(readable_event); +- assert(end_event); +-}); +- +diff --git a/test/simple/test-stream2-large-read-stall.js b/test/simple/test-stream2-large-read-stall.js +index 2fbfbca..667985b 100644 +--- a/test/simple/test-stream2-large-read-stall.js ++++ b/test/simple/test-stream2-large-read-stall.js +@@ -30,7 +30,7 @@ var PUSHSIZE = 20; + var PUSHCOUNT = 1000; + var HWM = 50; + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + var r = new Readable({ + highWaterMark: HWM + }); +@@ -39,23 +39,23 @@ var rs = r._readableState; + r._read = push; + + r.on('readable', function() { +- console.error('>> readable'); ++ //console.error('>> readable'); + do { +- console.error(' > read(%d)', READSIZE); ++ //console.error(' > read(%d)', READSIZE); + var ret = r.read(READSIZE); +- console.error(' < %j (%d remain)', ret && ret.length, rs.length); ++ //console.error(' < %j (%d remain)', ret && ret.length, rs.length); + } while (ret && ret.length === READSIZE); + +- console.error('<< after read()', +- ret && ret.length, +- rs.needReadable, +- rs.length); ++ //console.error('<< after read()', ++ // ret && ret.length, ++ // rs.needReadable, ++ // rs.length); + }); + + var endEmitted = false; + r.on('end', function() { + endEmitted = true; +- console.error('end'); ++ //console.error('end'); + }); + + var pushes = 0; +@@ -64,11 +64,11 @@ function push() { + return; + + if (pushes++ === PUSHCOUNT) { +- console.error(' push(EOF)'); ++ //console.error(' push(EOF)'); + return r.push(null); + } + +- console.error(' push #%d', pushes); ++ //console.error(' push #%d', pushes); + if (r.push(new Buffer(PUSHSIZE))) + setTimeout(push); + } +diff --git a/test/simple/test-stream2-objects.js b/test/simple/test-stream2-objects.js +index 3e6931d..ff47d89 100644 +--- a/test/simple/test-stream2-objects.js ++++ b/test/simple/test-stream2-objects.js +@@ -21,8 +21,8 @@ + + + var common = require('../common.js'); +-var Readable = require('_stream_readable'); +-var Writable = require('_stream_writable'); ++var Readable = require('../../lib/_stream_readable'); ++var Writable = require('../../lib/_stream_writable'); + var assert = require('assert'); + + // tiny node-tap lookalike. +diff --git a/test/simple/test-stream2-pipe-error-handling.js b/test/simple/test-stream2-pipe-error-handling.js +index cf7531c..e3f3e4e 100644 +--- a/test/simple/test-stream2-pipe-error-handling.js ++++ b/test/simple/test-stream2-pipe-error-handling.js +@@ -21,7 +21,7 @@ + + var common = require('../common'); + var assert = require('assert'); +-var stream = require('stream'); ++var stream = require('../../'); + + (function testErrorListenerCatches() { + var count = 1000; +diff --git a/test/simple/test-stream2-pipe-error-once-listener.js b/test/simple/test-stream2-pipe-error-once-listener.js +index 5e8e3cb..53b2616 100755 +--- a/test/simple/test-stream2-pipe-error-once-listener.js ++++ b/test/simple/test-stream2-pipe-error-once-listener.js +@@ -24,7 +24,7 @@ var common = require('../common.js'); + var assert = require('assert'); + + var util = require('util'); +-var stream = require('stream'); ++var stream = require('../../'); + + + var Read = function() { +diff --git a/test/simple/test-stream2-push.js b/test/simple/test-stream2-push.js +index b63edc3..eb2b0e9 100644 +--- a/test/simple/test-stream2-push.js ++++ b/test/simple/test-stream2-push.js +@@ -20,7 +20,7 @@ + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var common = require('../common.js'); +-var stream = require('stream'); ++var stream = require('../../'); + var Readable = stream.Readable; + var Writable = stream.Writable; + var assert = require('assert'); +diff --git a/test/simple/test-stream2-read-sync-stack.js b/test/simple/test-stream2-read-sync-stack.js +index e8a7305..9740a47 100644 +--- a/test/simple/test-stream2-read-sync-stack.js ++++ b/test/simple/test-stream2-read-sync-stack.js +@@ -21,7 +21,7 @@ + + var common = require('../common'); + var assert = require('assert'); +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + var r = new Readable(); + var N = 256 * 1024; + +diff --git a/test/simple/test-stream2-readable-empty-buffer-no-eof.js b/test/simple/test-stream2-readable-empty-buffer-no-eof.js +index cd30178..4b1659d 100644 +--- a/test/simple/test-stream2-readable-empty-buffer-no-eof.js ++++ b/test/simple/test-stream2-readable-empty-buffer-no-eof.js +@@ -22,10 +22,9 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('stream').Readable; ++var Readable = require('../../').Readable; + + test1(); +-test2(); + + function test1() { + var r = new Readable(); +@@ -88,31 +87,3 @@ function test1() { + console.log('ok'); + }); + } +- +-function test2() { +- var r = new Readable({ encoding: 'base64' }); +- var reads = 5; +- r._read = function(n) { +- if (!reads--) +- return r.push(null); // EOF +- else +- return r.push(new Buffer('x')); +- }; +- +- var results = []; +- function flow() { +- var chunk; +- while (null !== (chunk = r.read())) +- results.push(chunk + ''); +- } +- r.on('readable', flow); +- r.on('end', function() { +- results.push('EOF'); +- }); +- flow(); +- +- process.on('exit', function() { +- assert.deepEqual(results, [ 'eHh4', 'eHg=', 'EOF' ]); +- console.log('ok'); +- }); +-} +diff --git a/test/simple/test-stream2-readable-from-list.js b/test/simple/test-stream2-readable-from-list.js +index 7c96ffe..04a96f5 100644 +--- a/test/simple/test-stream2-readable-from-list.js ++++ b/test/simple/test-stream2-readable-from-list.js +@@ -21,7 +21,7 @@ + + var assert = require('assert'); + var common = require('../common.js'); +-var fromList = require('_stream_readable')._fromList; ++var fromList = require('../../lib/_stream_readable')._fromList; + + // tiny node-tap lookalike. + var tests = []; +diff --git a/test/simple/test-stream2-readable-legacy-drain.js b/test/simple/test-stream2-readable-legacy-drain.js +index 675da8e..51fd3d5 100644 +--- a/test/simple/test-stream2-readable-legacy-drain.js ++++ b/test/simple/test-stream2-readable-legacy-drain.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Stream = require('stream'); ++var Stream = require('../../'); + var Readable = Stream.Readable; + + var r = new Readable(); +diff --git a/test/simple/test-stream2-readable-non-empty-end.js b/test/simple/test-stream2-readable-non-empty-end.js +index 7314ae7..c971898 100644 +--- a/test/simple/test-stream2-readable-non-empty-end.js ++++ b/test/simple/test-stream2-readable-non-empty-end.js +@@ -21,7 +21,7 @@ + + var assert = require('assert'); + var common = require('../common.js'); +-var Readable = require('_stream_readable'); ++var Readable = require('../../lib/_stream_readable'); + + var len = 0; + var chunks = new Array(10); +diff --git a/test/simple/test-stream2-readable-wrap-empty.js b/test/simple/test-stream2-readable-wrap-empty.js +index 2e5cf25..fd8a3dc 100644 +--- a/test/simple/test-stream2-readable-wrap-empty.js ++++ b/test/simple/test-stream2-readable-wrap-empty.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('_stream_readable'); ++var Readable = require('../../lib/_stream_readable'); + var EE = require('events').EventEmitter; + + var oldStream = new EE(); +diff --git a/test/simple/test-stream2-readable-wrap.js b/test/simple/test-stream2-readable-wrap.js +index 90eea01..6b177f7 100644 +--- a/test/simple/test-stream2-readable-wrap.js ++++ b/test/simple/test-stream2-readable-wrap.js +@@ -22,8 +22,8 @@ + var common = require('../common'); + var assert = require('assert'); + +-var Readable = require('_stream_readable'); +-var Writable = require('_stream_writable'); ++var Readable = require('../../lib/_stream_readable'); ++var Writable = require('../../lib/_stream_writable'); + var EE = require('events').EventEmitter; + + var testRuns = 0, completedRuns = 0; +diff --git a/test/simple/test-stream2-set-encoding.js b/test/simple/test-stream2-set-encoding.js +index 5d2c32a..685531b 100644 +--- a/test/simple/test-stream2-set-encoding.js ++++ b/test/simple/test-stream2-set-encoding.js +@@ -22,7 +22,7 @@ + + var common = require('../common.js'); + var assert = require('assert'); +-var R = require('_stream_readable'); ++var R = require('../../lib/_stream_readable'); + var util = require('util'); + + // tiny node-tap lookalike. +diff --git a/test/simple/test-stream2-transform.js b/test/simple/test-stream2-transform.js +index 9c9ddd8..a0cacc6 100644 +--- a/test/simple/test-stream2-transform.js ++++ b/test/simple/test-stream2-transform.js +@@ -21,8 +21,8 @@ + + var assert = require('assert'); + var common = require('../common.js'); +-var PassThrough = require('_stream_passthrough'); +-var Transform = require('_stream_transform'); ++var PassThrough = require('../../').PassThrough; ++var Transform = require('../../').Transform; + + // tiny node-tap lookalike. + var tests = []; +diff --git a/test/simple/test-stream2-unpipe-drain.js b/test/simple/test-stream2-unpipe-drain.js +index d66dc3c..365b327 100644 +--- a/test/simple/test-stream2-unpipe-drain.js ++++ b/test/simple/test-stream2-unpipe-drain.js +@@ -22,7 +22,7 @@ + + var common = require('../common.js'); + var assert = require('assert'); +-var stream = require('stream'); ++var stream = require('../../'); + var crypto = require('crypto'); + + var util = require('util'); +diff --git a/test/simple/test-stream2-unpipe-leak.js b/test/simple/test-stream2-unpipe-leak.js +index 99f8746..17c92ae 100644 +--- a/test/simple/test-stream2-unpipe-leak.js ++++ b/test/simple/test-stream2-unpipe-leak.js +@@ -22,7 +22,7 @@ + + var common = require('../common.js'); + var assert = require('assert'); +-var stream = require('stream'); ++var stream = require('../../'); + + var chunk = new Buffer('hallo'); + +diff --git a/test/simple/test-stream2-writable.js b/test/simple/test-stream2-writable.js +index 704100c..209c3a6 100644 +--- a/test/simple/test-stream2-writable.js ++++ b/test/simple/test-stream2-writable.js +@@ -20,8 +20,8 @@ + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var common = require('../common.js'); +-var W = require('_stream_writable'); +-var D = require('_stream_duplex'); ++var W = require('../../').Writable; ++var D = require('../../').Duplex; + var assert = require('assert'); + + var util = require('util'); +diff --git a/test/simple/test-stream3-pause-then-read.js b/test/simple/test-stream3-pause-then-read.js +index b91bde3..2f72c15 100644 +--- a/test/simple/test-stream3-pause-then-read.js ++++ b/test/simple/test-stream3-pause-then-read.js +@@ -22,7 +22,7 @@ + var common = require('../common'); + var assert = require('assert'); + +-var stream = require('stream'); ++var stream = require('../../'); + var Readable = stream.Readable; + var Writable = stream.Writable; + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 00000000..a2e0d8e0 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,69 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +module.exports = Duplex; +var util = require('util'); +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +Object.keys(Writable.prototype).forEach(function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +}); + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + process.nextTick(this.end.bind(this)); +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 00000000..330c247d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,41 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); +var util = require('util'); +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 00000000..2d00efb4 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,924 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +module.exports = Readable; +Readable.ReadableState = ReadableState; + +var EE = require('events').EventEmitter; +if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; + +if (!global.setImmediate) global.setImmediate = function setImmediate(fn) { + return setTimeout(fn, 0); +}; +if (!global.clearImmediate) global.clearImmediate = function clearImmediate(i) { + return clearTimeout(i); +}; + +var Stream = require('stream'); +var util = require('util'); +if (!util.isUndefined) { + var utilIs = require('core-util-is'); + for (var f in utilIs) { + util[f] = utilIs[f]; + } +} +var StringDecoder; +var debug; +if (util.debuglog) + debug = util.debuglog('stream'); +else try { + debug = require('debuglog')('stream'); +} catch (er) { + debug = function() {}; +} + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + options = options || {}; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = options.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (util.isString(chunk) && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (util.isNullOrUndefined(chunk)) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + if (!addToFront) + state.reading = false; + + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) + state.buffer.unshift(chunk); + else + state.buffer.push(chunk); + + if (state.needReadable) + emitReadable(stream); + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 128MB +var MAX_HWM = 0x800000; +function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (isNaN(n) || util.isNull(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; + + if (!util.isNumber(n) || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) + endReadable(this); + else + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) + endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } + + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + var ret; + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (util.isNull(ret)) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) + endReadable(this); + + if (!util.isNull(ret)) + this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!util.isBuffer(chunk) && + !util.isString(chunk) && + !util.isNullOrUndefined(chunk) && + !state.objectMode && + !er) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.decoder && !state.ended && state.decoder.end) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && + (!dest._writableState || dest._writableState.needDrain)) + ondrain(); + } + + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + debug('false write response, pause', + src._readableState.awaitDrain); + src._readableState.awaitDrain++; + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EE.listenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (Array.isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) + state.awaitDrain--; + if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = state.pipes.indexOf(dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); + } + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + var self = this; + process.nextTick(function() { + debug('readable nexttick read 0'); + self.read(0); + }); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + if (!state.reading) { + debug('resume read 0'); + this.read(0); + } + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(function() { + resume_(stream, state); + }); + } +} + +function resume_(stream, state) { + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) + stream.read(0); +} + +Readable.prototype.pause = function() { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + debug('wrapped data'); + if (state.decoder) + chunk = state.decoder.write(chunk); + if (!chunk || !state.objectMode && !chunk.length) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }}(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + events.forEach(function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(function() { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + }); + } +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 00000000..b0caf57d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,210 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); +var util = require('util'); +if (!util.isUndefined) { + var utilIs = require('core-util-is'); + for (var f in utilIs) { + util[f] = utilIs[f]; + } +} +util.inherits(Transform, Duplex); + + +function TransformState(options, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (!util.isNullOrUndefined(data)) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(options, this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + this.once('prefinish', function() { + if (util.isFunction(this._flush)) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 00000000..1dfca70d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,460 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +module.exports = Writable; +Writable.WritableState = WritableState; + +var util = require('util'); +if (!util.isUndefined) { + var utilIs = require('core-util-is'); + for (var f in utilIs) { + util[f] = utilIs[f]; + } +} +var Stream = require('stream'); + +util.inherits(Writable, Stream); + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; +} + +function WritableState(options, stream) { + options = options || {}; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = options.objectMode ? 16 : 16 * 1024; + this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.buffer = []; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; +} + +function Writable(options) { + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex'))) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, state, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!util.isBuffer(chunk) && + !util.isString(chunk) && + !util.isNullOrUndefined(chunk) && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + + if (util.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (!util.isFunction(cb)) + cb = function() {}; + + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function() { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function() { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && + !state.corked && + !state.finished && + !state.bufferProcessing && + state.buffer.length) + clearBuffer(this, state); + } +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + util.isString(chunk)) { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (util.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + state.needDrain = !ret; + + if (state.writing || state.corked) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, false, len, chunk, encoding, cb); + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) + stream._writev(chunk, state.onwrite); + else + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + state.pendingcb--; + cb(er); + }); + else { + state.pendingcb--; + cb(er); + } + + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(stream, state); + + if (!finished && + !state.corked && + !state.bufferProcessing && + state.buffer.length) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + + if (stream._writev && state.buffer.length > 1) { + // Fast case, write everything using _writev() + var cbs = []; + for (var c = 0; c < state.buffer.length; c++) + cbs.push(state.buffer[c].callback); + + // count the one we are adding, as well. + // TODO(isaacs) clean this up + state.pendingcb++; + doWrite(stream, state, true, state.length, state.buffer, '', function(err) { + for (var i = 0; i < cbs.length; i++) { + state.pendingcb--; + cbs[i](err); + } + }); + + // Clear buffer + state.buffer = []; + } else { + // Slow case, write chunks one-by-one + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + c++; + break; + } + } + + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; + } + + state.bufferProcessing = false; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); + +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (util.isFunction(chunk)) { + cb = chunk; + chunk = null; + encoding = null; + } else if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + + if (!util.isNullOrUndefined(chunk)) + this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(stream, state) { + return (state.ending && + state.length === 0 && + !state.finished && + !state.writing); +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else + prefinish(stream, state); + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/README.md b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/README.md new file mode 100644 index 00000000..5a76b414 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/float.patch b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/float.patch new file mode 100644 index 00000000..a06d5c05 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/float.patch @@ -0,0 +1,604 @@ +diff --git a/lib/util.js b/lib/util.js +index a03e874..9074e8e 100644 +--- a/lib/util.js ++++ b/lib/util.js +@@ -19,430 +19,6 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-var formatRegExp = /%[sdj%]/g; +-exports.format = function(f) { +- if (!isString(f)) { +- var objects = []; +- for (var i = 0; i < arguments.length; i++) { +- objects.push(inspect(arguments[i])); +- } +- return objects.join(' '); +- } +- +- var i = 1; +- var args = arguments; +- var len = args.length; +- var str = String(f).replace(formatRegExp, function(x) { +- if (x === '%%') return '%'; +- if (i >= len) return x; +- switch (x) { +- case '%s': return String(args[i++]); +- case '%d': return Number(args[i++]); +- case '%j': +- try { +- return JSON.stringify(args[i++]); +- } catch (_) { +- return '[Circular]'; +- } +- default: +- return x; +- } +- }); +- for (var x = args[i]; i < len; x = args[++i]) { +- if (isNull(x) || !isObject(x)) { +- str += ' ' + x; +- } else { +- str += ' ' + inspect(x); +- } +- } +- return str; +-}; +- +- +-// Mark that a method should not be used. +-// Returns a modified function which warns once by default. +-// If --no-deprecation is set, then it is a no-op. +-exports.deprecate = function(fn, msg) { +- // Allow for deprecating things in the process of starting up. +- if (isUndefined(global.process)) { +- return function() { +- return exports.deprecate(fn, msg).apply(this, arguments); +- }; +- } +- +- if (process.noDeprecation === true) { +- return fn; +- } +- +- var warned = false; +- function deprecated() { +- if (!warned) { +- if (process.throwDeprecation) { +- throw new Error(msg); +- } else if (process.traceDeprecation) { +- console.trace(msg); +- } else { +- console.error(msg); +- } +- warned = true; +- } +- return fn.apply(this, arguments); +- } +- +- return deprecated; +-}; +- +- +-var debugs = {}; +-var debugEnviron; +-exports.debuglog = function(set) { +- if (isUndefined(debugEnviron)) +- debugEnviron = process.env.NODE_DEBUG || ''; +- set = set.toUpperCase(); +- if (!debugs[set]) { +- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { +- var pid = process.pid; +- debugs[set] = function() { +- var msg = exports.format.apply(exports, arguments); +- console.error('%s %d: %s', set, pid, msg); +- }; +- } else { +- debugs[set] = function() {}; +- } +- } +- return debugs[set]; +-}; +- +- +-/** +- * Echos the value of a value. Trys to print the value out +- * in the best way possible given the different types. +- * +- * @param {Object} obj The object to print out. +- * @param {Object} opts Optional options object that alters the output. +- */ +-/* legacy: obj, showHidden, depth, colors*/ +-function inspect(obj, opts) { +- // default options +- var ctx = { +- seen: [], +- stylize: stylizeNoColor +- }; +- // legacy... +- if (arguments.length >= 3) ctx.depth = arguments[2]; +- if (arguments.length >= 4) ctx.colors = arguments[3]; +- if (isBoolean(opts)) { +- // legacy... +- ctx.showHidden = opts; +- } else if (opts) { +- // got an "options" object +- exports._extend(ctx, opts); +- } +- // set default options +- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; +- if (isUndefined(ctx.depth)) ctx.depth = 2; +- if (isUndefined(ctx.colors)) ctx.colors = false; +- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; +- if (ctx.colors) ctx.stylize = stylizeWithColor; +- return formatValue(ctx, obj, ctx.depth); +-} +-exports.inspect = inspect; +- +- +-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +-inspect.colors = { +- 'bold' : [1, 22], +- 'italic' : [3, 23], +- 'underline' : [4, 24], +- 'inverse' : [7, 27], +- 'white' : [37, 39], +- 'grey' : [90, 39], +- 'black' : [30, 39], +- 'blue' : [34, 39], +- 'cyan' : [36, 39], +- 'green' : [32, 39], +- 'magenta' : [35, 39], +- 'red' : [31, 39], +- 'yellow' : [33, 39] +-}; +- +-// Don't use 'blue' not visible on cmd.exe +-inspect.styles = { +- 'special': 'cyan', +- 'number': 'yellow', +- 'boolean': 'yellow', +- 'undefined': 'grey', +- 'null': 'bold', +- 'string': 'green', +- 'date': 'magenta', +- // "name": intentionally not styling +- 'regexp': 'red' +-}; +- +- +-function stylizeWithColor(str, styleType) { +- var style = inspect.styles[styleType]; +- +- if (style) { +- return '\u001b[' + inspect.colors[style][0] + 'm' + str + +- '\u001b[' + inspect.colors[style][1] + 'm'; +- } else { +- return str; +- } +-} +- +- +-function stylizeNoColor(str, styleType) { +- return str; +-} +- +- +-function arrayToHash(array) { +- var hash = {}; +- +- array.forEach(function(val, idx) { +- hash[val] = true; +- }); +- +- return hash; +-} +- +- +-function formatValue(ctx, value, recurseTimes) { +- // Provide a hook for user-specified inspect functions. +- // Check that value is an object with an inspect function on it +- if (ctx.customInspect && +- value && +- isFunction(value.inspect) && +- // Filter out the util module, it's inspect function is special +- value.inspect !== exports.inspect && +- // Also filter out any prototype objects using the circular check. +- !(value.constructor && value.constructor.prototype === value)) { +- var ret = value.inspect(recurseTimes, ctx); +- if (!isString(ret)) { +- ret = formatValue(ctx, ret, recurseTimes); +- } +- return ret; +- } +- +- // Primitive types cannot have properties +- var primitive = formatPrimitive(ctx, value); +- if (primitive) { +- return primitive; +- } +- +- // Look up the keys of the object. +- var keys = Object.keys(value); +- var visibleKeys = arrayToHash(keys); +- +- if (ctx.showHidden) { +- keys = Object.getOwnPropertyNames(value); +- } +- +- // Some type of object without properties can be shortcutted. +- if (keys.length === 0) { +- if (isFunction(value)) { +- var name = value.name ? ': ' + value.name : ''; +- return ctx.stylize('[Function' + name + ']', 'special'); +- } +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } +- if (isDate(value)) { +- return ctx.stylize(Date.prototype.toString.call(value), 'date'); +- } +- if (isError(value)) { +- return formatError(value); +- } +- } +- +- var base = '', array = false, braces = ['{', '}']; +- +- // Make Array say that they are Array +- if (isArray(value)) { +- array = true; +- braces = ['[', ']']; +- } +- +- // Make functions say that they are functions +- if (isFunction(value)) { +- var n = value.name ? ': ' + value.name : ''; +- base = ' [Function' + n + ']'; +- } +- +- // Make RegExps say that they are RegExps +- if (isRegExp(value)) { +- base = ' ' + RegExp.prototype.toString.call(value); +- } +- +- // Make dates with properties first say the date +- if (isDate(value)) { +- base = ' ' + Date.prototype.toUTCString.call(value); +- } +- +- // Make error with message first say the error +- if (isError(value)) { +- base = ' ' + formatError(value); +- } +- +- if (keys.length === 0 && (!array || value.length == 0)) { +- return braces[0] + base + braces[1]; +- } +- +- if (recurseTimes < 0) { +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } else { +- return ctx.stylize('[Object]', 'special'); +- } +- } +- +- ctx.seen.push(value); +- +- var output; +- if (array) { +- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); +- } else { +- output = keys.map(function(key) { +- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); +- }); +- } +- +- ctx.seen.pop(); +- +- return reduceToSingleString(output, base, braces); +-} +- +- +-function formatPrimitive(ctx, value) { +- if (isUndefined(value)) +- return ctx.stylize('undefined', 'undefined'); +- if (isString(value)) { +- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') +- .replace(/'/g, "\\'") +- .replace(/\\"/g, '"') + '\''; +- return ctx.stylize(simple, 'string'); +- } +- if (isNumber(value)) { +- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, +- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . +- if (value === 0 && 1 / value < 0) +- return ctx.stylize('-0', 'number'); +- return ctx.stylize('' + value, 'number'); +- } +- if (isBoolean(value)) +- return ctx.stylize('' + value, 'boolean'); +- // For some reason typeof null is "object", so special case here. +- if (isNull(value)) +- return ctx.stylize('null', 'null'); +-} +- +- +-function formatError(value) { +- return '[' + Error.prototype.toString.call(value) + ']'; +-} +- +- +-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { +- var output = []; +- for (var i = 0, l = value.length; i < l; ++i) { +- if (hasOwnProperty(value, String(i))) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- String(i), true)); +- } else { +- output.push(''); +- } +- } +- keys.forEach(function(key) { +- if (!key.match(/^\d+$/)) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- key, true)); +- } +- }); +- return output; +-} +- +- +-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { +- var name, str, desc; +- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; +- if (desc.get) { +- if (desc.set) { +- str = ctx.stylize('[Getter/Setter]', 'special'); +- } else { +- str = ctx.stylize('[Getter]', 'special'); +- } +- } else { +- if (desc.set) { +- str = ctx.stylize('[Setter]', 'special'); +- } +- } +- if (!hasOwnProperty(visibleKeys, key)) { +- name = '[' + key + ']'; +- } +- if (!str) { +- if (ctx.seen.indexOf(desc.value) < 0) { +- if (isNull(recurseTimes)) { +- str = formatValue(ctx, desc.value, null); +- } else { +- str = formatValue(ctx, desc.value, recurseTimes - 1); +- } +- if (str.indexOf('\n') > -1) { +- if (array) { +- str = str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n').substr(2); +- } else { +- str = '\n' + str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n'); +- } +- } +- } else { +- str = ctx.stylize('[Circular]', 'special'); +- } +- } +- if (isUndefined(name)) { +- if (array && key.match(/^\d+$/)) { +- return str; +- } +- name = JSON.stringify('' + key); +- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { +- name = name.substr(1, name.length - 2); +- name = ctx.stylize(name, 'name'); +- } else { +- name = name.replace(/'/g, "\\'") +- .replace(/\\"/g, '"') +- .replace(/(^"|"$)/g, "'"); +- name = ctx.stylize(name, 'string'); +- } +- } +- +- return name + ': ' + str; +-} +- +- +-function reduceToSingleString(output, base, braces) { +- var numLinesEst = 0; +- var length = output.reduce(function(prev, cur) { +- numLinesEst++; +- if (cur.indexOf('\n') >= 0) numLinesEst++; +- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; +- }, 0); +- +- if (length > 60) { +- return braces[0] + +- (base === '' ? '' : base + '\n ') + +- ' ' + +- output.join(',\n ') + +- ' ' + +- braces[1]; +- } +- +- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +-} +- +- + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray(ar) { +@@ -522,166 +98,10 @@ function isPrimitive(arg) { + exports.isPrimitive = isPrimitive; + + function isBuffer(arg) { +- return arg instanceof Buffer; ++ return Buffer.isBuffer(arg); + } + exports.isBuffer = isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); +-} +- +- +-function pad(n) { +- return n < 10 ? '0' + n.toString(10) : n.toString(10); +-} +- +- +-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', +- 'Oct', 'Nov', 'Dec']; +- +-// 26 Feb 16:19:34 +-function timestamp() { +- var d = new Date(); +- var time = [pad(d.getHours()), +- pad(d.getMinutes()), +- pad(d.getSeconds())].join(':'); +- return [d.getDate(), months[d.getMonth()], time].join(' '); +-} +- +- +-// log is just a thin wrapper to console.log that prepends a timestamp +-exports.log = function() { +- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +-}; +- +- +-/** +- * Inherit the prototype methods from one constructor into another. +- * +- * The Function.prototype.inherits from lang.js rewritten as a standalone +- * function (not on Function.prototype). NOTE: If this file is to be loaded +- * during bootstrapping this function needs to be rewritten using some native +- * functions as prototype setup using normal JavaScript does not work as +- * expected during bootstrapping (see mirror.js in r114903). +- * +- * @param {function} ctor Constructor function which needs to inherit the +- * prototype. +- * @param {function} superCtor Constructor function to inherit prototype from. +- */ +-exports.inherits = function(ctor, superCtor) { +- ctor.super_ = superCtor; +- ctor.prototype = Object.create(superCtor.prototype, { +- constructor: { +- value: ctor, +- enumerable: false, +- writable: true, +- configurable: true +- } +- }); +-}; +- +-exports._extend = function(origin, add) { +- // Don't do anything if add isn't an object +- if (!add || !isObject(add)) return origin; +- +- var keys = Object.keys(add); +- var i = keys.length; +- while (i--) { +- origin[keys[i]] = add[keys[i]]; +- } +- return origin; +-}; +- +-function hasOwnProperty(obj, prop) { +- return Object.prototype.hasOwnProperty.call(obj, prop); +-} +- +- +-// Deprecated old stuff. +- +-exports.p = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- console.error(exports.inspect(arguments[i])); +- } +-}, 'util.p: Use console.error() instead'); +- +- +-exports.exec = exports.deprecate(function() { +- return require('child_process').exec.apply(this, arguments); +-}, 'util.exec is now called `child_process.exec`.'); +- +- +-exports.print = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(String(arguments[i])); +- } +-}, 'util.print: Use console.log instead'); +- +- +-exports.puts = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(arguments[i] + '\n'); +- } +-}, 'util.puts: Use console.log instead'); +- +- +-exports.debug = exports.deprecate(function(x) { +- process.stderr.write('DEBUG: ' + x + '\n'); +-}, 'util.debug: Use console.error instead'); +- +- +-exports.error = exports.deprecate(function(x) { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stderr.write(arguments[i] + '\n'); +- } +-}, 'util.error: Use console.error instead'); +- +- +-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { +- var callbackCalled = false; +- +- function call(a, b, c) { +- if (callback && !callbackCalled) { +- callback(a, b, c); +- callbackCalled = true; +- } +- } +- +- readStream.addListener('data', function(chunk) { +- if (writeStream.write(chunk) === false) readStream.pause(); +- }); +- +- writeStream.addListener('drain', function() { +- readStream.resume(); +- }); +- +- readStream.addListener('end', function() { +- writeStream.end(); +- }); +- +- readStream.addListener('close', function() { +- call(); +- }); +- +- readStream.addListener('error', function(err) { +- writeStream.end(); +- call(err); +- }); +- +- writeStream.addListener('error', function(err) { +- readStream.destroy(); +- call(err); +- }); +-}, 'util.pump(): Use readableStream.pipe() instead'); +- +- +-var uv; +-exports._errnoException = function(err, syscall) { +- if (isUndefined(uv)) uv = process.binding('uv'); +- var errname = uv.errname(err); +- var e = new Error(syscall + ' ' + errname); +- e.code = errname; +- e.errno = errname; +- e.syscall = syscall; +- return e; +-}; ++} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/lib/util.js new file mode 100644 index 00000000..9074e8eb --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return Buffer.isBuffer(arg); +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/package.json b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/package.json new file mode 100644 index 00000000..cb9aa927 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -0,0 +1,35 @@ +{ + "name": "core-util-is", + "version": "1.0.1", + "description": "The `util.is*` functions introduced in Node v0.12.", + "main": "lib/util.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is" + }, + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/isaacs/core-util-is", + "_id": "core-util-is@1.0.1", + "_from": "core-util-is@~1.0.0" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/util.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/util.js new file mode 100644 index 00000000..007fa105 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/core-util-is/util.js @@ -0,0 +1,106 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return arg instanceof Buffer; +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/LICENSE b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/LICENSE new file mode 100644 index 00000000..a3187cc1 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/LICENSE @@ -0,0 +1,19 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +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/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/README.md b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/README.md new file mode 100644 index 00000000..dc6fccec --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/README.md @@ -0,0 +1,40 @@ +# debuglog - backport of util.debuglog() from node v0.11 + +To facilitate using the `util.debuglog()` function that will be available when +node v0.12 is released now, this is a copy extracted from the source. + +## require('debuglog') + +Return `util.debuglog`, if it exists, otherwise it will return an internal copy +of the implementation from node v0.11. + +## debuglog(section) + +* `section` {String} The section of the program to be debugged +* Returns: {Function} The logging function + +This is used to create a function which conditionally writes to stderr +based on the existence of a `NODE_DEBUG` environment variable. If the +`section` name appears in that environment variable, then the returned +function will be similar to `console.error()`. If not, then the +returned function is a no-op. + +For example: + +```javascript +var debuglog = util.debuglog('foo'); + +var bar = 123; +debuglog('hello from foo [%d]', bar); +``` + +If this program is run with `NODE_DEBUG=foo` in the environment, then +it will output something like: + + FOO 3245: hello from foo [123] + +where `3245` is the process id. If it is not run with that +environment variable set, then it will not print anything. + +You may separate multiple `NODE_DEBUG` environment variables with a +comma. For example, `NODE_DEBUG=fs,net,tls`. diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/debuglog.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/debuglog.js new file mode 100644 index 00000000..da465c29 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/debuglog.js @@ -0,0 +1,22 @@ +var util = require('util'); + +module.exports = util.debuglog || debuglog; + +var debugs = {}; +var debugEnviron = process.env.NODE_DEBUG || ''; + +function debuglog(set) { + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = util.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/package.json b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/package.json new file mode 100644 index 00000000..f9c64a99 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/debuglog/package.json @@ -0,0 +1,30 @@ +{ + "name": "debuglog", + "version": "0.0.2", + "description": "backport of util.debuglog from node v0.11", + "license": "MIT", + "main": "debuglog.js", + "repository": { + "type": "git", + "url": "https://github.com/sam-github/node-debuglog.git" + }, + "author": { + "name": "Sam Roberts", + "email": "sam@strongloop.com" + }, + "engines": { + "node": "*" + }, + "readme": "# debuglog - backport of util.debuglog() from node v0.11\n\nTo facilitate using the `util.debuglog()` function that will be available when\nnode v0.12 is released now, this is a copy extracted from the source.\n\n## require('debuglog')\n\nReturn `util.debuglog`, if it exists, otherwise it will return an internal copy\nof the implementation from node v0.11.\n\n## debuglog(section)\n\n* `section` {String} The section of the program to be debugged\n* Returns: {Function} The logging function\n\nThis is used to create a function which conditionally writes to stderr\nbased on the existence of a `NODE_DEBUG` environment variable. If the\n`section` name appears in that environment variable, then the returned\nfunction will be similar to `console.error()`. If not, then the\nreturned function is a no-op.\n\nFor example:\n\n```javascript\nvar debuglog = util.debuglog('foo');\n\nvar bar = 123;\ndebuglog('hello from foo [%d]', bar);\n```\n\nIf this program is run with `NODE_DEBUG=foo` in the environment, then\nit will output something like:\n\n FOO 3245: hello from foo [123]\n\nwhere `3245` is the process id. If it is not run with that\nenvironment variable set, then it will not print anything.\n\nYou may separate multiple `NODE_DEBUG` environment variables with a\ncomma. For example, `NODE_DEBUG=fs,net,tls`.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/sam-github/node-debuglog/issues" + }, + "homepage": "https://github.com/sam-github/node-debuglog", + "_id": "debuglog@0.0.2", + "dist": { + "shasum": "a0e439ca87738aff3813659190fd30842ffea6f4" + }, + "_from": "debuglog@0.0.2", + "_resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/package.json b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/package.json new file mode 100644 index 00000000..49566cdb --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/package.json @@ -0,0 +1,42 @@ +{ + "name": "readable-stream", + "version": "1.1.10", + "description": "An exploration of a new kind of readable streams for Node.js", + "main": "readable.js", + "dependencies": { + "core-util-is": "~1.0.0", + "debuglog": "0.0.2" + }, + "devDependencies": { + "tap": "~0.2.6" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/readable-stream" + }, + "keywords": [ + "readable", + "stream", + "pipe" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "optionalDependencies": { + "debuglog": "0.0.2" + }, + "readme": "# readable-stream\n\nA new class of streams for Node.js\n\nThis module provides the new Stream base classes introduced in Node\nv0.10, for use in Node v0.8. You can use it to have programs that\nhave to work with node v0.8, while being forward-compatible for v0.10\nand beyond. When you drop support for v0.8, you can remove this\nmodule, and only use the native streams.\n\nThis is almost exactly the same codebase as appears in Node v0.10.\nHowever:\n\n1. The exported object is actually the Readable class. Decorating the\n native `stream` module would be global pollution.\n2. In v0.10, you can safely use `base64` as an argument to\n `setEncoding` in Readable streams. However, in v0.8, the\n StringDecoder class has no `end()` method, which is problematic for\n Base64. So, don't use that, because it'll break and be weird.\n\nOther than that, the API is the same as `require('stream')` in v0.10,\nso the API docs are reproduced below.\n\n----------\n\n Stability: 2 - Unstable\n\nA stream is an abstract interface implemented by various objects in\nNode. For example a request to an HTTP server is a stream, as is\nstdout. Streams are readable, writable, or both. All streams are\ninstances of [EventEmitter][]\n\nYou can load the Stream base classes by doing `require('stream')`.\nThere are base classes provided for Readable streams, Writable\nstreams, Duplex streams, and Transform streams.\n\n## Compatibility\n\nIn earlier versions of Node, the Readable stream interface was\nsimpler, but also less powerful and less useful.\n\n* Rather than waiting for you to call the `read()` method, `'data'`\n events would start emitting immediately. If you needed to do some\n I/O to decide how to handle data, then you had to store the chunks\n in some kind of buffer so that they would not be lost.\n* The `pause()` method was advisory, rather than guaranteed. This\n meant that you still had to be prepared to receive `'data'` events\n even when the stream was in a paused state.\n\nIn Node v0.10, the Readable class described below was added. For\nbackwards compatibility with older Node programs, Readable streams\nswitch into \"old mode\" when a `'data'` event handler is added, or when\nthe `pause()` or `resume()` methods are called. The effect is that,\neven if you are not using the new `read()` method and `'readable'`\nevent, you no longer have to worry about losing `'data'` chunks.\n\nMost programs will continue to function normally. However, this\nintroduces an edge case in the following conditions:\n\n* No `'data'` event handler is added.\n* The `pause()` and `resume()` methods are never called.\n\nFor example, consider the following code:\n\n```javascript\n// WARNING! BROKEN!\nnet.createServer(function(socket) {\n\n // we add an 'end' method, but never consume the data\n socket.on('end', function() {\n // It will never get here.\n socket.end('I got your message (but didnt read it)\\n');\n });\n\n}).listen(1337);\n```\n\nIn versions of node prior to v0.10, the incoming message data would be\nsimply discarded. However, in Node v0.10 and beyond, the socket will\nremain paused forever.\n\nThe workaround in this situation is to call the `resume()` method to\ntrigger \"old mode\" behavior:\n\n```javascript\n// Workaround\nnet.createServer(function(socket) {\n\n socket.on('end', function() {\n socket.end('I got your message (but didnt read it)\\n');\n });\n\n // start the flow of data, discarding it.\n socket.resume();\n\n}).listen(1337);\n```\n\nIn addition to new Readable streams switching into old-mode, pre-v0.10\nstyle streams can be wrapped in a Readable class using the `wrap()`\nmethod.\n\n## Class: stream.Readable\n\n\n\nA `Readable Stream` has the following methods, members, and events.\n\nNote that `stream.Readable` is an abstract class designed to be\nextended with an underlying implementation of the `_read(size)`\nmethod. (See below.)\n\n### new stream.Readable([options])\n\n* `options` {Object}\n * `highWaterMark` {Number} The maximum number of bytes to store in\n the internal buffer before ceasing to read from the underlying\n resource. Default=16kb\n * `encoding` {String} If specified, then buffers will be decoded to\n strings using the specified encoding. Default=null\n * `objectMode` {Boolean} Whether this stream should behave\n as a stream of objects. Meaning that stream.read(n) returns\n a single value instead of a Buffer of size n\n\nIn classes that extend the Readable class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### readable.\\_read(size)\n\n* `size` {Number} Number of bytes to read asynchronously\n\nNote: **This function should NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Readable\nclass methods only.\n\nAll Readable stream implementations must provide a `_read` method\nto fetch data from the underlying resource.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\nWhen data is available, put it into the read queue by calling\n`readable.push(chunk)`. If `push` returns false, then you should stop\nreading. When `_read` is called again, you should start pushing more\ndata.\n\nThe `size` argument is advisory. Implementations where a \"read\" is a\nsingle call that returns data can use this to know how much data to\nfetch. Implementations where that is not relevant, such as TCP or\nTLS, may ignore this argument, and simply provide data whenever it\nbecomes available. There is no need, for example to \"wait\" until\n`size` bytes are available before calling `stream.push(chunk)`.\n\n### readable.push(chunk)\n\n* `chunk` {Buffer | null | String} Chunk of data to push into the read queue\n* return {Boolean} Whether or not more pushes should be performed\n\nNote: **This function should be called by Readable implementors, NOT\nby consumers of Readable subclasses.** The `_read()` function will not\nbe called again until at least one `push(chunk)` call is made. If no\ndata is available, then you MAY call `push('')` (an empty string) to\nallow a future `_read` call, without adding any data to the queue.\n\nThe `Readable` class works by putting data into a read queue to be\npulled out later by calling the `read()` method when the `'readable'`\nevent fires.\n\nThe `push()` method will explicitly insert some data into the read\nqueue. If it is called with `null` then it will signal the end of the\ndata.\n\nIn some cases, you may be wrapping a lower-level source which has some\nsort of pause/resume mechanism, and a data callback. In those cases,\nyou could wrap the low-level source object by doing something like\nthis:\n\n```javascript\n// source is an object with readStop() and readStart() methods,\n// and an `ondata` member that gets called when it has data, and\n// an `onend` member that gets called when the data is over.\n\nvar stream = new Readable();\n\nsource.ondata = function(chunk) {\n // if push() returns false, then we need to stop reading from source\n if (!stream.push(chunk))\n source.readStop();\n};\n\nsource.onend = function() {\n stream.push(null);\n};\n\n// _read will be called when the stream wants to pull more data in\n// the advisory size argument is ignored in this case.\nstream._read = function(n) {\n source.readStart();\n};\n```\n\n### readable.unshift(chunk)\n\n* `chunk` {Buffer | null | String} Chunk of data to unshift onto the read queue\n* return {Boolean} Whether or not more pushes should be performed\n\nThis is the corollary of `readable.push(chunk)`. Rather than putting\nthe data at the *end* of the read queue, it puts it at the *front* of\nthe read queue.\n\nThis is useful in certain use-cases where a stream is being consumed\nby a parser, which needs to \"un-consume\" some data that it has\noptimistically pulled out of the source.\n\n```javascript\n// A parser for a simple data protocol.\n// The \"header\" is a JSON object, followed by 2 \\n characters, and\n// then a message body.\n//\n// Note: This can be done more simply as a Transform stream. See below.\n\nfunction SimpleProtocol(source, options) {\n if (!(this instanceof SimpleProtocol))\n return new SimpleProtocol(options);\n\n Readable.call(this, options);\n this._inBody = false;\n this._sawFirstCr = false;\n\n // source is a readable stream, such as a socket or file\n this._source = source;\n\n var self = this;\n source.on('end', function() {\n self.push(null);\n });\n\n // give it a kick whenever the source is readable\n // read(0) will not consume any bytes\n source.on('readable', function() {\n self.read(0);\n });\n\n this._rawHeader = [];\n this.header = null;\n}\n\nSimpleProtocol.prototype = Object.create(\n Readable.prototype, { constructor: { value: SimpleProtocol }});\n\nSimpleProtocol.prototype._read = function(n) {\n if (!this._inBody) {\n var chunk = this._source.read();\n\n // if the source doesn't have data, we don't have data yet.\n if (chunk === null)\n return this.push('');\n\n // check if the chunk has a \\n\\n\n var split = -1;\n for (var i = 0; i < chunk.length; i++) {\n if (chunk[i] === 10) { // '\\n'\n if (this._sawFirstCr) {\n split = i;\n break;\n } else {\n this._sawFirstCr = true;\n }\n } else {\n this._sawFirstCr = false;\n }\n }\n\n if (split === -1) {\n // still waiting for the \\n\\n\n // stash the chunk, and try again.\n this._rawHeader.push(chunk);\n this.push('');\n } else {\n this._inBody = true;\n var h = chunk.slice(0, split);\n this._rawHeader.push(h);\n var header = Buffer.concat(this._rawHeader).toString();\n try {\n this.header = JSON.parse(header);\n } catch (er) {\n this.emit('error', new Error('invalid simple protocol data'));\n return;\n }\n // now, because we got some extra data, unshift the rest\n // back into the read queue so that our consumer will see it.\n var b = chunk.slice(split);\n this.unshift(b);\n\n // and let them know that we are done parsing the header.\n this.emit('header', this.header);\n }\n } else {\n // from there on, just provide the data to our consumer.\n // careful not to push(null), since that would indicate EOF.\n var chunk = this._source.read();\n if (chunk) this.push(chunk);\n }\n};\n\n// Usage:\nvar parser = new SimpleProtocol(source);\n// Now parser is a readable stream that will emit 'header'\n// with the parsed header data.\n```\n\n### readable.wrap(stream)\n\n* `stream` {Stream} An \"old style\" readable stream\n\nIf you are using an older Node library that emits `'data'` events and\nhas a `pause()` method that is advisory only, then you can use the\n`wrap()` method to create a Readable stream that uses the old stream\nas its data source.\n\nFor example:\n\n```javascript\nvar OldReader = require('./old-api-module.js').OldReader;\nvar oreader = new OldReader;\nvar Readable = require('stream').Readable;\nvar myReader = new Readable().wrap(oreader);\n\nmyReader.on('readable', function() {\n myReader.read(); // etc.\n});\n```\n\n### Event: 'readable'\n\nWhen there is data ready to be consumed, this event will fire.\n\nWhen this event emits, call the `read()` method to consume the data.\n\n### Event: 'end'\n\nEmitted when the stream has received an EOF (FIN in TCP terminology).\nIndicates that no more `'data'` events will happen. If the stream is\nalso writable, it may be possible to continue writing.\n\n### Event: 'data'\n\nThe `'data'` event emits either a `Buffer` (by default) or a string if\n`setEncoding()` was used.\n\nNote that adding a `'data'` event listener will switch the Readable\nstream into \"old mode\", where data is emitted as soon as it is\navailable, rather than waiting for you to call `read()` to consume it.\n\n### Event: 'error'\n\nEmitted if there was an error receiving data.\n\n### Event: 'close'\n\nEmitted when the underlying resource (for example, the backing file\ndescriptor) has been closed. Not all streams will emit this.\n\n### readable.setEncoding(encoding)\n\nMakes the `'data'` event emit a string instead of a `Buffer`. `encoding`\ncan be `'utf8'`, `'utf16le'` (`'ucs2'`), `'ascii'`, or `'hex'`.\n\nThe encoding can also be set by specifying an `encoding` field to the\nconstructor.\n\n### readable.read([size])\n\n* `size` {Number | null} Optional number of bytes to read.\n* Return: {Buffer | String | null}\n\nNote: **This function SHOULD be called by Readable stream users.**\n\nCall this method to consume data once the `'readable'` event is\nemitted.\n\nThe `size` argument will set a minimum number of bytes that you are\ninterested in. If not set, then the entire content of the internal\nbuffer is returned.\n\nIf there is no data to consume, or if there are fewer bytes in the\ninternal buffer than the `size` argument, then `null` is returned, and\na future `'readable'` event will be emitted when more is available.\n\nCalling `stream.read(0)` will always return `null`, and will trigger a\nrefresh of the internal buffer, but otherwise be a no-op.\n\n### readable.pipe(destination, [options])\n\n* `destination` {Writable Stream}\n* `options` {Object} Optional\n * `end` {Boolean} Default=true\n\nConnects this readable stream to `destination` WriteStream. Incoming\ndata on this stream gets written to `destination`. Properly manages\nback-pressure so that a slow destination will not be overwhelmed by a\nfast readable stream.\n\nThis function returns the `destination` stream.\n\nFor example, emulating the Unix `cat` command:\n\n process.stdin.pipe(process.stdout);\n\nBy default `end()` is called on the destination when the source stream\nemits `end`, so that `destination` is no longer writable. Pass `{ end:\nfalse }` as `options` to keep the destination stream open.\n\nThis keeps `writer` open so that \"Goodbye\" can be written at the\nend.\n\n reader.pipe(writer, { end: false });\n reader.on(\"end\", function() {\n writer.end(\"Goodbye\\n\");\n });\n\nNote that `process.stderr` and `process.stdout` are never closed until\nthe process exits, regardless of the specified options.\n\n### readable.unpipe([destination])\n\n* `destination` {Writable Stream} Optional\n\nUndo a previously established `pipe()`. If no destination is\nprovided, then all previously established pipes are removed.\n\n### readable.pause()\n\nSwitches the readable stream into \"old mode\", where data is emitted\nusing a `'data'` event rather than being buffered for consumption via\nthe `read()` method.\n\nCeases the flow of data. No `'data'` events are emitted while the\nstream is in a paused state.\n\n### readable.resume()\n\nSwitches the readable stream into \"old mode\", where data is emitted\nusing a `'data'` event rather than being buffered for consumption via\nthe `read()` method.\n\nResumes the incoming `'data'` events after a `pause()`.\n\n\n## Class: stream.Writable\n\n\n\nA `Writable` Stream has the following methods, members, and events.\n\nNote that `stream.Writable` is an abstract class designed to be\nextended with an underlying implementation of the\n`_write(chunk, encoding, cb)` method. (See below.)\n\n### new stream.Writable([options])\n\n* `options` {Object}\n * `highWaterMark` {Number} Buffer level when `write()` starts\n returning false. Default=16kb\n * `decodeStrings` {Boolean} Whether or not to decode strings into\n Buffers before passing them to `_write()`. Default=true\n\nIn classes that extend the Writable class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### writable.\\_write(chunk, encoding, callback)\n\n* `chunk` {Buffer | String} The chunk to be written. Will always\n be a buffer unless the `decodeStrings` option was set to `false`.\n* `encoding` {String} If the chunk is a string, then this is the\n encoding type. Ignore chunk is a buffer. Note that chunk will\n **always** be a buffer unless the `decodeStrings` option is\n explicitly set to `false`.\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done processing the supplied chunk.\n\nAll Writable stream implementations must provide a `_write` method to\nsend data to the underlying resource.\n\nNote: **This function MUST NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Writable\nclass methods only.\n\nCall the callback using the standard `callback(error)` pattern to\nsignal that the write completed successfully or with an error.\n\nIf the `decodeStrings` flag is set in the constructor options, then\n`chunk` may be a string rather than a Buffer, and `encoding` will\nindicate the sort of string that it is. This is to support\nimplementations that have an optimized handling for certain string\ndata encodings. If you do not explicitly set the `decodeStrings`\noption to `false`, then you can safely ignore the `encoding` argument,\nand assume that `chunk` will always be a Buffer.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n\n### writable.write(chunk, [encoding], [callback])\n\n* `chunk` {Buffer | String} Data to be written\n* `encoding` {String} Optional. If `chunk` is a string, then encoding\n defaults to `'utf8'`\n* `callback` {Function} Optional. Called when this chunk is\n successfully written.\n* Returns {Boolean}\n\nWrites `chunk` to the stream. Returns `true` if the data has been\nflushed to the underlying resource. Returns `false` to indicate that\nthe buffer is full, and the data will be sent out in the future. The\n`'drain'` event will indicate when the buffer is empty again.\n\nThe specifics of when `write()` will return false, is determined by\nthe `highWaterMark` option provided to the constructor.\n\n### writable.end([chunk], [encoding], [callback])\n\n* `chunk` {Buffer | String} Optional final data to be written\n* `encoding` {String} Optional. If `chunk` is a string, then encoding\n defaults to `'utf8'`\n* `callback` {Function} Optional. Called when the final chunk is\n successfully written.\n\nCall this method to signal the end of the data being written to the\nstream.\n\n### Event: 'drain'\n\nEmitted when the stream's write queue empties and it's safe to write\nwithout buffering again. Listen for it when `stream.write()` returns\n`false`.\n\n### Event: 'close'\n\nEmitted when the underlying resource (for example, the backing file\ndescriptor) has been closed. Not all streams will emit this.\n\n### Event: 'finish'\n\nWhen `end()` is called and there are no more chunks to write, this\nevent is emitted.\n\n### Event: 'pipe'\n\n* `source` {Readable Stream}\n\nEmitted when the stream is passed to a readable stream's pipe method.\n\n### Event 'unpipe'\n\n* `source` {Readable Stream}\n\nEmitted when a previously established `pipe()` is removed using the\nsource Readable stream's `unpipe()` method.\n\n## Class: stream.Duplex\n\n\n\nA \"duplex\" stream is one that is both Readable and Writable, such as a\nTCP socket connection.\n\nNote that `stream.Duplex` is an abstract class designed to be\nextended with an underlying implementation of the `_read(size)`\nand `_write(chunk, encoding, callback)` methods as you would with a Readable or\nWritable stream class.\n\nSince JavaScript doesn't have multiple prototypal inheritance, this\nclass prototypally inherits from Readable, and then parasitically from\nWritable. It is thus up to the user to implement both the lowlevel\n`_read(n)` method as well as the lowlevel `_write(chunk, encoding, cb)` method\non extension duplex classes.\n\n### new stream.Duplex(options)\n\n* `options` {Object} Passed to both Writable and Readable\n constructors. Also has the following fields:\n * `allowHalfOpen` {Boolean} Default=true. If set to `false`, then\n the stream will automatically end the readable side when the\n writable side ends and vice versa.\n\nIn classes that extend the Duplex class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n## Class: stream.Transform\n\nA \"transform\" stream is a duplex stream where the output is causally\nconnected in some way to the input, such as a zlib stream or a crypto\nstream.\n\nThere is no requirement that the output be the same size as the input,\nthe same number of chunks, or arrive at the same time. For example, a\nHash stream will only ever have a single chunk of output which is\nprovided when the input is ended. A zlib stream will either produce\nmuch smaller or much larger than its input.\n\nRather than implement the `_read()` and `_write()` methods, Transform\nclasses must implement the `_transform()` method, and may optionally\nalso implement the `_flush()` method. (See below.)\n\n### new stream.Transform([options])\n\n* `options` {Object} Passed to both Writable and Readable\n constructors.\n\nIn classes that extend the Transform class, make sure to call the\nconstructor so that the buffering settings can be properly\ninitialized.\n\n### transform.\\_transform(chunk, encoding, callback)\n\n* `chunk` {Buffer | String} The chunk to be transformed. Will always\n be a buffer unless the `decodeStrings` option was set to `false`.\n* `encoding` {String} If the chunk is a string, then this is the\n encoding type. (Ignore if `decodeStrings` chunk is a buffer.)\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done processing the supplied chunk.\n\nNote: **This function MUST NOT be called directly.** It should be\nimplemented by child classes, and called by the internal Transform\nclass methods only.\n\nAll Transform stream implementations must provide a `_transform`\nmethod to accept input and produce output.\n\n`_transform` should do whatever has to be done in this specific\nTransform class, to handle the bytes being written, and pass them off\nto the readable portion of the interface. Do asynchronous I/O,\nprocess things, and so on.\n\nCall `transform.push(outputChunk)` 0 or more times to generate output\nfrom this input chunk, depending on how much data you want to output\nas a result of this chunk.\n\nCall the callback function only when the current chunk is completely\nconsumed. Note that there may or may not be output as a result of any\nparticular input chunk.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n### transform.\\_flush(callback)\n\n* `callback` {Function} Call this function (optionally with an error\n argument) when you are done flushing any remaining data.\n\nNote: **This function MUST NOT be called directly.** It MAY be implemented\nby child classes, and if so, will be called by the internal Transform\nclass methods only.\n\nIn some cases, your transform operation may need to emit a bit more\ndata at the end of the stream. For example, a `Zlib` compression\nstream will store up some internal state so that it can optimally\ncompress the output. At the end, however, it needs to do the best it\ncan with what is left, so that the data will be complete.\n\nIn those cases, you can implement a `_flush` method, which will be\ncalled at the very end, after all the written data is consumed, but\nbefore emitting `end` to signal the end of the readable side. Just\nlike with `_transform`, call `transform.push(chunk)` zero or more\ntimes, as appropriate, and call `callback` when the flush operation is\ncomplete.\n\nThis method is prefixed with an underscore because it is internal to\nthe class that defines it, and should not be called directly by user\nprograms. However, you **are** expected to override this method in\nyour own extension classes.\n\n### Example: `SimpleProtocol` parser\n\nThe example above of a simple protocol parser can be implemented much\nmore simply by using the higher level `Transform` stream class.\n\nIn this example, rather than providing the input as an argument, it\nwould be piped into the parser, which is a more idiomatic Node stream\napproach.\n\n```javascript\nfunction SimpleProtocol(options) {\n if (!(this instanceof SimpleProtocol))\n return new SimpleProtocol(options);\n\n Transform.call(this, options);\n this._inBody = false;\n this._sawFirstCr = false;\n this._rawHeader = [];\n this.header = null;\n}\n\nSimpleProtocol.prototype = Object.create(\n Transform.prototype, { constructor: { value: SimpleProtocol }});\n\nSimpleProtocol.prototype._transform = function(chunk, encoding, done) {\n if (!this._inBody) {\n // check if the chunk has a \\n\\n\n var split = -1;\n for (var i = 0; i < chunk.length; i++) {\n if (chunk[i] === 10) { // '\\n'\n if (this._sawFirstCr) {\n split = i;\n break;\n } else {\n this._sawFirstCr = true;\n }\n } else {\n this._sawFirstCr = false;\n }\n }\n\n if (split === -1) {\n // still waiting for the \\n\\n\n // stash the chunk, and try again.\n this._rawHeader.push(chunk);\n } else {\n this._inBody = true;\n var h = chunk.slice(0, split);\n this._rawHeader.push(h);\n var header = Buffer.concat(this._rawHeader).toString();\n try {\n this.header = JSON.parse(header);\n } catch (er) {\n this.emit('error', new Error('invalid simple protocol data'));\n return;\n }\n // and let them know that we are done parsing the header.\n this.emit('header', this.header);\n\n // now, because we got some extra data, emit this first.\n this.push(b);\n }\n } else {\n // from there on, just provide the data to our consumer as-is.\n this.push(b);\n }\n done();\n};\n\nvar parser = new SimpleProtocol();\nsource.pipe(parser)\n\n// Now parser is a readable stream that will emit 'header'\n// with the parsed header data.\n```\n\n\n## Class: stream.PassThrough\n\nThis is a trivial implementation of a `Transform` stream that simply\npasses the input bytes across to the output. Its purpose is mainly\nfor examples and testing, but there are occasionally use cases where\nit can come in handy.\n\n\n[EventEmitter]: events.html#events_class_events_eventemitter\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/readable-stream/issues" + }, + "homepage": "https://github.com/isaacs/readable-stream", + "_id": "readable-stream@1.1.10", + "_from": "readable-stream@~1.1.9" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/passthrough.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/passthrough.js new file mode 100644 index 00000000..27e8d8a5 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/readable.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/readable.js new file mode 100644 index 00000000..09b8bf50 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/readable.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = require('stream'); +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/transform.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/transform.js new file mode 100644 index 00000000..5d482f07 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/writable.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/writable.js new file mode 100644 index 00000000..e1e9efdf --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/.npmignore b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/README.md b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/README.md new file mode 100644 index 00000000..8d6a1928 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/README.md @@ -0,0 +1,14 @@ +# stream-counter + +Keep track of how many bytes have been written to a stream. + +## Usage + +```js +var StreamCounter = require('stream-counter'); +var counter = new StreamCounter(); +counter.on('progress', function() { + console.log("progress", counter.bytes); +}); +fs.createReadStream('foo.txt').pipe(counter); +``` diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/index.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/index.js new file mode 100644 index 00000000..c490c2db --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/index.js @@ -0,0 +1,16 @@ +module.exports = ByteCounter; + +var Writable = require('readable-stream').Writable; +var util = require('util'); + +util.inherits(ByteCounter, Writable); +function ByteCounter(options) { + Writable.call(this, options); + this.bytes = 0; +} + +ByteCounter.prototype._write = function(chunk, encoding, cb) { + this.bytes += chunk.length; + this.emit('progress'); + cb(); +}; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/package.json b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/package.json new file mode 100644 index 00000000..1453933a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/package.json @@ -0,0 +1,32 @@ +{ + "name": "stream-counter", + "version": "0.2.0", + "description": "keeps track of how many bytes have been written to a stream", + "main": "index.js", + "scripts": { + "test": "node test/test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/superjoe30/node-stream-counter.git" + }, + "author": { + "name": "Andrew Kelley", + "email": "superjoe30@gmail.com" + }, + "license": "BSD", + "engines": { + "node": ">=0.8.0" + }, + "dependencies": { + "readable-stream": "~1.1.8" + }, + "readme": "# stream-counter\n\nKeep track of how many bytes have been written to a stream.\n\n## Usage\n\n```js\nvar StreamCounter = require('stream-counter');\nvar counter = new StreamCounter();\ncounter.on('progress', function() {\n console.log(\"progress\", counter.bytes);\n});\nfs.createReadStream('foo.txt').pipe(counter);\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/superjoe30/node-stream-counter/issues" + }, + "homepage": "https://github.com/superjoe30/node-stream-counter", + "_id": "stream-counter@0.2.0", + "_from": "stream-counter@~0.2.0" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.js b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.js new file mode 100644 index 00000000..0da95660 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.js @@ -0,0 +1,20 @@ +var ByteCounter = require('../'); +var fs = require('fs'); +var path = require('path'); +var assert = require('assert'); + +var counter = new ByteCounter(); +var remainingTests = 2; +counter.once('progress', function() { + assert.strictEqual(counter.bytes, 5); + remainingTests -= 1; +}); +var is = fs.createReadStream(path.join(__dirname, 'test.txt')); +is.pipe(counter); +is.on('end', function() { + remainingTests -= 1; + assert.strictEqual(counter.bytes, 5); +}); +process.on('exit', function() { + assert.strictEqual(remainingTests, 0); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.txt b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.txt new file mode 100644 index 00000000..81c545ef --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/stream-counter/test/test.txt @@ -0,0 +1 @@ +1234 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/package.json b/node_modules/express/node_modules/connect/node_modules/multiparty/package.json new file mode 100644 index 00000000..a1d429c7 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/package.json @@ -0,0 +1,47 @@ +{ + "name": "multiparty", + "version": "2.2.0", + "description": "multipart/form-data parser which supports streaming", + "repository": { + "type": "git", + "url": "git@github.com:superjoe30/node-multiparty.git" + }, + "keywords": [ + "file", + "upload", + "formidable", + "stream", + "s3" + ], + "devDependencies": { + "findit": "0.1.1", + "hashish": "0.0.4", + "mocha": "~1.8.2", + "request": "~2.16.6", + "mkdirp": "~0.3.5", + "superagent": "~0.14.1" + }, + "scripts": { + "test": "ulimit -n 500 && mocha --timeout 4000 --reporter spec --recursive test/test.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "license": "MIT", + "dependencies": { + "readable-stream": "~1.1.9", + "stream-counter": "~0.2.0" + }, + "readme": "[![Build Status](https://travis-ci.org/superjoe30/node-multiparty.png?branch=master)](https://travis-ci.org/superjoe30/node-multiparty)\n# multiparty\n\nParse http requests with content-type `multipart/form-data`, also known as file uploads.\n\nSee also [busboy](https://github.com/mscdex/busboy) - a\n[faster](https://github.com/mscdex/dicer/wiki/Benchmarks) alternative\nwhich may be worth looking into.\n\n### Why the fork?\n\n * This module uses the Node.js v0.10 streams properly, *even in Node.js v0.8*\n * It will not create a temp file for you unless you want it to.\n * Counts bytes and does math to help you figure out the `Content-Length` of\n each part.\n * You can easily stream uploads to s3 with\n [knox](https://github.com/LearnBoost/knox), for [example](examples/s3.js).\n * Less bugs. This code is simpler, has all deprecated functionality removed,\n has cleaner tests, and does not try to do anything beyond multipart stream\n parsing.\n\n## Installation\n\n```\nnpm install multiparty\n```\n\n## Usage\n\n * See [examples](examples).\n\nParse an incoming `multipart/form-data` request.\n\n```js\nvar multiparty = require('multiparty')\n , http = require('http')\n , util = require('util')\n\nhttp.createServer(function(req, res) {\n if (req.url === '/upload' && req.method === 'POST') {\n // parse a file upload\n var form = new multiparty.Form();\n\n form.parse(req, function(err, fields, files) {\n res.writeHead(200, {'content-type': 'text/plain'});\n res.write('received upload:\\n\\n');\n res.end(util.inspect({fields: fields, files: files}));\n });\n\n return;\n }\n\n // show a file upload form\n res.writeHead(200, {'content-type': 'text/html'});\n res.end(\n '
    '+\n '
    '+\n '
    '+\n ''+\n '
    '\n );\n}).listen(8080);\n```\n\n## API\n\n### multiparty.Form\n```js\nvar form = new multiparty.Form(options)\n```\nCreates a new form. Options:\n\n * `encoding` - sets encoding for the incoming form fields. Defaults to `utf8`.\n * `maxFieldSize` - Limits the amount of memory a field (not a file) can\n allocate in bytes. If this value is exceeded, an `error` event is emitted.\n The default size is 2MB.\n * `maxFields` - Limits the number of fields that will be parsed before\n emitting an `error` event. A file counts as a field in this case.\n Defaults to 1000.\n * `autoFields` - Enables `field` events. This is automatically set to `true`\n if you add a `field` listener.\n * `autoFiles` - Enables `file` events. This is automatically set to `true`\n if you add a `file` listener.\n * `uploadDir` - Only relevant when `autoFiles` is `true`. The directory for\n placing file uploads in. You can move them later using `fs.rename()`.\n Defaults to `os.tmpDir()`.\n * `hash` - Only relevant when `autoFiles` is `true`. If you want checksums\n calculated for incoming files, set this to either `sha1` or `md5`.\n Defaults to off.\n\n#### form.parse(request, [cb])\n\nParses an incoming node.js `request` containing form data. If `cb` is\nprovided, `autoFields` and `autoFiles` are set to `true` and all fields and\nfiles are collected and passed to the callback:\n\n```js\nform.parse(req, function(err, fieldsObject, filesObject, fieldsList, filesList) {\n // ...\n});\n```\n\nIt is often convenient to access a field or file by name. In this situation,\nuse `fieldsObject` or `filesObject`. However sometimes, as in the case of a\n`` the multipart stream will contain\nmultiple files of the same input name, and you are interested in all of them.\nIn this case, use `filesList`.\n\nAnother example is when you do not care what the field name of a file is; you\nare merely interested in a single upload. In this case, set `maxFields` to 1\n(assuming no other fields expected besides the file) and use `filesList[0]`.\n\n#### form.bytesReceived\n\nThe amount of bytes received for this form so far.\n\n#### form.bytesExpected\n\nThe expected number of bytes in this form.\n\n### Events\n\n#### 'error' (err)\n\nYou definitely want to handle this event. If not your server *will* crash when\nusers submit bogus multipart requests!\n\n#### 'part' (part)\n\nEmitted when a part is encountered in the request. `part` is a\n`ReadableStream`. It also has the following properties:\n\n * `headers` - the headers for this part. For example, you may be interested\n in `content-type`.\n * `name` - the field name for this part\n * `filename` - only if the part is an incoming file\n * `byteOffset` - the byte offset of this part in the request body\n * `byteCount` - assuming that this is the last part in the request,\n this is the size of this part in bytes. You could use this, for\n example, to set the `Content-Length` header if uploading to S3.\n If the part had a `Content-Length` header then that value is used\n here instead.\n\n#### 'aborted'\n\nEmitted when the request is aborted. This event will be followed shortly\nby an `error` event. In practice you do not need to handle this event.\n\n#### 'progress' (bytesReceived, bytesExpected)\n\n#### 'close'\n\nEmitted after all parts have been parsed and emitted. Not emitted if an `error`\nevent is emitted. This is typically when you would send your response.\n\n#### 'file' (name, file)\n\n**By default multiparty will not touch your hard drive.** But if you add this\nlistener, multiparty automatically sets `form.autoFiles` to `true` and will\nstream uploads to disk for you. \n\n * `name` - the field name for this file\n * `file` - an object with these properties:\n - `fieldName` - same as `name` - the field name for this file\n - `originalFilename` - the filename that the user reports for the file\n - `path` - the absolute path of the uploaded file on disk\n - `headers` - the HTTP headers that were sent along with this file\n - `size` - size of the file in bytes\n\nIf you set the `form.hash` option, then `file` will also contain a `hash`\nproperty which is the checksum of the file.\n\n#### 'field' (name, value)\n\n * `name` - field name\n * `value` - string field value\n\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/superjoe30/node-multiparty/issues" + }, + "homepage": "https://github.com/superjoe30/node-multiparty", + "_id": "multiparty@2.2.0", + "dist": { + "shasum": "6f771955f8cffe3d08937a9592db04e1573bfb34" + }, + "_from": "multiparty@2.2.0", + "_resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/bench-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/bench-multipart-parser.js new file mode 100644 index 00000000..ee5dbad4 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/bench-multipart-parser.js @@ -0,0 +1,76 @@ +var assert = require('assert') + , Form = require('../').Form + , boundary = '-----------------------------168072824752491622650073' + , mb = 100 + , buffer = createMultipartBuffer(boundary, mb * 1024 * 1024) + +var callbacks = { + partBegin: -1, + partEnd: -1, + headerField: -1, + headerValue: -1, + partData: -1, + end: -1, +}; + +var form = new Form({ boundary: boundary }); + +hijack('onParseHeaderField', function() { + callbacks.headerField++; +}); + +hijack('onParseHeaderValue', function() { + callbacks.headerValue++; +}); + +hijack('onParsePartBegin', function() { + callbacks.partBegin++; +}); + +hijack('onParsePartData', function() { + callbacks.partData++; +}); + +hijack('onParsePartEnd', function() { + callbacks.partEnd++; +}); + +form.on('finish', function() { + callbacks.end++; +}); + +var start = new Date(); +form.write(buffer, function(err) { + var duration = new Date() - start; + assert.ifError(err); + var mbPerSec = (mb / (duration / 1000)).toFixed(2); + console.log(mbPerSec+' mb/sec'); +}); + +process.on('exit', function() { + for (var k in callbacks) { + assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]); + } +}); + +function createMultipartBuffer(boundary, size) { + var head = + '--'+boundary+'\r\n' + + 'content-disposition: form-data; name="field1"\r\n' + + '\r\n' + , tail = '\r\n--'+boundary+'--\r\n' + , buffer = new Buffer(size); + + buffer.write(head, 'ascii', 0); + buffer.write(tail, 'ascii', buffer.length - tail.length); + return buffer; +} + +function hijack(name, fn) { + var oldFn = form[name]; + form[name] = function() { + fn(); + return oldFn.apply(this, arguments); + }; +} + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/beta-sticker-1.png b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/beta-sticker-1.png new file mode 100644 index 0000000000000000000000000000000000000000..20b1a7f177927900e120c24f97d9514d3325873f GIT binary patch literal 1660 zcmV-?27~#DP)3JV+!|TB%7InihJI zi%oiz5`4wPD(5TE#Clfmyz`#@W}LZ>>+E@k7CP{;vvaq*zx`hGeT&flY)Jpowfx+# zF#k`0B<>n%i|hRykUvy7X`3KSRI;Na0P)F={!qZAZGfn#s5xQh>_6;*UJByn#3z8; zG&CW=u!m}>XtDJ5^&Lz}N!jo9dR0E3PxAZM?>|01e)rh1V|QTc0daHUp~B#VJ|+c$ z;XyEjuBD}APenz=$*8EP!zz_ZPwq%T_@l?;Sy@U2uTeogKh9w7xlft=0P-+D;F|CAOxNsr& z`0?ZCqobn_OVT=js7E~Dx~$^j;{27BmEZ2&yJwd<{w80N12M-XFc&Xg%q=Y~?bYdY zN&Lft0f^SZ!or>{C@3g>^5ltWXlTgBMW0XZPildwh`-d<*2Xt9G@K6=Mg+yr!RK^& zd3iZzvw2{Ce%{GNpPz%;;6u!BbRdxv6BDh>XF~NCr8WNi!Gj0i6c!eK1gA?N%OI=N z*@-`?1R<_%ZEf8XA0J;AibjHIPri;vdU|?!Wo2awOe3&0sYL<_Rt`kMyt=yju_I%p$sD z`kl=G0ewW)@i_mv3EjOtMdtIfR`koyQ}ADh5N_YTed!cN!)Zv;$irT**FVQD#8H9g zEJ}JWo5}IBmhVyTjWsei^kRN0XkrrG{B9WOqasj7)-H4ow3Bym52`qt zi;9k9qM}za&N@qBK25$TUa5SX`58OVQ%hB65t z9_PADXnDzj%4>4a-N8u_jHtW`MAn8XZ*FexzEWu4F-@RyLpwRocwrZ+f4vYDANT|r zUiy^y5eEFAsUJO`m56=-v%UM~SLDCUk9Z$?`0(MBXg}lg5BB&Sr%#{GICJKVk-Y`f zI*8BK^2{6RxqPj@zP|4I_3PuX^e4^Qc;j{PKw6qTqhV(@X|>u!48v|9a`dN#vD@vB zp}2bumKLcj(bB}N;&xiL^SYsixeApaayT5wX0zcNAg9xb+-^6~7y}jMnNY^?@bFKv zVl7bKs%3eI)Iw8JQ1ngUVCbY;S>d$fmYYn} zefno-XPup$ohHzjF*`f^835ZI9v)7hu*NVH_AC5AwOWmfFh#RjtyT+E5of_vRtjU| zY9SAMrdpxnL|k9x85tQ_0yPgpaW#;ipP!bLl(Z9~FrY2$SET$@fSQ?^F;`VpogEt+ z`-6kwwc{0)ut=f%^s*icZfI?9Z@&q<^>|uZT4F*%!cGjsw1i=xQV2i+ti8X#|BI56 zk}qYNVZP(yVEn<_Aby|G(4?uOMHS9fkyx6WoA=k$)HFcdy&IblYYkv=s;~?U3|wt% zYr75FU8E1UbK>AyA>UR&q855X!$^y(2r4_ERVst%(?Ysffb2UlIy$;U-`+*d;^4%| z`Hfe!b%fg6t2vGFVBu7BoC~lv+QoIPYl39x52bTeYPWea@?Z>3!vXn%^!7d_nC*Ta zQUX)U3Uz)f^2ok~__q39^fX`4Bn9V}WI+C>`9Acw00RIQn|MJlIvG3w0000C3%>5t zidr%inNpJrrOWk}o?bo`LL3TPGX8LmGr|Nex)~wfXj5t5$CAq--YK`!ZrA66XG4Cp zNAorG(h%OxqAiuau^-NH&_!(J^LR0~)=HZ(o`*BhTmP2vf46?}{IFN8_QblI zaR`~MHq*UKQ*|Hoq3fAlfBP>300000000000000000000z<=}(t;CCo04M+egQt(w literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/blank.gif b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..75b945d2553848b8b6f41fe5e24599c0687b8472 GIT binary patch literal 49 zcmZ?wbhEHbWMp7unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNY>Fh|Ltj$Y2csQN9XW literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/funkyfilename.txt b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/funkyfilename.txt new file mode 100644 index 00000000..e7a4785e --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/funkyfilename.txt @@ -0,0 +1 @@ +I am a text file with a funky name! diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/menu_separator.png b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/menu_separator.png new file mode 100644 index 0000000000000000000000000000000000000000..1c16a71ed41bb17dabbf11eeecc76f3ca03d3f24 GIT binary patch literal 931 zcmaJ=&u-H&9L|6Pnly1_aI&&1P3)vyR;ytuO~)cgRkamVTp&%{HtHN_iA&QS;e-U- zd5OKiBqk0Vcm-}q+!2BY!0wuk10|AU|E%x(et-R@-FmpQeRo??lpXij>4^QBSi3jn z|M`dW_hP%ln|T35jm!Y8(R8C2hEg9b|psA#Yhz#$%-Nz4mwc*Qk0a^)z{ zM0j>c8oeapQOYP-ri`P_vA~UbD{iV?FpJ7So=J zv7UUR7vf3WcAa`J|2jDR{`=RvpM!z&`qQJW8@tM_v#pO$-hO^2pN-pWIcE=Ey!r!8 CR~}#h literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/pf1y5.png b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/pf1y5.png new file mode 100644 index 0000000000000000000000000000000000000000..44d601759608a9f9de35e3d2debad76116897e15 GIT binary patch literal 768323 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 z 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:RtsnTM-Q&7P!;N2$3}|()Qu{mlrM-nVjO+d-31e$r zui!u5ewnkUfh$D9jVSm;M@?C<(}mRAXWOA_)h@BXe4})PWZc>X)gp%B9ab-Gw7qwH z;252-1Q^BG0f@MopbSF_hg2fCOJ=|PfcBqN_$?l4UI`AeEF-?;j+IQPlxCU(pPq_x z(lp=6TwfOqq&KSUr>(Bna79i_e)}M=q>>@}L1N0s>#XkoM$!U$R?!iygyX8n2Mw7; z<4OtvW$o;R4T8cLc7sHKZYK8tmy>S+gA!nT?2;C#4v635l2HWs9Pf{ZM&`(JeH>cl z54V3y9fM`rTaBaGz-;esq}lg^(DkGeKd!#KGxk_Y-47f5MYdyx$=#{sj7vD3U^atg1XuJDWs}2pUQHZ z9Z!EI2NX!f;rsb|Mm$o;qEOah&xPjvM>y00+x-j3B(#jpd+dF=?ykd8Ahst1{!nmTBB{Hadnf zMzD^`qRKVZj`W60 zxet7t(I;odUbPON{!ZeWC2s~iz1yU*7$JI87N6-6LnpM-ez_sdenEa**Byta5ns9q zPvV;JWnT*>010dwxh?_`YKSP#o=1xf`?jyi|V*Qqa;4ZJ~Z7DALklC<*a!q*9FC0!GKpvBSCX!QG(I zuG7BQjzp&~EKFe!O1KLXf4$@88YmFWU44qCN(B!FAQh6z9N*_(bq}FIe3|S5W~FTx z<7YrLH#h!_^baYGS~!%2J9+<7IDD6!-kqIf&i(y0Dx!f@RD)m5M3{Oj_74Wunx_oBnEu9UdaKht#XW!Tr_cL$xY`g_%mPjniK-!(h6kau#gc5n;@(*SMuTl*sH zaJ*|(K1@jQ481Rrw`OWGHxIBjSRGIq;NX|R>O))2QxHc0o^*q6@?&xX9CPt_HOprz{~AI>Or!(F z#KhQ0fTBOjst><_j?F;6OkgJMC?i7~ef&P+Z^ST1*l;oyS{`|Ff85+&XdbdTtMp;! zrkbcj6q%d@tjgt9$LH@!<`!@7oxwTsX(zu^5$NGk2uVxY=FzhJ4-KO$DHYoJX;=~S zcpV}Xym#gC6zN{2G)BH_-H38l+97|dPP#(Fm8yEELsf~OflXoWSLjC z17Fqe*_vd!Ze5h_7g8Hl0dBHFCc#g>nkL$81BE2xwnFb_ixqr615DYG^1W74^O!?Ct+%wQ-H;D~BwfNoMg4>>3eW zxT@YJn@oEckpKEJFzV1-)n|leEeXf)@Hl_y*~TI*8I&Uy5@ss(SW^WYM320Izh|Rg zH;o{Bu^m`kP78_fd8RZIui6v~Cytb76xKb8CbmpR(Q4JQmtjzr7q_#q4K z2jiw2GDSmLyBk4;a3`9Xk^wQLI-2C7WWIdJgOH>^6initLJ7rGDrm@Lqb1T$RPAy^ zp7d)4Pz^Cg0$er{q)Q4rs;d_zPYK5i9vr%yvC;$!Z?F~24Z<63(uS&1m97$CMf_%F zU>4OwLcRKe1oQ7J%v{Ir=W+l}l4#uOgFfM7f6Na=S>R@@Wn{+W(T}AvQ12t`^_>GH z!aP+^ihJR#*{o4Mg2djZJ-EcoIS^BquEui-0!{-+(|AiIooqlIZgQxMvh1IfYS$TC z*SH+c6Qp29KaSB@uwXkjsEY~?4_LDUP4LT&k}wU<2F^ib@7s3vGha>hw5od@3!r`& zFED-^XIuFcQ!)sMCLohZN5V&S@`~&(5CguvQrw@ar<6ACMXKtvhxTLX(_n2d-6Un} zI$+6vH(Qb#{brAhjtZYg*m>13dO?-EH!CcQ;^@=o>*f(a;t%T+p_!jsS{fTj)L;@k zVhpW(QI#QSiCJ2ts+gDN40>WgcZ4NrXd22a!Wzw>A1J|SC>4()y^+R%&jGM!4KcEn87#Nvp5q0fC>rYZJY+`D z{8#<`--ywDvRRll|Ni>8Me(dzt96p)pBYH^I%iQqajkhEZqw9eQ**uj-84PFc}MrY z8`}Yn2LZ*KQpr1VfF+`)WYw2NIoc(U-@d4`XI^5S7wGw9eV+*~nQWEy8wT1+Q* zTST|jmA&`k|1eNSfHR31e5M<&t7~Eh#Sf`=x86RLewuOPr+KrMM_+K&aJ@`;>7!D z*?wOODT+sc;5Yh{G5=RFmyJ6wR8}x~)jtSNc8dsjKvw6d=IUp56ptX!rsR9;fNq2< zM%`1vHC^r>;hx`^QWzvXfH%A!C{Kvu2TEGMSsS4V&s*C^KDORbA(SlrclpHN3t-wb zasrBF^vi0iW86gOR@YcHr)AP7@aRx{=wgD00c|iWX)oLMjO+Kzxo6SyIx&$X3b6E) z-*Q%~VxnJ{%{QCk8b#A7eamh+3)(z_ftJt(c}qZBW#U%^H*OzZq>0R3O$OxTn(U%z zZl}fTlD|P*@u91qa(F+tx8Bzmn0U7LXCm-2`*hnMj*-Zf9~449^*-3@ia_iGlS_oT zfwYk_9&3m|$EZwPlC@Gm%LM)3q=*G&YA1GV*O&~CwDvio4XU!)Uo+Ca<7XN@P9>$h zhSz1q)f*g%KWhpCj0hXj$?+5xHmN_=J-oU09hF6;T3cXJLp-cm*^$|}24b0r(MY0s zBK%@L#24F=FrhcY-y|^1hI7-~7vhq@wUI*KhW%P6zQlnQXBej+@8!vm-2w$%29>}s zo?z17MnbXRoUH^~67lf4zb#p3VCfcD>6o zAz?^W_X}X~E=3e;Wm!h@cklbvU{7^S(1)lGB15G1?}tv4-`y1q%n`Is&pwL9Pn6u#)WsT1lPyS^a8T;Z4f2m;KCR<)h|XW0z5&pZiVD^Q!4U&92h_p=gwzP?0@Q{4Z?+xkw+|E{1g$ z7u52=->Bq3z{w*+VmCrGZU)3Xkz0`9y?X~o^CRk1$KvRO>6+CwqF9(>f_lqLU&queV3*=TA;+G_C`jS$*k=)k)K`(~Ej ze`8u-p{epgVjB2RLUqYklW&o>TSA7pN(UGP!zCl(*v`@N_;vg@@X!FH&-Z9Ce`-^R-7cCQqijkj^lr zHyT8~04j-PC})q3YiBMES}tEV|1eHqN1q5=1`hXG-H|=LD=2!USLqDj_+e!FS9Su= zhLi>1rD^KXDIZ2QPJ4(He?5+{UuxmBEI{h)E(?;R3F}K>X60Ne<*(L^qHE`@liFgw zf_%S#%v*3#CMPI0bKdm(Wl%pMrD$r7(F?OC*CCCdJB*jE?}r_oN&Fe+0So`Tb^D)}fb$a&fD@m(XQEai`sG~2+Yynb z@h(Eh?Wf@Dp~B3AYLNm4eY(mr$F*?8FN%5%?X=*KPnlo#yIy+;m z%AdrQ{@7C&O+r;c8{THrl;0+7fi3$!>J4H`FsSrL-wN_#Gdm;Ik>_Z5YnVy1(DV;Bfj2-;c+LlhmKVGu^*b7jyu^{}(t}1`4Qr=QqN` zj8PUHsI4CztdF5TXg8Q2*Gzu>AcY@=jvXrv6%=Pe3|SHjwTluXvuo(uH)S6e8$u4_ z+7vAL{4plbxM09*HX$d%IIQ$<*FaV;4osa!dZ7^AWFO zOBR-s3Sgy8^bD%+`x`UYEK^q&$;vB__BYf~;$lIz%!&Oft{{+QK3% z=e9Ul?7OnYg!darCksen1&o+8`MrzUBj9kcuz^*8C*llncayNfo3)M%9k^&5e)Kr1 zu0Lfgq)RMVWlj><7rP;Gsp6s$Dcp1Db;tP**aRb!ypf4~;$n`fEMz$i;lZ^?SYAxf zHW_4#rI=~7;*~gfQ5g{C*6$>g{!t+AE@iK~MC@<$Eg@tr2-3@&=EEKp4_{)*3qz>4OqY%y=?h6W}t?Te8AJ*-*2q>dogA~CP{e^D-Pg{5Eg;`O8H z&jKxN{ikVAY5@#CleoEs(K}ewo^kNSA}~4FH@WfKy!`;G&z-|j3LnA}Y4rjt=Q}XW zPNdia*C8dUazrIxIOlx5siDvQ&5h>E5uK^ZtVu|~?~6}!qNR>hDXnkL189FF-RSGi zx-Kh|d^UyeMsPE6)OX|Y0)0>z581qzhnZpB@KYmwqo+}&M*2X_hX?h=A~!p(Qj{m#1oldR-< zpUlkOvuBV0EZx@gXL=vGupf4>R=*exjVQ!}@*|T|>2)Pz+ch}#|GqcXCjUg{yw5RR zjO6lP!uw-hsCC)cNt+$`|MNoBt6^UlB9KbScg|$z}n0r zVXB1Im0(F_x-c*vF{?Hx>rmgv0K4 zN8G4%JXouzdMdRy)46x(dRQ#u*ExTCk^CpZP^aNvD>I|MVrjkCy^OxgavCNEJuV-3 zHQD^kTKJM|>ab(psr*yr0V)Wh{=`70I4g1b2cPd~dia`j{XV+Cd;)eO2*TgnRyGc( z8cZwS#Y@y8cKY2bcZu;g91&{&M6orp{c_Z1^ANev*{yaRJwDOj#*j+E8?q^xQntmc zR3YD_>tZx**RYB`6!QM2`CCT|gtY(=)rz-WQ)=3IrJQ`R?k%}js4zQBHo>^HDn)^U zvDscbCH%UV3@MOLf!bRJ9S0%*coateuwP;`iWC#pTQ72i!+xd5A1d<;9c7VmuqG)So9->bb>nlqzDnSA zH~(AcMrZyP&uao3vduV~oY6YSAuw2RmW?a~k@$JKWw^-7k;BHdS&9 zOXixBm6ISoofW}b%RZ=5VF~+TKPu?p{ALP_Bu(lw(dimSD!;;oM25|Lt<^Ky+!G(!9a&dc~f3)6az_s`=1zh85U&k2*y)g9^c zPpJ~p=o22jl-ynmygor5XDg?yA#$lt~-e5k;F0AuWV7AHa->+XZ;x2|Y z)iJUgb!0LWN8Db6Ps!CS1?{Z^6jZ7S2|+%gF*Ju-cZX6sSssBI>XmxMnzXk%XjT)|Yw1lZ?*SSO*O`mSQ7*9VN}M3X#J;KOV@L^!$+ z0*kHlC!W_B(g`WN!m?z#r1$p{7bX)sq`FSCX=hcC>_U!0i3uBv{mb7wSh2hjnL%b3 z5O|pq$Bu5#m5Bm&W=ESAmr{^@`I}eFf{_Ur(w@Xu1O>!9M`R^0KM^YV#xXUaSV)sy zTka+($mBUEGh^+{35(fO*^It!9=TMxCYFyRWQ@D~!(lbl#pPK~QfDw5TNRzl zH?eb>%naU`pN#aEP{dK}&x>_Ql5B9l&o(n(>ax4T;x0W2-QujFqI|>u$c~gFsRcju z+)Jt?CF74&ym(~y{LXpLL`BhucER%AlH2f=ibf6}>Ih=U4@Z;0N8pu6aK#<8z~tSD z^CAholtptXeiu1!iWHx+G-QCCzkg*dSyzs{lSDBbkx&%c)cp0+N_0?87MpQj zv)^`LhTAXm#`_}osbVB;e>Oq9&Bs>}5+eTm167Wo@#oV!_R52GMec|iJ_$ueiyL3f zi!%9rjRhJ}@J9hYO?5TZxkVco=Vw?2=j3OENsaH6qUuJih5pjB38q(Q^sR?PXx4UB z%VHpjnO(FOcC_l^>%^O=YS5lv6gKwrLsr|{6@#y?DVn@Dkv~OpdS+3+MCXv@qd{H2 zx1pY$hofzLIUPT@eWh571Ta=0+Na$#P+`u+r~eClwN_4|ohARxL!NfbEZ{aJuv+<( z@(vyKuS_hWGV)5g3ni&P+*fk`J$(e~btNTCKe5EWQ_OIG)hR|jwcFqlcjfOdnr)yL z3pvjNEi-;QI8nf1ve^A5rG0e%8e|1=LO!(HOOGy+(8VVimDtC_w*8|#i&i&P5Gqr3 zAVL*RO3~%Ul%zRaAktW&q`xCROQx@ zEmC%VB>mQT=%y*!T&rcyrg=a9d5zs(8$fZjV(0&W?oUVW|2p3BOQEo@!~m;lAClXj zEls=hKJPn`E}Ikpnqk0<7B)Wq_dUKJA2xm|n;(-yg zm79W%WQirQ>pzA^DY9Hfam+F>0I*xkkba0KXZ5zws;g-)dOYvUg0BZXSSyd;uq{GT z$|gUDVk>{eyayxwc}nt+VH6P&`)ejT5XO6pb1lycCFp6Hr5FHWX!6%|j zwDIyE4Qr{#`|?Zv{0se?0n|N=wX86L9bzKZ6s!+kVMUv%7X)kuCTQl7BS;3g{kL){ z!hgbe!++&^vv_}VRFb-lq>$}rW)8uTz)Og`Dz~m~-LtQJyZY3x!^%1!6)@A-?%SPL zyOpcx_t+r<%WgUNfi^Q!ZnSia!EAHjX>m7B|r%P38HdDqL%CG#-2@+znSvh|-4)Q`HR2$tYYqFl& zfcX9uB%5zf3L>=hCB#Z4bq(+dUCz%W8@BB_3E&O1hbn@2J2D`4RlX+wMAjl*0+;82l5^b=#u zx354_iJm&rfm~*mr2{u$=J@gPAu%z5kPs69<#`TLKSO6r;_i~jlJsc5e1dPrHtZtb z{n-eTR-F38RJNnjKi|Zcs6Hm{+iaf$W%CP^zQzvUKC(g%k7<)wdzF^e^R|pCKsWw1 z-sap}E54FZD~$1*`>d{4&%YR^On!ZPS5G;j!hH1wEv=s&{2du*1TR;Ec-Qmq_bzUN zuNA24uOx3R?>7RoW%=6Qi4yhb6TP3#=~~F+Yvd&_V8zYTg$BnKgripUS1X+N{Gcep z+f((W82EOa$?|`Z(GQ8KYG&92*frW#y?tj-F{wx_-Fn$|A~nPo{=A)G5O71>z2s(9 zJ<>b^_J3ue(SH#e8zT+Alwk1(N>q1V?1iq5WRF`Se~0S^p_vY_Sw!oB8y6Cj-YeVn>fB;itJ7ugdEwXWRdrdEG*6JeMa^4Lx;M6?)JV%s{y)B) zmISL~YKb-1iy$pwKH`eILMNlCg$?iND)gGn-0EOd!>+!}2a#3TwxdZRYQB4Yib_r-4os<{*l8wu7J+WyABAjbw~l#B$?RR&#!F-l6EZRb@y_#zVW;-4j+7c zuNwPsRuAG#HMosK>`C`6*ibZB(|qxJxj)(32?FY#lUgi$LQ1XGvptq%A|^jIHno(t zw;q30fDf@mGCDQ5nBU|Uyz-Dsse?P=2Jq2=Su5o6az zkd9B@@w#MgAxu6y`SQemrSB$_JcHv!hAmBF+t-2ZQ@irqqRW7FwVQadnmP`Z*sd=Z z7pLgW_9%9!UoSP;!V9c2vz)v6CEZ~4y7>Uvb?e9+kmV&gI=x5iio;Bth#HD#XYh1N zDEgRLdstPC1P3#@tcv5k+Tmr1W?8i2dZNfJ0jm&&@ zATLizQf+P@%q(>Fc|}x*>V)_k&37Kl(BR@04h;1C6i{&WhAqC=1RM%rHrl5H;?|VxLy%` z?Wf%}@pLk3oDjVgUP^D!{kT04zG?s)92DmT1DNJ;-lm_XWN&O^(;6y}#yotZis_>f6I}03%FfzT>%X4U|Pj zozFbi{!!mYMgAZ!X`;U{aZgGv2KKOyDF8nrmxH?qqcrV^8a&u|*xq!-<+sh-dp=h^ z4amv1P|Y`R8ces^{AK(Ccs?q=qZY*vFAXl{*71d>j%QNu@vAXk$;)Ac_+3G0A?sit zr!evteRN3aB-CmmKc}zWAQrE;1WT%@odS4Xnk;qQclg{Qj$S)op_x%?hk(vIY zq0*pmI-}5WPwhU<6?3Ej!k$ISxi1(89Mc~!-XZ-zk}ah-d`O}FQ|aB0JGY_}8_Gq9 zuTkdtih|_+BOVC4jMusHXb8Ikufq}u6KwV5NwVt3R<^1S-=`YPw>bm+#dM5PQAq%x z=5?9u%JVZncxdbVer;SFd|gWYabE_j0#pJ%8P(l?tuQ zzP_P4AGJi?8%G>1Pr}a5{6zPowSN1iH55j+1a0J0qwGVa;V(W;5lWkMIXQ#{=Xo>b1?F5yxhBBtGiIwb4hXVg@j5-T{d|*#9 zIOZ4A3IDL~j)dLuT*&<`td67Gn>Tp20N8*stR&Y=N2|2orIl2u<=)<#0)plja&4vYi#Z6y;Y$4IXXI zwb`#C)*q{!s~_asf zNl`(gsk&wd&t~NfE~S%<9_(<_U+ssV2(EIhmNQIe0(7ewTbt}}5{j$YUt+BTZg%(< ztET9D(n$Lh+S-JBa&=ytFD3WHeoTQ8L*;g2;nN8x%r1p$S`6>P*I|47u6pGLb2Sdb zkZkzS?(DzB&5=9r=DN;qyWvj8RE2=VD>XqsZ*S9r<^~sI8ynM2O*6gTQqs=Wsz%r# z&{vqPMQ!#(`~vR=f^}+xcl~c+)-BUZvNuo$_|iLA%pzI+Di=&}@xY-6VJ6qhGG@s&ht+bnjtya&x9tdL8EjW;T3lIcQ;!Rt-JWfa;2`Xn-w z+DJ$lu35eYFPV?Wq9tnE6A*$#5Eokru4>sYyQ=ohWSz&Q0zXOHNfMM!P&i_-%wX zp3(o07d2Xtm{g>8yneUQHHvC`_VAW3WlM;>Q2U>fD#;qBnG3FC@;a&5*7tQE8t!yd z+MV+wuJ8|$=7}gKc6)QC(G158!5Bxc;tJYWjVz`iMW{P(D@b#A+mwU9_cKCKdlqsQ z>2bt;O^+V#|5uw?u+@iGxOcVEX43^YS-yD&2Fu7~cfwXiC$#1kyw3gXo*s*evuMS{ z+^;mmf%`ZbotLLrG(_8m<2qTz=hlKw<@RcNGqcJI%b!1gxS!&${#ab}CL&^@srMm2bOF0B@>_P9V1tliSof7zMz(^OG~b>W@e-vHp&Hm0WfOYM`e zOSvelWf653h$gU`efT0EM$bJFD_X}Z=5NmEhwp|9oV+lvA;1@ngX4SPBdEn&nbYjP^gyZy zivt-r-Fm1gat>0htoP(?3;Lavk7tfX(~8{>`N3D#qfS@{WUJjLIm@fOeY!v@bBo?H z2c6pbs=!;pyU#w8N^%&Ol|R?cOLeHp9xq*EK3f!$(^9|75UkEASvKEGl zTEiUY_Kmt(Js*_2AK>8PEJp+aDOMeU_={p)cP&@dh&h%gV5f0{%BNMjTXR3CwzB4R z^2^he?dT8kLy^nHm*>GO#S^(ujB5BMt9nI?DU_XZm2WO;-2P>Cp+dvPN<^V z+z;D;?JHK_td;d2&hWC_j)+wg2=BZhCvEc}L*i;n$Afh7D{e(Z5yq{x+}5$8MPapZ z`{FY-aSQi?*bELv?2mgP9HGaD-Qto5Mp`B&9=vEhve)E-W%LfR{N~1K_1ce55pXfv z%e3WYAnS}1;Iox&J}8~CCu!_T6=nWDKl1}7PWbSMnWRPrajzqVabV%XT;sAo6b=!& zx5s*ewQ+qB)5Hm(Iuw6AoIG2t_ZU4qKc9p8+`T)fT(37PPao({yR(Jh^6=I$P?sN{ z*`9rE{56gU9<^I>Q19J@B1;lt5=4NUSEF^m+g2;qdVhjQsni#X=S@1|db-+md#Q~| z>pp%U6BU)8Vt%tNt%9J|va;NX$LC(q6RW%dCmWll=LETi-~Aevl8(yE^x}pyIL<^3 zal(X%GG=o9ZfFMN?QT34@7j+zVb!@PR~#%IPawo`=GXi}ByN=VOD|B^L4V+9JnJCq zuTcA+gmixPjvE94u1>y*u}=HsS=TjJ(T?qs{zLKJCGP9){Xwea4yj&_DM(s?I0>?= z`XnkN$=BA#Nb67mvbSl!J5?o$^RIrxZ3?LVt3(%~K^N}yCm)BSs%PRn-xnRyF&}-ndiMh@n70vFH_m8Fc=6nh@|W`W!}qL zcBbEEXKDx@-%7>w1p*>$>*pJ4dS{}#+Z}qkufnkWgsKM ztXmx%8(X~9cruGtPB9*V5f}dn+IzvpUqPQ4@pH-pXuH4O^UA&Y874M!cj=$1i&!fa zf`k$*!b{uj(^Ye`cxx1&KpfYgbNx)%)!mgpsju_~Y<}c*ATq^+`nVU6Tnb*bo{TC(=E z%?x48C1h^7adqV3Fdz$oiPoAQZ-bLNAsy9i4?F5CevcP^)S`>lGC;1oih>||uZg(@ zAg74g%e)5s;3F;6_pG!wm;MB6!NPL`5lSk!T92y3y>AG?SsT%2aw z3D6l!xzUUFq!KOYB>L}#3j1%T9)ZIqCo-B(7@aGJAfKoNJK%G~UB66E>B-leYN>Y~k;k4Mao*wxCoXYZbd{L>k(Huu39r-k-3O-0ql z^DLpy)18pd>@L&r{TNd^J(eXG&4J2C+0J;fo+W8cK3}3cE<+|$I1%H4T)^|D^>OM9 zdbXvVRzZeEu-_pZ`2$Ahvpsr7{TE53PD93*Jc+umBNjmaX#<(!)XJO|2ZZ4UL)P4L zp2nZUmIHv#O1#WG$mYpR2ftQ+qoul|-PZB|Zo2}#f40>zaCdZBWVt=koZq9H&{-Q> zZWX4kSStK|E8BR(PV4Ws=#{~Tpsw=sm9)#d*p)@OIfcu2tGAFq>|!7m+TkaD5K8kL|$6iN6X&Bz3+lzHXf`8 z>5&zpl}IMon`90zBmujPl{JvBo=s=h=byVu|6ZibrKk1pjwK$IpDj%MDonDylRFd< zBfZgJKf<|qW|aBJ~MAVjI58;RH*dczX7#JG^cuw+`Ao+A9io9X^0>N z;~(t$csS}IRvG6BTTgSZbY6WSjYEI5&cimJVhw4QgneSLUhFb~RCZbZQY=(g(5wY@%~D*%s8UO9R_UQmU}!_Sk@l?B^^ z^)ErQTp5sQV-DSx?bQW6F_+VO?oK%M*5B4a!n&mQ2Q>-3=l%f6y4-xoHsywcyTPQ- z#*3ewf|krfy4X!z*<&kg#ZB|#Gp`ssAfz^O*h9GG??rv_`2Eb^|BPR^g*dI(r-(ou91M8If~9B<2A5q59C5_YL5G97~s2<**bX7CDTCI$FY8QCl>;2euf$x8qf`7S$SSq_k$hjpim{iK! zsP4g5fLA8f?X8c`5U@bXE1g-` z6L9L({}1!0{hBOEPjEdeHAzlUKUPwun3s#i;YHgSv36dQFw!-=a%K2!v{06c%~uKz zEyP0GLQ*R6)w{83np-oyBW8P#-siG##wT3Oi_Sj=r(tK*tZkdGwYW=+y1`ohGo-oe zM~G%?KQgt0=;(HE!CY=B|ITn?T`r4L&UTt>|FnVGGzEfAyt6%mMbDV^=%Sj5l z3xT_8(|fzuo>u*;Ja2;0gM%4SgP_l+ten&xh0ZF2mxZZ;ft^|F_G_2#s%;q9yxoT9 zx_+UUJ89!Pt!!}Q=OE#qZ2qWx&iQ6*bNG{9N|UFt2u(4L=1QO3o10zy>sLOrlXqoX zbXqE(mGJofL7%(zdNSn6Zlh1a?|g@>5KYc|Ja(s=jr9QyegX36DBFW${vF0%Zn68( z9JOT>EDJyVRvY4`da-T)oT9=t&)d6e%@_sd`E=tl+>6w- zKR8*N!FpyV#`B!ZU1YRO_UY2y&pxJ2l-fB(FkJpXXJfvhp;FU%c-}ngbB)Q#B|j;G zW7CN%Bu*@^YPNFnK5cn|5;RFzCr5FRCjOgkHeh`RZN)~6W+@QYPT59)`mod(Qe{itWYLQsLe-li$`FNo>! zCZ_Yn^YcAFA7{k9wUzhs8T`Wjdvj>Zz-K3-3P-ctI_T5^A;~GTsu9^<+zK*Pw}XDd z#V{I9Jy=|d#x{U!K!NqPjdgml!=ILXuh^w4^&B3EeBA0EnQh;^8f`YISXW_t6Eqh!EP6#1>t-yNy-HfpAo%qTxCf~Z`+tPxB9lyB%l`*qAKV6G)(rp!<4*MkCXr9k)au|VTMDm>i;1(-ilFL zsC|CgSY)yRa*wE-2SL?qQ;~p*jjyYGAJsDeO*gC0r&xB9$yqJan+`^#yAWSE^WB8{ z@N?a5)x_}MznPR@UNku6Nwgn*UIL`J6tixWv<1#er3&jxh+Zi;ndy3#^I+fQwL7+POZ%@BR5nME(i3z5g zoio-iUG3!>!#GHbosQuBiWhs-D50oJ!-m5ru8N^`Tb-e|jUGv}+-(r$87tIz(Y5p- zwMl+GE5}&XmA=KlfLgtBGW8>an<9W_oYLCU$A$KV@CIK8xT_#>a*``v<=eoUl$&Lh|WRw zSev!BO$c*&WrcV-a%jwrz0T8E)eX0u=QdCIO+_9_V$vLt``jDp(InrpcD&Q7A8inL zwLe*HX_ZPv3+!M-abI%dXn<$f#MtRPog&_8>v%qWkmspndI?-fWXLr@-Qd zp!aD?qS96TL|{)|P@CJ2$mn1ela^!D=hvc4Rjgxlf7mk2>a5?T1h*+y7L?G}f&;cc zSa(pr{nhDBt$>vG{oDpqBto86Z`WPv9}fh{dx?%$@ym|lTrdm9+iJ552B|Md5GSd- zvsD?{)@Mp&WS3Fn!JOvwo@yNtJrs-Nf4u@>RrdCcOk>@dZ76mj%Srq3mk&WOxzHG$ zw*&BE&f&Y852V?;qTK?eXBPElvlGf38iM@))YO_g-%t}QABKSiPV9|sybl*IY^@id zx**G$oyi}HKZMHhh?2+3?d@x?mOAAQ(6qP7@e8lkv>@MvhP&s(uh`f(2-*BlZ9$UJ zGE5!pp(MjD$gx6Q2=RB`m^l51wQ#NVDlGDcE5F^D?tFv$5hCyCorua+FR*@iAhq+}uI=@5n`>NJ zy+dR!H5|qNB(E9}^vKJXrNZ53uxC4dx^{~m`BCA|KC{4A+x#ux5?cuVFQcP3b!l_a zMs?O-CPLHp)lVK~{2pDPO_e=poO+{>q}5JWCu0OHTRBQ~99dbd%Cw3+$@CJ@k89OE*f^ZaJ{@L_AMP1Q`|W2{>RV)iY5E7&yc)rx{D zkDg2XzBxM-kw~|y#in@P?1UOMRwv~u19)*iXdjz>q4M9v2XFM_A zQipw*E<9Z{N3ayEQK(dRKP|O&wPS3vGNt7Y-VV}vvN9XBvTa9~g$T=iz9ro6-RcNP zDs1}ZYJV49I{YD2Am*P5r6mq5VbZ4(u);N8w?LcBsTXk?Z?nQrJWUc{+7xKol-I+t zKiHW?J5EjprIO6(BU;#0$QKPJOkJVuasLMA9X$jGY9@*6Oq};$TldnIq)gy*(0*Vn z5~wW#mlF2;cdq8g`R31$08ov731M@bS>m3gf~1jAzR5)`Xr-S0ofB1VbEIn)OWbe+ zhnDGLGCAZA5HDD85_%4jPU1VDZ6!|LpuCB#dEUMT%)INP|U%`m1DB*x=T&D zW<1Rcxnbt}Dxu^KtUYh#POJJtjk0SXr`~Pvqvs<)T+^9T5~`wFfk`(g1cb zDDL7zeAzA2VQVVnG${mX9q`1Z75UDA>~^uAIF4srF<)+FQ}<>b=vPho(IVZ8at_xL zgH|{E#VS-qdeO+1L$O}bbq!n#_LPb7@mW7XO;+eFK0+eB1Jot9<~upBAM7dY5q=QU z;9rdHLC6VG-lHxjyk!CaopH!+WLbVt{t!@m&s474g@Jte#ZrjpM^MiP#EvDvbX(B~ z0-r}5iDZ0?@GvuzoM_UtE&-ZO#KA=^UX%x8fmV8fZp0HzT^FR)9T*FVyUq6%{2H?p~*y0 zU!3RiodVqtoqZ~dcrG;Ntk=QXTx1PWUyein759B81b?K5K!m+{c21Ua^l(RhiB|>A z9AE2y=aL)z|FpH9ST+p$`^6tQMC6VGz)O%7it|LMx3grf4|iEn>DJE1(;HLXe5qbl zF3vU`y)FC@2>NwUaui@MF^Nh)eo5dU+~%1gKjMA!^it-dRZOX> zrO|fTbG0_9XP$kuFX1_JYg3YKK*|=j#$5$8u4>!!p&m_c73bhe1x#3TmseC4`qsH+ z&N2hk?Uw1^i$sxr2(N$|WXOHAydm_D#t3Lt5?;bkUWzzBbWZ9`T@aDFJNnfzB%5QT zUW8)mnagm}Sl_(%Z{=ev$aF8cLnC)%hw1fBaK;b3JPcBxc}2d*mccJiNlBcqhm($v z6EDLf45LGjR#wJNPR6V8hUNOsH(R1@^J3@hb=t6K`HuQ3Z&=^rqVpXr@VPdW!+zb4TweaWA!&flp0QekD|3**eTF{r)lny}>-yEIe|%n!BU@wz>!vej+aMPOg!%^{=m zUDW8Qi=$*%f8dNdMEhlXUtFBthHYhZqfXUlmY;BHo(u0LZ)Wm6$9p%EN2-XUdVMcN zNy*%s$?&w+6EQfbl7x(wy8GRX;*Kz$F6>co9?0!tvag}e{TZTgS8uK4(~VbXE1s+tx)YAUKey`kcV zVT~%%Gm7Hig@eN?bK>!Ib00M|0{|pcTvJ8IS|%DVrrGwygYNW<#Wg{lHqmXSd3U0` z`XS=+RzT2PUY7GSgh+|X<1aA5=b(jowQig=*Nt<2)j>_lt317+q`BGprtCp&uN%$Q z)&DfBQsh-BL()h1H4Y1fGC@dvj>^^YxzEkiBPuiI*QLO1ald_xx*nh8`M*(DyaoLc zcdQ=O8t+)6EG1$W%S-RB{8`DFKJbyfA*aUSg1nf4VK`AmOJk)uXKlm^N&-c>p@ly0G26FRnLJD*nr?oG z7|F}eueGw;U;-P6QW8se$EH~~GGVlWbrM81VqKO-!c9g=zSdzWkN+@44bXS#!KH8L<-cX=pD(mEhHeQoud<)iqRT95!HpX{RmB_$O{MQO0Y zK0y4rN=PPG!$ms@Mc`Ew9Rc;}LR1+k&%3IHWLhL&5}WoBd`Saded>J$St(OohM@s}=c4ZVxj z{fVkOU)U2u#p03)y>YRJ_a}=B+KJFyznQY%Km!^~ZM40#Jbe}n;yMW?7UFey&V~AY z%p=fg)n&U)92y8cGtU;jOQRH4&$?LmgLV7)p2Cut44yW9iuJu80u#->H#dAg3G*R@ zPd14oWjpP455fIcEQ7XJT{kiC+Xi`qnHs|>5&Ne{@RaWiAG_6wClCPjT_UOH7JH^- zN0ezvz>V9RsqTQO+}!Y1PkEw^hskVmG2hjA$hf?4Wzs5$e;0OcllPa5-Df86hrG+( z{VX{*{5C+9+p{qfasaY17y0~4<;2u$#XOX{*MZ>x+-9g{rsisr(C9?HUcVBx`h1(h9mj}2Okv@P#~x$U8}N~dF;sF*e*j(%4N3ph`MqcOL&>Yf zo1&bnW%u7)`LMfu5o|ZYK>KNkk$pk8#;`ve&-+0hvEmg$+L;F42v%2A)HJ(~v^3N{ zv>b4?Zao$SV~L+9a%+7-0L_7nGzwui8(+1#=dzKwZb_XU4t-O3vIXbAs-<<|Bge8L zz+NxW<-8j|_vZ$A?h2@d-{66`32ar{<-L_Pg8Ey%x!hM^nVGgc088DAy{lvcHXI^E z0a9(Etp%hszNfPh+$ENF-h;N;G>!b{apA3LfjxoQ2wWc$gQsl*){jYYS!7GCb zUx=tP77nQ>$tH|@Kja%fKzR0%EheJfiKfo{RjE+mZoKywrJ%1Tzxj~)sudmu)q{RW zitCr&puX(S40KBha}xdhherGJe+SYqIEl@pZKV*pyW^G9^r@sy>rZ^nl8c>oy|c5k za9a_3ucvWA7$lUmLenZu)$jhH+V2KJtA7zqsUt$FCOA*MYHPiS>Ld5EM=c22OQ6+i zcJi2N-!`Xxguymmpc5aJ#INciI24z^*KGbXLx^?}S_(2@x6eZxH$R&p{mGoJpLZJ4 zg@kVUfxer|I_qA`{iJ+u4LDSyO&7!FFAfJC>g8O*uE7bt6I&*zo%DfI9`i>@BXuTg z80m?`pPB8AU7nlL*8yvC>wuB8IUGnO0`7|}*e{>=&0xAMav76k9VeRJ-(L)IS_{~z zyrp3+P^lbZCICcy7^4cyL^c~^U*=(JLdB^+7CA!EN5z=#QnV3&w>WJc^{!9eO(Bd(X z3X+_MWF=m(hgi0PJ}=ipS%JRC+raj6$E|Gz$?gGG8m~tUap-4j*THwiiE3(iw7}}$ zc(fvq`IGRqLVF*;)wEfvLifNR?OK~FfF+!(7X4#6-Y)Sx*_ezQ)S3y1t(C=_Ybpck!5r_)995U9;sBxw$&OKnynS>3WSF zEFa`5*M;b^D2d-4@e8)MnCu-Pz+mvs4rUVo>iJNJU`N#h2V~^mL>$~eHbeyYh-QI} zqpbe7^2^Qc-w;(iqIMdT4PEn1rOLiP5{G3YKBRQ#7yHUU&)?VO=WY7>3-&7l%daa0 z0M0ZwPea2?`x}Rl^>CKfDn`thYtefcluHzF6PU-=t)6j)oXBj|RaGtuiR@+NI43c$Iz#|zMN11SUIz=EzEe00f(<~O zyv;q@Ers3=CO6vu&r*upm;bac6 zoyhn)-f|K}EK<#rF9u4Ji{}o??~+CH0V}xa?L+U13v=M72A!VWt_vK(K4xlCy+fOu zXHnG^ey5J*&x#Skr&PCh!qbzKFK!6U`wC#0cck=bwr>~lAm;c5b!TdwJk+H0w(k1^ zAZ>0P?GJ}=)HB|>=90PLgRaB#ux_@<)lH1<#UZvs43^yfoZOv6w16n)MrQDyf?O>I zXCfZ`Yi9|+)0Y_&BgAF`?Yz9=@1N|@1JEL*#Q$(Pe4jL(7p2=uQcl8i9@}dXm3AQ} z5;wpIl#9T745pP)WSoB<>V0D>Wv)g?>>}W@QOS2P?c5i`vhq zMPU8CxB`F@9X}VB*#{6TefXn8!jz2?#7*5A|M$FQ`vPC^16dk0G5Cw3;CJ$wg@4R9 z#@mwhpUH`elapAho^8b9odzc4_Ab2?WQ%tHMwvJi$py+`YzAj z@NXFJksHRvzD!pP)|*S*j}7BC&+hXY7RHW3!X5jZdVIUi8uzn0bUP>V`5ieyVuTOr ze~_dZXwWTc$o`Cnfz5jX{idpRZ6%thxN@4?mK7=hi)F2bVh*{H9PYei(^mb>J|-XU??G1QiO-nn(O z;xdxn#7}FYykdy{(yX1zD}lyDECG5h8(UlU{4Glg7Iaas!S+AZ`L>=`5!w30GIW^r z!L(7k#)0$e@t&#udteFL2O09+FPa^-HBKz%NWyPRm{(G5dlgod{~b|zXLTugL>_A! z>L(9}wV}!6v@j;~YBQpkUCD3BqQCEZ%0T+QGdNJgtMHWaHgjO+Nztv{;{dtuleAq2 z{vOHarMHee9G((U!Ps~OLETRl642^n3+xov80o@9;( zI&-1UuRJl+uxq;Lm@JM0_tyumvU#ts0J;8%oy~g5ND(MW$P|C1vXeuLhSX$glAQ>& z=5DZ1APIB5whij{A~|l=7Rs`N(w|k{yS<@b>md6wYS>Kjfxav##NjrW`wO?oH7srV z>Tfu}jdUVRil|3!2>IMX_NY9}rd!?Mp{%N@P$V0=UzEI?@q@v(@JQ5Vwfki1=c8iV zAnfJh!g(FVbABmz?*S=(!`&1Uk+R77Mm+)(F?VqDY%K>8(Fly18iU5X-hU{=sY9xI z6(i7Rt(u|=M!MW4K78GWbk5(U{Nd}^p-oo?|1_VsZn$?VYpPo=Z{LhzvPkD*T{z>6 z&lH93>Od?RMhfR_@uD={aA>$3MzQ+p2f0%2brrs=F$*a$TX4~yXe`<_r*(jhJ)*5a z+7TcbyY)MKMtNo@&0B&UR~|AI9?vRXJYKOMSXP>7Pl{0UabTDSqBrao3l+E0{a$>ZTdUB%c~zGj zl;!$}-CW2=Ft2y(Ews!H%yh-? z1WvN%BNy}evSPvf$3K$l>dnKgJlKFvNC0n-iJ_dBa;ST^NaOfJR1AAKUhJQUtWars zJQL@X5(2?)>3j3oY%m5Hu{nl#ld{9nQ1ArNZ}u{I-d%jZqFc7K!=VY|S3l~}m?eg< zci*7XQdSE zWF4udxHwpKGb{vzpd0fqODD|8hk5%`>ypvHaza-a;$cQ%Y#hc5Sny9lkv#cHjg^F;pLkh=KJ3vx3d4*~ihd6WSY%uR-l|hLpP_>5$Do8`b;rFnCoCDM7;)p-;` zip-=n74N!6BLshPImf1BpZLk`jdk-cN|);(rI?AGT!HGss*6WO6l`v;qT zXE^^gleB5bOm5*v{&vKin(@^0@HW}^7nz|SJ0ETuH99NEv@ri2;zi@}ZK)O+zXqF{ z_KQ1ym(498!uUsDg#56SV|ydj(FK~{79W==J$GAZHSSAhxH>0 z28HTscS+I2Kr|-PKf3C#eTytqv9IH{B_on1O4GH)>^KKPwg z1~0?X&G}zlB{^RTFWDFb5T=CVr;FRimpX|vn0iFB=fCOa-Jb`2!rV8}t(vJ65Bj~d z!;cfj*L|JLoq-tZp_0bsiQiKssJ4;CJNU0N%Tc)rh z*N6V#$^G|X#^iIEx+dlr5^UVPOCEMe1|^x^<*F!%EGUjc}!b z2p1Uf)I54#Eb6k;8pYY-FJ1H9U0>lMY(u*)$|$6lGJrTZHb2nSLIWt zC=z}_mYyE!B>r~hUX$ANVs<|k4H4z`xS&HBV2ZnRHg#~74-kT1O)5%QG%q?fLq@fj+<1ttyC4Zr2 zBEWGNEJxu%y}7W$Ai~&vJro#RuSDKnx%{owFXkv4w^=&DrOpyfP=+jP4P7S(l#J0V zRZV^Nn&9QuEQ++@h>0Ky#ynyB1NagjkyGUV@8AE@Z%o&0RnUD>FhH4GSOgQt^puuh?lM4Wo;j$Z@)`@>INpoajp0o zWIZ7wG^9cOmBklYGWbDCV=jQH9VZO2Z7EAJ*pJ_zBTH5-EZ`L144Ze?f5IjQtw&X} za$o+`l&+=F&|H9X?O7#0X7|x^da9!QHuusavFqOG0_&Q|OMZN1I2N!6Q5m_7r-8+pp z{dwy-CT?@$$oFGC{;|;P@bDEheXPbZ2+o0L%6!Vo8kw7f3-Vq%GK%U_>t=z&e9?A5 zh^t&!$RWlH7H(q1RuRp(0BBg^@e1c%oa7qukg$}xz_}Y(!`_D_9ETookOM@bWd{TP z{O;G-q!tw72(v`!&U9vQ{KT^XbAi2C!c}H})*v`5(LY$=t_uREiBY_)7$m2Yo8twj zo-4O&_&+i{ke1LeEwCAX2F)gstcW|`8aCoFloEsN$bTe10gi~o()|AaV=DV!6`pVo zjtl6TsTeepl2FdjX%)s=JSMC3oH1sD6WVEmQdhk-{_N!rvJVD1$fgM3aybPoRTox} z*QxgG338j;+$b}+vt=Leg_)aNN43;EJ1_$1_Z6%a% zFjoVZ(V-2R8ywN~^W^gz1Pqw0xOf`ph}W+XpTF374kFI1!{%&A-T)wMUv2KhSvN#5 z9m)|Fjoma1Sn%CKH3sS3_!~AP&@2X4bxDSxZc9;IiW6KixvMTg{`gFTFRn`#YxGmb zzc=~Jv;;RC^KWh1t``B>C#k%=&L^bw&sH!Lboc5SXtIn1-K>p?EGAU|bI5!UuD3%4 zd<{P3CfU$!VFNz$*PPWnw%fRk6(}5vz#d&a39S)Goh&Xhe*IOPH2;`hPO%f{p_2^ zH{Y8vG=_9n;XmH;>JQ5A@CnkueV3Jk=$FNWO_cLk8L^><>p3|G6fO4X-obny=a3v+ zik&92J*5Ek=pxe)QJG|IGK@uy*<8e9AZ4+b)yt#Dk^#*LO+XCwm+@L`3?vjBRFmS> zJOZVE!?X=N;Gs9WKqiF>dJj>M^h2nX=5Sz$I;7I#$c;FMY47wY!&5z_l5COubI)=a z-Hbiw^DI)dJq{;xNbj^gMeq7cW>P^PE0b58a54Us-On^TNv8pEl~tYp=Kd{Zdr@)I)mHL+bZRCoxldN+HdniU{tuS`ESFH_Q4bo0+} z-w>=ki6{7UnRoWQ^8 z5|#;Le}$WYx#a#HTs@P7C?rI>;aS5q`k*R>OlnT-Nlcip!{?FUSp-@Xmc@YhfaPg9 z=yfy7^+*nr>;&X$yZ+ocowPoOp6zC7GD_28)~|6W{zXov9zQ+ zpTP;qsC0T6Et7jr{03=B41E86
    fyZ#7vEFd$_C?P_lx;ReGq~VGCaHFv}ZuKOr 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%0AHxU@#s5 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

    D_5Rvt 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 z%0D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 yy?$nH{FNZnWB(#H%$8%^fzN*3$@@JMhp=6xQb& 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≷j2+MIC@@&iB$gJ?;Dy@@#@WMrl7V}+1!%?MT< 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

    0;yIH6{G8 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 z%0A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

    5I3dt(>ixR0~EP*68GLonxInUsrWkc2l;zj|*Lk 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 literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/plain.txt b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/plain.txt new file mode 100644 index 00000000..9b6903e2 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/file/plain.txt @@ -0,0 +1 @@ +I am a plain text file diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/beta-sticker-1.png.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/beta-sticker-1.png.http new file mode 100644 index 00000000..833b83ca --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/beta-sticker-1.png.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Length: 2483 + +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Disposition: form-data; name="sticker"; filename="beta-sticker-1.png" +Content-Type: image/png +Content-Transfer-Encoding: base64 + +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 +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/binaryfile.tar.gz.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/binaryfile.tar.gz.http new file mode 100644 index 00000000..4f4fadb0 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/binaryfile.tar.gz.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Length: 676 + +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Disposition: form-data; name="file"; filename="binaryfile.tar.gz" +Content-Type: application/x-gzip +Content-Transfer-Encoding: base64 + +H4sIAGiNIU8AA+3R0W6CMBQGYK59iobLZantRDG73osUOGqnFNJWM2N897UghG1ZdmWWLf93U/jP4bRAq8q92hJ/dY1J7kQEqyyLq8yXYrp2ltkqkTKXYiEykYc++ZTLVcLEvQ40dXReWcYSV1pdnL/v+6n+R11mjKVG1ZQ+s3TT2FpXqjhQ+hjzE1mnGxNLkgu+7tOKWjIVmVKTC6XL9ZaeXj4VQhwKWzL+cI4zwgQuuhkh3mhTad/Hkssh3im3027X54JnQ360R/M19OT8kC7SEN7Ooi2VvrEfznHQRWzl83gxttZKmzGehzPRW/+W8X+3fvL8sFet9sS6m3EIma02071MU3Uf9KHrmV1/+y8DAAAAAAAAAAAAAAAAAAAAAMB/9A6txIuJACgAAA== +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/blank.gif.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/blank.gif.http new file mode 100644 index 00000000..7426f5b6 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/blank.gif.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Length: 323 + +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Disposition: form-data; name="file"; filename="blank.gif" +Content-Type: image/gif +Content-Transfer-Encoding: base64 + +R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw== +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/menu_seperator.png.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/menu_seperator.png.http new file mode 100644 index 00000000..d08fd37e --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/menu_seperator.png.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Length: 1509 + +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +Content-Disposition: form-data; name="image"; filename="menu_separator.png" +Content-Type: image/png +Content-Transfer-Encoding: base64 + +iVBORw0KGgoAAAANSUhEUgAAAAIAAAAYCAIAAABfmbuOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDcxODNBNzJERDcyMTFFMUFBOEVFNDQzOTA0MDJDMjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDcxODNBNzNERDcyMTFFMUFBOEVFNDQzOTA0MDJDMjQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNzE4M0E3MERENzIxMUUxQUE4RUU0NDM5MDQwMkMyNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowNzE4M0E3MURENzIxMUUxQUE4RUU0NDM5MDQwMkMyNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmvhbb8AAAAXSURBVHjaYnHk9PON8WJiAIPBSwEEGAAPrgG+VozFWgAAAABJRU5ErkJggg== +--\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/pf1y5.png.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/pf1y5.png.http new file mode 100644 index 0000000000000000000000000000000000000000..20c2c2dfcb8622e6e92eb3a3371044cd3477aeac GIT binary patch literal 769113 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�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 iH@M#C+ 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 qN?fLo}ZtjDY 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

    JTH7q_Y;1^c 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≷R8oot%b;dISqYsSI zB~pXyLQb_Ob2No!_V!KgbBse#Hl^=RhobuXx2RSBQ7%b)G+W>udsmbRwcRTyQaA;l zux+61EB#WT9b@Kcw%B`mW=E9P{2vFO$IykECxD~qQemnX0}Bt8D4PG;ZvO4}#83^4 zg8G2mt9en?-+vYPUbjcZ^TW$pq4M4qR+PR)a#cf_H>rEZVZ*!&gR^nahBrk1k&?`A~Zkt-!S>B}T9?#sskyVpZ7uwf4gJVg?6a8v#2 z&%!Lp`s%D^rm~+}RmT!;4ReFNBVy-mVMj-nVcYPH-9AAM7A81Xx8w@c+bYgMw0X$j z7sww#4{lo^zFGGuTCbD}tz8gr(()Zo+XUI&cp!23i5o@lF8R39xJ4UD{7OXQZ7Fs6ie#YLdQItH+$>&$p%@8a5=n33p8B>m2io&kQ-B<1;)D zn%v?Fuk-Pda+J&U20KR3vO_2%0`UqQJvQ!IOmpL7SVcad#Lz%j`U7ZUdc->&_nl@v ztpc=T+fyc7Q;(ldnR<6p@eKdE%-2nGeV+DNL$hi2k{pF`@_8O%*hB z_D8_|9iD=qJhbGavbyS@oxM>Jpc}9?Gj!kUX4Qa#YI0|%EG!hW*)*Iw{^vINl_Zw? zkz^@RjYr{Dr_~cc=!Nq+fkT7hWq{sJSwp*5WgXz@l>z)+_OPTl6hKp3;wigHh4I$x?N{Ii8yXKSsI72m;&~{3EkI_ z3~srt8uTu)_YY(6ap8EYp*=9<*zfeH(AY(^vi=?>FeCHMs;Y<-JuDhtPLri?#xSZq zUu=198-pJuUx75+nIh<(U(uH3X+myF>N=}kXCXCbq0cT9^ffy=)zmz~IwIH}yEOHM z<#DL!SJ`rl;1H}6bN;)$#8c2n9D?(V|B#iQId7T{eba)I8O7k z^JVLdP?b2N9A@HceM2Mh%9X2z0USxKDwE57gR>j7S_;+3-EHZV8XkN;|^nK=>Gjrxnejg29? zHi{xm3ln`puD7Egg1cYPG^g{%#Hn4*DQcnZeuZ1N)Rx$o-rglPZ0`}$~yzIUS9;3K^5;UPDdD&xs>D-YjcaqF!@&BUAj|gxcPD85bns1W&I$*u7=yhm%rKT zH3+1oNWb(vonEV2gcnpvcYZGszY2cbho*d>{H%pF@m)v|W@nAP088aW94Em|Wqu=p zILt~NFOj4Y;Mw_X0kP zHI{Q63EfR`1ex$w;1a;(-2>7@Q0OHHjlx5$5V5ndhHy6xCb zC(ut#q>O;NVdF*huoSAjsto#G<}i45ROUf?1#SdTO?`t(O1kh`w4WH{^JYKWbOeGS2<|blJ5pf+}Bh0~* z4YvZYD0cX(&w8X9snD;#q+m%YVGLIkObP!iJtIWgOwiZPzz>!LKd;rj8iYO5=GO>> zH_e?4Cx^FK2c(LYU2~B)=S=NvV<53bH~sEgJEHj6W8V+~CjE4P{+{?pCd@Zqq-1Ud z4xV!C-rr843M}ZtZL4YIgnl8#j(>L>qe%Ry0=8d^brL2ntSmfbazMBoyZIjL=O;NG z_fKnylQ=~WC1{(d%BU}e z>EC=(gWau8l+d*1aH3;6bWSaVEDVt%?B>v&A?>DW_+biU4j34G1QGr zNI!oM+RDWC{&40;)l{a&)zw?{yjj1@^3%V~eiJv7->a2|DTPL63kND2cp{8hR<}xZ zK++k7ZhM1EL##JZ&y2~q2|}}7qzYf~Wx#&1(R6{x&4eMbXJGvfC; z_~HR?nh7rV-s6{0`1o&}-JgXLdCs0lk(UD+`)YtS2n%X?zUS1s`$zJ98Up-mt?-wQ z6ZNmM+YFmWmIQc4?R{P{HbucTeK= zt(PrH$Ctrzdq=Meny6^659%G~!c99vQa+~~cAxAmMfwC!>FVLHfc?V`BY-BIUb3en zPT1aOZWF{3=d}G@S7>Ogh2J&v8QrVnR`leaEyj#E)82|FmIskQEvf$Ee~Qj{d~Mx3 zbE$ zxEuf}#NlG~aER!pAmipEwPsL4vQtpQv7GP?Ee+0{5b1Zej~e`03)u4IdFdk|CBlp+ z%JDe5>H?b1(^;9s+{DcBw+ms3F0a>z9RylD^DfR?U0oD6rw3?qszU>N4{WKlf3*Md zK+Yj}QFe~M=6(scexUSwrKReoYr(D}P)@!WKZE9$xO{DH)HxOg=kV%(%&vW15rVH| ztQ4^#MkqmS;A(T+4~PnAKdXQP&Oosh-B~AhveBq{N;^EnYZ6!e%j$Ywarf@t3Lkx@ zKGZ#&-IZt&bwt!sp}yhNYEy&EgiNmfUY@I6q%(VYQtz;Vn)>4}i}Ir10GAr)EWz(8 z;vM1F5n?jwgY?+hthsxt&bc9O)w&}j`7^$C2}%GOQFdlQbA_90Ac1{8l+%0u8Q{6# z583V3?C=SyaQT7--oK`~#&hAuLxCq>S8h&DSj;Bii?`?!)CZ`)wV};~6o39=C@Bo1 zOZ^*ov7DytS24ZB`zNz@H$9~e{STlN=g#K80j9U(i`RzCBc?L5(*Lh1vI)U+P;d3* zZzBX|$R_rK++tR+`LB#@*p=QkGB1E7z(*j=zuzTS85RbJ^ahgl;o2mUAr*1?DR1xe zb!K!~oAOu~wzigrs};&%eZtuSPh8t40Pb<@A4dl{4=zkA3uov;Ps$o}qqnw9`?y3r z{MCluGe5N%x1c#@@3vdPT@)?HkW%8F9BWD>>K5VJjBH#8|2iE=hRcd$O}_o=&gY0X z!efmpxARoAjUQpZ6xtkO(heRu{Sg!4WEVAq3QC!QK!pl{MSKg=Wt}!C1}8E3430|@ z!u4tP9Wa1wc2_2K?LihtbYoQI{LAl5nOj%@} z^V#A@KVN+yVOYMF{{ZY$OHT@yYtoTK;{5XK# zN!rL|QyD|j|8qenFRz-7&r1-@Qy5sR8n_4%i&-1X!DY~x8<^Or{!VAP@qa>=p%`2i zyp_((>kZVc7QQQ&@ok9MWviGi|0%3WcQ))6c9Df5DUxgVFa#{JxGoE(Y=je&;^04u zM!uo2vU}ZLLGei}E_pGGF`JP2R+Jfhrs#-9OQj!`7(;rUN8^3DPfo-w6<(g-q@(7@ z31Np{Q)yG9!hATfVVsTGeIaU{97ym$zdf#Nb?uRShASo>Y3Jo2FZcAm! zZ5rdNqWz3f(LF8=Bd!QFa;HxcUZCMz)_iu;6RpmTvW>Ax|*Us$|*yb z8>{dD?9jSHNB2qC4Gt47B$CY`<>FOxs+Wh6E&H09f`(rxX~C|;<1zd7>~yxh7lx)v z36(}#PDJ44pe?;tMhc1_3k;S_kPc0|g*NThN2}bDkAs4XH)m%icAlfHyLUiUuFlt8 zG`#XLHD!r7z{S8An&YBrb)kuEkKUX#KP z3&MXm{*ox18+6oJ+FB;Wrwk=y&B=c;5IjqF8|aU(-kh@C(n(DdH|PYju`Rj9gkaUB z?-MxKBUBz~i|ciJ1lzM>h<{x?RK1fk&|{o{>az85*g0L;0Qpt;@U*7*UaV@ZAy;nd z@9Lik*$$S%?ZtjJBe8Oe69vsYet|EOSuiHNO;5!o5BO`HZxUn>&l~2}?1YLfDFn*jUi!;TON{BL;!b*mqff zTxAHhF_Cowh{M(90()jhrQ(s%E9zRT&_>Ml#aYDVzSw()QRl3cGbN!1rTC|>eX>JVJHB`?5O4}P(>~btzXI?gC93pb`LlpU-hX%F_P|!x zKIdEzkenGkd!BnucZleSd($PgI-Gd~3&HcAtibqg47_Ns_AZWE*QQj(`;4y*XP8!D z9$*3b3eBrMHby~fJYJ2@z0bv8WF!GEoC7A+h00j)O+%a?z{U#Sw$kEpdn~xPvFI}dsskgqkgQ*&BNpA}IR`OIUifdV3t`2CnuFg8JEh*@SiF zkbD$Cd`g;%h;+?Hdvv^#!R_OjhFv6IX}^l4$cr;Z37S5g;v@fMU=+T7^?w`Jei$Bx zbZ!`ub>eQoLskNEe$er+yh_vlz23p`g?Jl>i?(^c$k=!^ zvY&0StLX{)fM2RzKAHc09dBGz74ZfD&V;Gv9%v6ZlHb5e9Bx^8X*RXpDY-ZXTTY5v znEhycD|9SUM$`pKhtbrQ+YjXul->5gcSU7M!=fJ-vX!3(#M1*aRnXNjz_PwxGts^O zs{6w(4|*%;p>J)=ktEV%86-I5}hx&gX{Z!HDI?SKm0HeQ7kL)lM=`1TvA)3tQn*f z9Mn|R#3=;6%@#JtiBjYb=XUgaKFXLrb=3uq`uXG%9f6+w8z>~#Sh;!GX;{7Qcl3n6 zgmk)JLEIk?t%1rAkLfpm2vAUm8(TuZ-4PV_*!XePv$`4?ssx0p$Tor-cWF{>07WJ@!QxTE_2e{1p zg80V!DqSD8UWiCqL=tlei-HK(_IOUQ=!zn8$S61Q4udkT?`F*}cMWDeGauGZ6CanX zG;<6i0~7E&maD34CWnr?@pvkS$AXcXTK1?n@(^)vnb4E6)u{{2ZIqLIn z!<-SbC3i{T)iIz?UkU$P@GkITQ8pCReqciQo|x%Ab^qbwSH)Gjnh?p|&E`iBc(LA# zcoS{r1O1^4t86Hk%q@Z_0={~B-alGsywku1v7f5QQrLLrRxPvqF&IqrUm@^Is|tul zU=3ssEF&Pkh>AAH8u5?O8QPT!w+D(dihI)%BjcTqz$Uh|PLh(Ao2IlFFZ5HRGJ$ad zMKRLz-lQ*$qEXl8{A2O}3f54nk)k;>mmVI^0apO9O5hv=n?OE*k|Zt24mQ`NL$@>r zR-dG6f6fIy#se>DYhtj12Xc=;RyA444BU9Y$e8Y|-^yKuv-$M*PSO)n1NJR!msmN= zJd~uuYU?u@Ozf>XyY%MimE8z9ihlUh!mc)V<-Le~qJ64Ea8m!5M!$o-x`yqRry{%w z6AKgCEO|lAQH~9d!_jXcV+jQ;5n)*ww%){Lw09qX(8kwtETaQ(nU_Aqu?QK3OFr3z z;t9P-)Z6pJnU)B%sjbERJuN%_EkmvK6NzQTL5}1N5jWFERv)57S-_mu=sHO zj^V2MqbAROX9fp36Cxv@Ed(iXpwK_<~`Jy@$s}F=+4c;j2hWC>0vquu`_LC;N!F{T_$B+8Jcc;#0VMYaoZ!5QZE(e_! zlDyB@4~z6ZTA%xaeW58fFHD(2<|E_p!k^$*hwt?akh$;m;ziYTB3g~sM8iMR==hb8{%S~iNAlqzLaq#WBVfCTTFohJMJ^{eV9`Eqra>Su7c&tI@eBf`?k3UhOd%aXsupIq>^xCgjD z3>cK`Och3djBPf(aNF(iZIl2GwC6JjAwL@evcih$DkvBi1k__U43Y# zE_23S9C8aLpHFyUmM+1#4NKfP7dhMA@BTEwrVc?f4%#`k`CJi>C@S?xmCXe3T%zYJR2gpiR`bn;Kf6=EHhflqc8g&s#nN3w`sc3Mo@S&%tued^W3^d~pN)sB^M9#z<xr+ zn{!lFI|Ce(DS4H_V~C*my{t)_jhu{3|B?}wl2sQkq{(8gGW_>qTg`{rPlH)u zR&Wa2v90a3v=gC^B<)&c`tZPBdnO1N{LQR5SwOmY25>>mT>Ewk8 zs&V+lUes0`dV>IC{3c5{b5ZU~!fY~+@9pQo-wUy5*grnRqJWr&{C+f}rQY0!&QC>6 znIl%o?w&;j_4Dw&vxOEfX~0-Mp(DmtqPMp{sQq4xQ<#das;W3y`F8uQUe-`+?1_7a zgucAzokgoWh?}HaFhcoH0?MlWZp3r^l-|tA1!g0=p`rK|-;>9@$`W;`v^gT)IC(}+ zvN32+RYi$zNt*RQ-05lp#>TPO&sf%3qvfn(#QiT`J9w^W%Y)FR3YD=Lc9ryCBZcBa z?Ty_a|J91OTV0ji~H5R{!pkhsmJ>(%|A>1f0cqp7DC`EFp3M_E*4F-oUh{0jb&&`0rnW?)=GnbZN)gB=6%Ale?JcoSre0;XU@czB%!#=(GLE;v4L$HI zYfx|)Mv*(SYY|6t87=7Ozz+afBOmF&2x~-w6b35|`MLtWgi#^26ihGdJB_AK7>M3L zY>i)C;!Iav(TZsYVO#q*od0IRg*<-l_y4mu10;=zW$*J&NTGxqEyDba7}}+I628mR zsjg@MKa3f2cKvPenqjx2AIDbHd++Wb!?fDZx5!M1zNs>_G_Et;z)M2bLVIY`dAJ5Z zQ?rju5Ar`{K4Loxz+!hTHgzHFUBlWiU{M2tM5gu0n%gkHD$-$^JtG9qV$%<71VEt& zc*cR*ySn1+X0Lr-Tx^&qJX~_M^tIk@q?~tTWpM-6&P||+iH!IZt=5wa`k_e}?bh(L z2!;!55x5Bb6SIu?#MPd4L@nOcc8@0r@8q$G#l;aJRyyPkC?1XLy;ZHFs+X)TWL5=V z-#TlG?JokvB*Y2m89^#RD=~~0m0JSH<71ImihC-wy*>8Iv*=AkwSiexUx$TX< zs=bL4oaj%*Wi6$J#DAAoR$H4N++E)^&#X-i=BXnZDN{SEN5|Qk5rh6V5=Q>e*odNPC6ihJC>e#NPl>pN6avK_CX~fe?a1H_ z14u-r1=XP(ikcpis{;yNAgIhP@T*7%_Mi(t_pSbUxBBWM?PEscLA4Y*c=wgLFb< zkP}K&4O`}K&(ud;X?cLm^!i$Tt_#9Yf0wXRg0%h)8$&E$zyAv3#SzMU$Hoa3r1v7U zjrcZ7LI)pDf`eo|K3%%b!^-wLBO!b#hr2|PEAU}0(c3nR6zc1EO&G&1!tH3`ASwD? z+A}mbK}QsyZ46I64MI+Q?m92mG@$0?^ice#`hig!Voe^xvSA44P$V_CoXMAZOOMq2itvNIyMp+3z zu>}d~H5}0ZNh6Mmv;$DV16@d4Zcay}Q)sE+_>d}$&RC510Ola5EIvKqzXaL|R@7At zaFclW2iNz$ul!SS{LY0VN|Zl%ZkjowLlpC@&d%#*@rY?v*=!$wF&Ibr>6V+gu9z~E zVz3{;_f2fH(XQW+m{;q{KN3{On~1kDU%sOHMsG5X4|jHgmXF=%)=Lzutj!rGN2;q0 zsMtDuA0pcS z{M_33i3`dL)e2Q${y2DD@N6uI-L@6%@Nm3|2kI3G9fqk>(FEO5JWgFe#ojO!15qr!~^O&0X!HYA1)Jd*__nN~9D^U;Cp zgfApQ9r|mJ^sW^1G7h(4h||GoE8NJ0M1roZ8IP2t<$u=Spo=TsVzYH?oab(Ix=3S> zoP??>s<$eMtA>|;@I{Q+ml4LxSooMTUU-f%|H%DnN?K&h>Wl{mxw`I=W~Kk zygUQ0Ssz*0e()IRjMx*S1ZWMtf?CB01y!|n1_fL+MpADWtYckla?rDYMHs}iK) z{{A5dRpx>(RQPG;O4V4&!G_N8(ey21yQ^r6S4vz@$i5}(*<2HqyvHQ2GTvMeccXWz39hc6LV`CW_b}E5gLK$PWSz!q~6a4+8#cu82}GR*#kq zF)4vo8lkt?)Ngxt)!E^NA745DyrKTc>EL8!oRazed9Yn|3!~5pPOoXQYd|lZ(e$d9 z$Ma3B?grkDvwK2CS9Is&eoeiTtfmCY6OP_9BX@{-hN?N>Pd;$Y%V?8Rn_eX**3Z9N zy4DC*XNxie!$jh;#2p$vOh$jHn_XpT#r)bbX*7{QdU=Ue<~cJlUm!Lg3elIwI}~rw zthzKPe*C8&2H=X>q@Z`Z+6c%TP)Em?YgyQl8M+aLobZiBbVWbJC9y;tiP;n-b?!gz z!8D-UQ+BHQ24mYj_6f&Fy`ra|6;+vdaXP`qq zr}b}&$XCLNY6r!p-j7F%XVT0;?XY59HgAq+(T3Y+TK(>U$Z6^sT|RzB zmd`$U8h+?MB*Wv2Y#djNn#>|1f~#OTz$s7Q@_z1lqhz+t-wrPtMzlhHe!%}rB9{U` zHQb|H%?`<>#*bBc$!FA}Ou=>o=F2Oxqdn1u3*gOlRr)tt@@edG83npwVYpMiJSFB& zgoB9^zNU?ZW&9*2sq3OdP&vvo9kUlo6G3AIJ?`ti`0M^p_GVx(vI`RgZJLqof3PZLmnNZE&+*RRTI z;i*&(=8q+GX?g;pwAVho(ffX%mRU$-qFm^_1mqFDoa+D%I;yET*>h7HoSf8uS=g6c z{0x=U5f#7L37S=CshIPY3NrG+$+^H7_|x#uF-vhO&Hs=KxKa>0^#Nz_k8 z6?ym=sh59m;;Le0jsDsHDka^0SoOuf>rg%UkaoWGMiHi5_ss~&#mZMyR`~cnK8K}Y z80{OEkCm^RM!~?+?%1c=q#Tk}#AvYzUdr)!{`NPJ7rlx`Tvb#f`FNU$8z}(#xCF6$ z6buM}e>c5?>$v+OE!0HOUN|%m*bdf+) z!GXyA2~lN>^)v7@Hp#{nzVr(xs>Yn}ZK|7gy<|q9rV^ zuK%{O)KFC{EX}W|sETO*RoCjj=zBLkxcUOP9mVn{j3LM<0r@{sp5jh?rF@6ZU&l|G zn}O+Xf2W+b{AhG|BzYgZ)WW>K6B#NC{bu`s1@te%V$@ITDgd%_GVI3*M^`W9A|k~2 z(35)-Bni4r<6+@cd=P3#@JiT7+Ngf#qNzVeGiXEb0#fLh9l-0#VHEneHg+3eJHACn zL6MyEF-Gtsj#+-fZ1-7m+E`m$uiREo<$O9M;g}v>Xtbhz>b5zal0U)f6S*6$c$}Xt z{za&T< z{dNMoy5#kOHUN=dtIM(59pCZ8dlNWHGcohX$Xc5N1@p??ar4$uwGmacDfdxR+7Fg5 zEK|Z=9td8|#9t7Fc|4!N=kUh}0w5*b+$LeXnnzv7b)`6_QuYr?^vCeJCs)S)o%L^D zMN^b)f7Jsg>6BpmjsC!(JC>3IbL2(5{q$@-=}_eii(`yC@-viB*4=I~bZk6YK*$r1 zix54aZ>dGW2u20R+dyK{FlC-ugymWc30s+qZTiWzX& z|KEwfT_7SYJ*4nsQ6Wv(aBp(LBc#J?O8dmPu(~imbNs=qvA#}<9Ueaw@5uO&gUwKG zHdS}F1&y0>wu85tX2U_XzhX6ZMsHCf38J_J58 zPKmA73f+tKn8iEv#Oa0Xvkt6_vg>#-{D(hytf+yf^ef1+F)D-C{h;w4$n$b#dim&d zIcrW!P_@#j-p~R8k%hVByim`GCbc}?hJn4AZ`3BZ%3y~ss!$s4+q6)|lCn|Mi-%#J zY`4>QBwHVBE`$BX8B6Amvu#I?2!<%`65r7paK?s5k8zI;p8F9QWiMYzFBd$%r8~cD zEyX|v%?AAbtXtCE@-4QUj=U$G^D?wDP9Ak4gHhn*=EOR}4)}dStR#h9tYEW#P%h?I z-o<@^dm!j@jZ)s=aU#_2L0~5N(?(R;kb;g|Su2tp0!9QrNKEb^RM4_fPMgR3YI*0B zPg4#FX@xdT(Aa~#IJA!Y&_=t_XsmU$>=fNZNvH~U+P{e;I_J!IWr&MBj-Th`Ui`@H z?a$zyBS|8D*7V|P0CN;V3?Zju{?_#mW?Nxm?xnHb5w08Ks}0A_I&KD?dSk}Y4vuPE zPLTqB_<2NcVD|}rQR{jEBecAvXX@*Dbl32*`XVHrnY94}ZV~HkbGuO{*luU}(iC}Q ztBYhedXsj~rZqD*FCwSKPDZI&`V9|pu!Egj_5HfQSeTy!jbyCU>1OqbYL1362MV=J zhW-jJ_o=r4!Dp^hhr{)@Y_$xZnuY<=$(CK5lV~Dn`>SSC)-Y^VmSjyj_{2(+$J*1t zoX#LSXGten%3ofjppde+HEHHH1rlMSKQO8PfE00jOM)*~hrau}g-MR>i%ehvWpuQr z^>zJNcIzd1jhpt%U`O$R@jmT-vO+QzbT)H?f6Xm_VW$jrB1d~oqPgAmoDi^cF=|}_ zPgN%OhvYV>&#@CgBi;p|9}|;+3!8SwU3i~5cy%P6Lw2v#rydM6RsSo=yBjH~iEw(b z6$7(R9||3`2PPM2?pSv$KC9EzC^I7nSvLYWO`KQiMCSO^C9=NamI)Uh1iG9AI|#DE9T;&Om0vbmyw>e%W{cvtRtBk{ZkkDYN`PLb=$ooY-0W!I8;95f7?dC zfNDa(t;}oc3CJVlLm@u)JdB7g(3uE5-Syhv7Whrt*np^y&*ym;C-qJZ2Kd6Zc*gL# zUIjH2=v;)R0||ij+9gf8k{Z0Eu>S<5fn(#?2^j=;Wd&%CTd(K1xsGS*Ou6QM!Dm+* z35|{ARVH{FYd}5a>Y>RiR&(R3E-1PZ2;c1H&8Z?c%F0KW3qV^@AHZW97yG(eb4Hp@ zizr*(zAm9Er?meOQ*wHn*+Su%Uufd|x9sOej=SD+T%KEa%u}i-_1nTh_AOlJ6YLFJ z-pkMBaaQijL=khht+hp`=Lz<$rLdxniK&XRiq6jf!p{^SM8mjQNmZFhz~iaG5NG_N z0&t-Jf$)QrlI0r;1;QL47npefj6&CMuay;*YDkWQ@N;M6AYNe8OQ-u+2?KH~_MQBy zt1AB%|Bb;fKEOHvOpc~LoD1`+@+yn4jB)O4b&$?P&CSil5fVa|AX3Lm=T#SSHwp{3 z+N7t5pZn8Xz|??gLFDzrn^?C4sW76&37ij78u^;vIT+teCj16wA$t07 zJwKZ?7PccZ>MtSOyrGGX`kXr1LcYQ7Y<>pwGLscPDA4*4LjYb5k zUyZe5??7FUP6raBt<y_Z{2Zxg0^08GdqrEvU>IH!Csh$$E23Ka=qDL}9b_92!#o zraTT8cDE5G?ALf6Z_~#?0dE_QbD4~i**VIdMvOm*r2Pwtu8|eA0&?_wc=Y=EwA1Z2 z@14i)jRru*5Jl0Xy!F5+P_i=_Z;e(;@cm3zb28ckJ)w*2pHO|4RBUcTlA-8^T-8K` zb|t?B>Cl7@dW04{T$UkoHP{z-wxDW`sLG2yc2Ai0@)4Iw|?G|80r2CLi_Gh z{Yh|UiM{LGkajI1hu;(X(d}+5&eb*B{@?Y-CPH!whx7$eEYms!NfgBHPek~sEe|hZ zPvdE`-w1zY&v9WB_!Y^qVZL7@F~fg-Qh+q}F5XV?b22?#thTiIP)ZNHhKm<$m%g#b zRQ@UyzaDn=Pmc2pRyIX*CMgNkRJ>mogj2HlXOSd+2rAH(tHv~@R{u+D zaG%N+{E2d0vqZKTX&Rd$^tZLv;$bvc!yM0+7^dp&WDQe$^UvxjzO&ptSwU#v+3s8Z z`TTfL*z(^<6Zte@K~ABS;dR_!KUIH~ZD`?a`{}%lW8J2@ko1?gR<)|iDSKai<(|f& zdLCFYPfHD0y=&+rOa>2v3HD%2=N%>NSVMQ+ik2b|B6dPSj{HR zVf#JG1A}wadoG}Yv;fq^`ejOXt;mXg4yO_Wz;u?8G1@EG9E<88y;bu)v@PJT$?Tgs z2c?DG+-jCE;PREZ>J6KLnyB&%I+iFKJ>e^0ts&e^OUs6Qg^EMSYjap=kX>+ER!%dX z0d0Zed7lk3k@6zr>=&1|YLWb&<45_}iJB8!WI3`AM~~WWf7~89U}$iJf+@hx4tu?I`WB;~@-hrIKR+shO^sj*lO0J@MLt0`Gm(YRT`?{e6B+zmwlxw~w3{ zoc^-5vxo4RY`{cgZ!N=H8qvbs!lulU!@0(RSaAQnLuBU_wsw`es$g_iCYkCIiY8tN z)cLQE$}9Oh+wwSlNBmq!O8 zUQMYIPW<>(yU!`i+y5~$72Dfc<-_bc_49U#!P)|dJ$?VU`PrW}u{!g>$!`#uRA8-P ze-auYQ=_Y(Alu?_-o6xYa$$Wj(}N}?J=M_A$Qqwx_=RFCB)HwH>0wE(VS!WHmAonu z?Dl4-F5%E)N>yoiVmJmVJjw&-;bDZ{Pgzab^Ystt_;2=TSr{wFjgI(z(atY_WmXON5YYurLAo&TzI?7?r%%WjG{p2>4cQ_Gh))`OeJX4HOH3>mjlqFa(Gg+9@fC-le4wW;@k^kW3qQx*R`5HU1UmJ{{7MyzvpUrpFSo zdJnt->6+6)86`~I?CKz~1 z^uxwv(DJ{sx<7O8Q`$t_mTYkrV(R0Sb!vdYIZ)C9aymqtegLAyFnpRzhaY-w}x-UMKghQL|aF*N>VOq?^+DYH!*i_fpsgsRypq=Oi%3)NNC z(d~Bl{^$TH7>VA5!~*KNzch!&FEB{3F&<9ecR_0YRqp4WOB0TTWg+P;9ShNWDOdLv z_p|obxLoen`E%WKhr_obAqw7n_=Bj}}DwT!Y9-!|tSr?DF$UvWEBf&vcVg zmo-*V?4`tvBxp8;y(tb=V2gIpIUl>foWcJdGOE36Gvn&@aXrfK?y$v@%C?N#9bfFt zp`=iRH4HY@M2)2!;Y(K}-Mqi`wHE$%{8juW6s8I-h+qlR3u#Z%FOU?Td^gh4haw*` zZG_;P6M3$$NeGR(dW2DjQ7C1HO5AQ)(2*_c~d3~ulChP^<`3znjtW3>H~=Z(#yKR0k2N^O-F4!0qZb0n1Z?E04E zg|)w2_v`=_!K|~Z8%zB8PXC*!{tacT$UvC=T^r9kpJ3)2!K8L~MrQ{ojEA5I>Xuvh zF&%xqf!N01GApUvk$;ePl~G2N4%xmWgLw2P`R328%CB+LPLvtx9V{d%(OFfOf~6_P!J`lek=Zh2FFc1x;oci$ppX7TOv3LvI8b2c z0#Z=-V_5G|b%Pz2$A6@8oE)4au^Fo{VHs)WSnSt_#MYfStQ8hum$?PZa37J1`Wd zKn{;5(El`0%x+3)gZrVD)2P?M08^K6@Ff{4{LQtSUbV|7Cjm%L5uOPc0Zbs-5?rmrXyLgASxa;cH+IL ztgRmTst-*xxfVHFw#fMOqNiXYaE(#g>~c})@6Z_teYTGIb@DW2Uct$>V+ zsw`_6r}5qIZ}#WZ;aIstCXxN=X+%?ph^Yt}QItn04A`Ul2+ z^phCH{b(e2n|_@@(qo<^J2a+S$e6RagMvU;6a6*rk6jq4J7@< zB_xC;S!ZbyryW3HNps;5P?NU$4}z{EOS?!RW<#LyJJH2VP|a*ZMe|7l(=+!`Pz+7t zA8tapyqh}C$Ry^rkwQoB6y``!iMe#cmz5T#jnKpWwlMXSh3elW*}p;2miWYD^My-I z;vM(}pe=hLV9GFr(=0%u@Mq(m{m)kh{OTLl(7Dq&*lo^br1DlWGDK~Qn;mJ3gK5F) zC7un7Q0@4}L~oGTfza=o5Q7H?cg}Fu`EQv^^2HaL1A{SP%XJYEV&9cbMRh7cO&J*_ z7ua3%Zn~*e)0-Y0FeZTZ&_Y@@ZCD=uKT9TX8uZf%(j1aUx`*^r8Tgm|_xF!sN>q>F zmg&B-9)YyW+08*Lruxj3n#Y1`)ra57eG(Z?I84S%XCXRUu4p$THPFt+#k4sKl)>-e z;zLWT4uj1P3ny=90n6Bp5BIr1ZQ7q|$JJyuu|ZXI0$d zrOnxIUWYZ;fX*WQ`}ye{!!4B@0+zoNbS`_*^`J@sg6oy6Ld;@oiZhsR@_{H>hGV>mZFQAVFW z0Y1hl!yRp9__ORM4yhizvp0A|dk`237ID#oP}-+k1Bw3ZSqSM;Zyfx0#-Jnx$v=-W zK4%yLExbfElR8*>(C`NN@S^zFjIzYE1ddzjC(uZw2aQxs9JH-$%VE+O-_R*8E{2&{OhlLjO^Blsw9N?{4XFx{ zRFK^Rq7oBm!$eQJI2B(1@}7#eZCfEH2&O&924y#(&EZ;}-PF*7+X?b4L@Dp;c ztq5t&rUB#FElFBW%`MF^#%WpjKkC~~et>NaF}F|hvalvu=7BW!Xq7Jqi&5yiu=cp5>KKvidjF0 zONRE0#+1HJ2PN|lvOly?<8c@sde~7lEed$c=EmdO1_oAj|mv59fnJRCpgFwMp}`x;WRfCA< z)YjEhYgBuJ_c&TVl+qV@_Iw7Bn2_n?c+m`SDc+KNcl5Xm@hEdp>5uM5sos(}9eaIb zI}ax#6G3{swsDcuak;dk zczS*JBIn?f7;q5~CDHVZG}CWnWy3l;h*D=znq%+Rw*AJDk*OK!bQhrxsAJw=2N-O7 z0!z1#M%~v^xH+7c<}BSh##iQrRrza*TDiFC_FtWLG9qXaBKp_`^OxFhkgxoL5>%gI zX&GZkfHT3)-Q!h*E_vwr*Ne-BckSD;E%CZEx6gp=v@eOa$${})0qS*b*R1yTL6>cQ zXwFi(%}AUXcW4(o{_FNOP0PWhMaUR`RF{ODzq|NuM%FJ<01>Sy+?P z_@&vPgpw`wARmWjP2tgYI}H(gC*64lC|@lQ8vLT&xLW)!OH?UQOZ4dd=tgY)%T(N$R#jK ze3q%+`M(Q&LQqwHX{G;uBLJ53%a;JP2>cE{wu%QB`GviMZtEW4mjIn}IhzGFn1WTCez6hB-GD1e~~-#d)oLiaPjCZc5=u=iwB3s|_Z zLsd;jqRkAzkO7&n3E`gEFhR-s$Q)tDP&cgHygW{i)#gI@x`U!75p7T+B8I-VfV|)( zF1&xaz+tnH{wgbPgDI9MoP2lXFjy&hR6Ld3x8ZK^>)m_#`D)Q15CtUR6#0Z@{YFHu z6%?!ho)S1kXW!Z^j{Owhim5*ShYfg+!$lkkWhaKEhD(TXlvz5=)kfDejN|=h+(PmF zOjLF?3r2xILU6l(Dnq`s_UlsOm&;<+!bDKd71abC$RYTqcFWZ^mr;1>FG9SVhlQ^3 zook>G%lp`2w>gZdo!c3dh81_kt*D{f=CU1|E-Ur=AgilO3u}r|?l~DrsA4Ml&fVS@HddZT zp04sxM8>1W1tW@sCJ#L3TWUX72oiW{cP!b6VQckF%xs7XNzGnQES|U-+$}M1uyR1^eN5|i zc)ehL`|AVA!H}$<+f7+JUo!eT1T-a`}-8{iblC`15h98R9egrfU17}9ZIcDIFX5;Y%dARzx z;+WX&;(49m+KLe88TAm?mgtw7$~8XbbHJGza52`kFN3s z%jmTBeDb@^oKez0fpkuIhbg%!AU$HJ9mg&x)WLSP&aR)lI;}ddY6ZZi-S97+m=4#(F*dZCnVPUGVc3!Nw=DZA zy&?7Ok>jnqMesA;Rnvrn1jEyw&~9Q1{HvpY;0m5EnsoJonN^+lyEutky@qxJ-U}%MAq6@r$Bf1QucOrv*ySIKLk5Rk33*#T7=T2z zknI}5@oIb<7L_?*>ec#nMIubJD!UuqTbIu}mUqt_3k|i+c8K`~lxzu+oszuuaF4&J zCE+tb?-75iPESY6>2r-NZ)Rk}{VRDNkY(MxZFTs3`$i^;noBTyavB`!t^V`ll0VjQ zxYX>iSq|01Nap!oLot09>yDR!jS)s~b!K&TaB$d)$&2Z#`c_LYKfB!Fw)mBBt@FzT zPy^dRZG${<9zWgQwv0Lu!M2X7bb}3n7@9Aim+*?v*Go8#_bDAKOXEgx3$23Q^hmxpIt<~ruL z%LUzPU2X-tEu_|+_4Sp!ZroD|6|M2;0oJOTrIZw4pi2cW>ir(SQ5h>P|NO}s0CKn* z-nIeg=%C0numeJ)%^u2Vuo(fjeeKJ3b>0Hd5d@lJC^m9??KNeUt(;^SR77yifp6m%h~GT8Ak zH?z zI5`TfWlyB|-$(H#_!#*Ayw`UGtZ;uE8wg#1O3dx2IsaiQSW!0i<0?%k5Mf_VXyq*& zeN3gyDPoUxO}Os=yB$0eZ;lr#B90*8H9ywJPDYQSt@Tug(D}s5L4s!$W253F5g3hQw;D_i-# z&>sx0vv|b?-iqO=0aPtBH}}n6ePfHS^BqAR{bIxLo?PYi%kw6u3(n7<@!3(NcA}!j zsrcV>r`ffDT>!!73)3y^9E%7NUA@xI|1NhE@<9R8!#=fLGF%FRNOxg_N^A(2iltHrNgvF(o3_}(APw~piNwKg_35d9ac4HRXYK659JkFGcxIQDd# zg~K;6h3`|^gGf?<`Yc8N+$^CXxF}2PyM#Awzl2l`qsf!ITQEwa_&yf*2vc6b($ws7DG4b zd4G|PjS*LGWNkoR`Xd)NHCXTb-VLv)yzZdgMYI=?BiKTzh7S<5Igy-{ zmX|smFL>crXH#fg8-NDAD}zqsj7M2iMLV@V1~31{{9l_+iIwxGyp6F@dcK@PV!GP0 znemk$*?J%+z9LYTXXcxn4lsN_txxrnFjK#!L;^q!4otavZrZ9wF-4JK)P8pm)X3;K z-5J0ythtgdEJMomhL zi=})XoSTISLvnp(3|`D0cSBEFnwoJ3MfY6RdO}AWadu{Q?df~VLwaDXS+4vI6$53n ztE=E->rQ1rG0e=?TqiMZ+%NfGDmr2+-`heO*16$Nb8}N-j$lZgX-s`DZETJ84N#xh z!L(DcQe2&#)3`JWpAcxHO)w5*91}o<9PIuARmN)!_HWD>PVM7j<2HHh@9x2;U0km$jV%pd7cKw<0REZ!~ly3Kw7mLX5j7kkW`U?^9BOv(yPhh6;zpX?>)uyYND+h>3iYzVIv93kZ3FXA%#xRME^|6qz#bT3A~e=>1Scc& z!0f01+L?QEVTkx0!_b?fo)NT5Wg;4no{Y}K*y8oZ6C}PZs}rC4+ss741{kX_TxCpX z7pM&AagBlo^LRtP1+-Oev~{E%^DH99B?YU*f4ozPBTSeZC=4 z|FQ5+Hb?8MWN0(8)>8s6+H)~rI1kuG_025%mdp-~b{~njC=u*IQqs}c*cy4fB{IaE zLcix1R5X?qZSMpC!A5kGlPe_cubvnthm#Yic`d546ZHkCxGbNLd7;MNfyl`L)1?%S zX&ooW)8(bLNPZxe3_uJLaHml`u@@jd4TVxX9&i}badV@)X)jge;l+{6%{m*GPAo|a|_;2 zb94}5Vo<5wPxRaUC7{6RAZlK=T?T{d$U#8|H{D50OqqgQzc6H@Kg6%`H3R|kg0KdA>c{1pB< zfIdiWj2E9n{uV*;6LFO!%$USp(3p-tJ}r?Ib!Jpyo%IoBIXG08XQREaMwKWULUt5f#F8%sDZG|_fedL3 zv0`5d1~Fc*Fu6A*h7C&_+e;2ZWW~yA9<;j~LEHzgn|uuZ&4}_7s%8)~ow&lVa~EoYwb4EKJcx z^nw!`lNd@qPzRBGOO7wV01S3dRRE0NV2yk0fr&$*kh~Nwi)_Hwof3f(??wQh#NqHMxKm8+{14iB z0HB?sGIumj3?<6wB;JMS z;dKqczPo$Pg?Op=J6Ub?-6m+6z`^24soM_vUZ61O-@P=*vwo8S%S%J0TOZVirj|yR z%b6u_dXK90V2uj#UbDQ$V#pJOA-&LYC2K3sx(;yzoa_z1VGZi6i(|`Kv7qC5Ta61$ zjUSmgzkkOTZJ-YI zLkP5~Zws}?4+!|9k9!+SW9xw^4juI?-zmn+^<*lP*@(VfJ=nin=P9M41Ee9Ml8q?| zEM2fHPReN>ij;Xfg{w58b%ln4ga0>h1dyXRK*NHp0bypRy{fgbq5wdVrN#e}g+Yac zc6xW%z9B^|*Zx#gKA@{}Y?L#AQWfu)8YZi+wTXm_tf=G{?S}K(@iO~2ghAu?sXCqK z<|qq>3yQO@xyHG=8^q}pkky%$5CVe>f-49}$8|bTZ}1l_2OY_Fx!r3W9$43y95-7H zH_LtJes2a#V=r-bn+#J7%F0U3j)L$rlqtnQa#BJLz^QNl@oJzixwCH9Y@60&Yq9fT z#&xP;d3NRw8K~D80~hs}#*C;P*5&E1 z91rz0x5a)(T*{WrGB1$>!Ur$A<8s%7l_II77xdqez?5h;afQm%8N2aAIfr|qivB6Y z4;f{Vg}2EDD_|>W!qXipq{lneJ42I79W+JKlw8c{-9i)N&}Fdl&q9Bgvw+8tj5QY( z8bv{zIKNKem2Pwn-EAo^&SAIMhel`N_uQtNzw|O)?O3^CgP{LxWCg+FL1yQL&|hmq zR8&^^cpVb^Qo5qXJu}yP-*a*tIrvvZ&~kEKHYi_Pqzjm7zLEGGChdnG)Z z#TQx#FM|$@D$cSopLBcL^>{l{N+l=@284s8kDWHuv>zKtFOft;=T?bnYv-8j7wsY~ z8_n%-lhFR;SB5951kFLlzgHkObC@Nv#R|ykI8&mu3sn56w5I(WhY5#kvB{CN}#T%};9aKTNcTR&ZX)W_TGuQscKSP5JHj#9PF zWhbVP1>{sK>=%z9QlB}gg+Vr?@CA7K#!D=u&U>%>$1NxL0K|ryds+ByfqJLwGaHka zL9qKId+oe)d;;$&Ln+U96r2HwjMA5t60Xx3k4Y!iG?m70QqW>>Yao6FKL$|+_DBu% z^c^5HFuSkGqmzkH`O`ytbu1Z_m}u4K{PO^aC%HjHTM;`KWxVjP=#U(he_}DzKzIM> z<9V`{MJ;(hQ9<(QqVDY|Jvcsm+zS!>;Fq5@g6}i&l?^3U^_J;Sj}G5w!}6ZAsUmF^ ztm#WcZWm_2?MGYzMpT+v$7-wI&o{4*pR* zhi{5`nuGZaP>Eg$Hr`H-4h0YgARyq5Jly=JKUh+O(&3Yqv?LcSj@-8Irfc7NZhO`z zJse-Ass)Q2u0=*C?Sk(>NS%k06OuCj7}tE{fo60$OW#Em==J#R?MErN5({!N%A&;y z!uSil4w8sT+rlSaGo&4W4Q*Ow<+tl@+{IsYFNbqD240qF3x@3c?{p7Pxwm(Am1=OS zYw@fVQxsEEQUj71=n@{o6`xQN&YXLFm`gF(y)_SQL2)20|L$#6)4cyKfcg%Fh+#3Q z+!z>(Sz~E<@2S=iV$~T~H%^7xH^UvRCA#d9d>tMfHhP{Klb5;#Dc~X$ghH_i{CS8} z`R+=;797KX=o4x&xcVX>tKM&ew!5IPyB`RxC%dn7!mcZN&SJqGtlDp@0kjsuhEU3V ze@8!PfK3u(W94evEjF?O0|2E}n)aq|+v>aFr)Y~VP3SAbq4KsL`%a26Nm_36{7;fo zs9_E3PtLg`ZC@@4k|H`fMmn2n(HNc;eKf zSQ4ert<=gu($5$vXrkhhe5NI@{(^^bfuBFg21(x=KI~jwyXEm%&%MIeVSpq5PDm0H4t)3ZUoIkBIRvv{!0`qpz}X;Y2|x&P;Gbso=9MEzVx1s^ z(FRADkOPqyH^j}Y2GJNX)d*G)B1mlf_W&;iq;^A=`~5~NYLh6E zUsCgp2*yi2YO+v6*6}>HluJS&agc(9?y(|K^e=Q_%HKaXIelGg|6cu%^-iR;{{_~E zYI+!q`p??BDZKo~_+b%K?DdGvW2fmM#ANFKc{c@wT=)iXps39Q#spI!X5^r@)I zI~Qc55tX>Y=t{!w4=~`g`6L!qe*vqW@b*MZONM3`J6~iUYm$I=1nhpM6zWRVRMgzoi}u zrSzG2|Fv^EpV-_p%I zD}G~inu`URx+=dKL=l@^?>TxD(U2g`VfSa?muHX$)!HU7pyF)6#%@R0P!}F-<{_us zR@T(U#l?FzB$V+R5IF?&r^Fd4f2lSxcTz-c~Z!sO>?NN&E_CI_Z?$E$DDNww?Tt$eya z?>a{v^(n;2X)+snroPE2UlpT!8{C2W@dbO>%xLRzg)t;#vdp&rILD+rQca5fMHgtG zLTYyWKL;MFI9j>yMb5*E5qq>Be1<}0i!?BPhEiv#iEDJ^_4e-Z?RTrECkTPw^VWA} z2Udp9_sMhou=Zy{0X;2^OXj6)y%(s|I+EulHk(amf2YH166v#wB(;guxo@*;B z3mj&PjoWOkW_LPs3(NYeYap)$?UPkePGa3_)3Fx#_^~%KuM3lxAI)9436JjmXcSyMYRMFdsrR9IUFrI5iFb>D<+a4P7;` zqIKH$kM%mS0&s<1E{)8R(oKh7abukmlGNx3*j)@~vY`m2$0a7yyIr@h-&E~{A7%vs5ffe09I92w(@GS zyiUV})#BbcR4kFtu(kEcJXW1hpZnm5l)Ts1PDEk_^$BO~qD<|z#KCowXZqirfMq27 zU&<=!tM;S5v);jsN?iOJe}Lr(XlSBBsdz!VUK4eFmYWk9a;M4adc5z%^4J8590rB!v8QyXAd=5eM@we zZ;{x>u>-bqyJm6bw{9TFaxd8IFyD$Nq=d5={#9qUk78zS|ePBWSFayVD z1Ix}pF_5<~>r}$u<62r$FD;bLlUY*`dHX{l&WYzSgdfnxRMC^+vH7$Gxd;GpNn$F^ z+y0{&u*kTbQot-GAlTQH9x;w{6>2@hf=8{)UZ#jU{(9t=r+06{#r`G$CjVhFQjZJz)0c@7w>@iZ`7|;HG410AcBNcJbs_s!l>mO z?e;!&;h~a3FB|QwBw=Fpi6XONF`}kQb4&QU+k2C>K&2BK+cgzc_Py20io`kX0F;Sv zbz(3@3+fJK4u)x9x#q|C?Crn#H`K8X4CIEl|E#pI0?Rsoivy|ID3#;xw7`@8ro@u^ zSq7T1I&|N7!U^hm$ZvC-G|q9AYjlcHz|K;_%jt(938R#`5KS0&4fPF8xIaBRIidf8 zv-j+#9IXw0hR?*LsMyON4zjSYEy3jG*Wz5f%1_FXk-Z9B^BsSsD`zSyaS5n3tcd)C zog|#xPTOlc_K)m(R26agTyOjR<|1g-jti&<34|HhA?73!bx+QIFE9W}EHNP~DX?3A zzrX0)=kvtDGo>hX>hCO05kaC1XphO5q$r)Y}-)MPY%TuF8pM3VWzI5F5nvp%PznEQU#~ zfHE#s+dIHYA6#?LKH4*L)_THdfBqu_+Ud{lV6`*jfQxq!k%QRyd4mk~A*$6PCS=l_ zctqo31=UgPZ*)0{f(l%`M9Lq>Gr+?oFw>Gs{g{Xi{^8CaAUa(!Uu;VuJ130o z7-sA>$XP= zDJZspgV4Z+pm6Jfl;%qDk|PDtZ#8A>vPy-RNScWW9DW;NdF70Xl2@89sFKGeSn5di z4W2ZO>J(oFfV4wN8hE%%X$EcJWsfkco%hJMGL}qDT(iG%v*zm4XDsr%H@CAAk#UZ` z2kJyg=vaRUb|_hfHIN30xaW9i$mv`C{=_!_3!>VP@9;~Vfhp(MIDrz0{RK+g8WB`- z4+yWAC1s$vL38iI7zk`zFjcj0@pW*fmU#E#K|~|eBTh`J8G3oqyd(Kv@_)H<6I0Lc z1I<1a5Tk5uY?nAVWFo@*y5i!ae&1jpq=aZ_8so>^3UY@+=5dW0Y}BD=Z9vB52#9Fq z#w+le;}ILm!o-R99FZ2Yv$39Jrt3qR!;jspSD3Y-IKxlK9rI zcUO&_*jQkEMs&uTJu((lWooxdl6*C7E!e(XE&z7v?P8bfs}zCWNFp$*;9}$ZovI@u zU)ne$h+B%2Hfe|$Fqe&|p25DfO!D^_M54p#%eqD?gS&)`dtkoUTwh__ zlViLrY`ss6R3#b-LfdPIzpVFzxQ{4-s#{gaWAJu;p73outLN80XQAf{`$k>Xs-0hl zCt3)PYPo_s=^u{MOZ3={_7MdEQBX+R%a}@t9y3fC;uGR-Dwft1bOilD>;44$&kE}h z`NJb{#Vh2Z+rNlQO`8R_4Ac9hGZX_Fl{jCQg2)g36 zu(bvYVRm#>o}2q_4bBvEIZ#qjt)!$KNjMK*qNE_F)llF1yNsC1VxZ~hBGv~2XI0$* zYJNLuQ&5z)>DMB$Gh3v_U!IfwAd(A6uIU$p%a`o8l_*5hMA-1RWvetVwNUNGrpDRg zRvmxm7=)DTwbz^XrWKB_v9WON$$z@4G-iMR-#TAY|<`I=Q_a-pj zUwSG~QnPK*4=Z%sI@12kj3$etp*0D8bJ=4O{ZuU~V&Z$f&}r}J2!1se%iPe&{4RR@L_$3D7>VPF)@g4I!riNX@~btD9~ zS6E7ZGqxzn(Aj9JWn_u!$v{C;;#R3WyTKjV=j~f27^5P@><_x*w*$Khib^Rly*U2J zxP=`EwlPJ;LXR%hH?~ks%tUf?7R+J;A46zr5=1B}E>8b@d>t5#Kan@Czwb7dUyP9q zE-o~^a+A5aewEwd=`am=sk6jTvw(b8_-28VFTX%2S4DgUD35dqTdB(gko!_RqAxGtI zE5@Pvsi-}9~Fd4 zZf~GNzmJ-12Lf_=t0)RYlpl4{4i)e?W22h{4227{2DwJ)ASZU1fzf;t)ITTZ{tOp3 zwqTatXHE@_BzSs8P9lX_1;ln3#V_HqRj&=khQ?N8rDcl0lSvH0h3tkpJv+=s*CP89 ziIRq$HidD>4T0$IF@OERakz^i?#N(m|1u3bmZZcD?+b7iQCtSWACh96UDRTWB?7uO z=x{6zVg)H`@hF)f{D4#D^X*742Z@1G#?(?%^7TPRDNqQT}%;~`r9RU+x2}nNjjB< z@F_H(pwRxPeDnVEw%HTmxUAGM4%5z(-tlAZh_nHn0l-d*=yw105ZY}(K^-N;>Vp}V zAL;~R7j<4gIM%wH0e56Z-*A|OO9pK(2aSc`@GzEgT(xIp?opVZl(j zBcc93I3gwIv6eewWnP1WgGGqrm!UpAW9vr?TktnSlbxWN19?zJ;@}+jv4|%O6_mH# ztBiEcDRj?SdP4l|UyWZ*9VsIiT(ZeaT)zM7q-GWhKqV(+P0!*-8?N|)v#0Ql+x!GV zeZ&eDlbX{zWHZag2cw-@&UqokbD|GSaPY4KJTsE)B`V7m7OntzE z9?9g;VipG5)JW$e(_f;YTZ^pnhu-h(%9?77f5c_Qj3zrpXO_BHU-h|@IM&bXmX ztypL#Y{j+b9>9l>KmV|k5tFBOl~~%EdwbknJ&QE}FZ4?3@ge%O^wh*D48I`gNT=H$ z+&*U+#R&m+JBUhg7yCJ|hC96Wpsmq_zzMj#wZv|_TQ&C{C~7(a*SM`SF&HZ~r3JE zX|JQ3a>=OJ>nwG9l-(OANdwF|i1}qYIKR)(z6D)%`!uGsi*K+A!m01;=%El-M*PhG zH}Cl0Y+arc(U=JjCJ12nBuy<1Xv3RDe+`5U3!m886@My8M;to&qqG&n+mh8kMb?XB zl4BudA2GT_U~(7UrQ&VaaRPL^O|{LMC-;u9GL^7BIg65Pmb(h>aGi15@De%le{+3T z!ToyE5%-vOhDS4I)|^g=lJ)z0Dq}*tZxcWVg{&6|V((YdSA~-&$2yIw4*(&6&*rO^ zG_d&pF{`c9D*L4=6vBg)|22Duz}6%}9_#v@qdvcxo{Sh%?$40cRzI!Z**=HIA=o;o zPY_{OYx}jkk4tsK@E@TZ5@7nmmawN+?0xNXAA!w<#7uT>X1<(~S}r0S@VfRqbAl`G z4btFod=-Unh_vyCM0P%Q5O^ZGLrHbFxi;{2rQg!p zak+WV*d8#stA6DP;e#1qwEJ{I9kFbE5_Qo5JSOKF%U1d)thd33B_-lL2(28_m4HTG$CVgR#oKL$#`Fn1PaDPHAHL{vMemuG%*Ir z5*W6E`8@-A-u5!SzOn!9hKh~J;E9PUmcXhBWJkn5X7XM;Xh&L9k2fK{`G7jL6%-Xw zgJNZ8qlRP?ybHnm!mq3?2lxx@JS1GNrv->viGi4)VO&cqp;V@a3Q{)ap=)dvo1vJ* zgd{1T#p-&K7EVkYIQ06O4W}xn*=;`(%yibyeHbDJtYf}T_pZXOE)|5e^{yTb>e3?M zMsa_s6)6kV-tuWFgxNSf06XsF)Xs1Riv4p&+kg)_y z9AB#{uLglK6N*r+YcCRpxQ3Dx9U7^&zP<8PT7dyiVG=ThTTjVYegj7_NlC9?i;Fc~Z4JIh zkr+LC;BvqfS&3NI0r!o9$~NtvZeD@*)4 zfgb1gths(e|M$x;-x-#ZCYKlTsz4^)96ZrLbTlPzSF$86y>JmJ9KM$7PoG=Ew8vbgkcEky%UzGvY!x zKVVhSNAZco$mK4J(_;Jfbh5nP@kKR7v*F=r=iyKu*=`B=^XGqE(oGpHo-_82TJ^!p zKxN+U)r)++@o?~s&rG`y%(fYmmK)BnQg=q(tx>LH!z znYnaNc*h-cjGY+?6L~?mL+tjTpNXt+-Zd`^i+lzo$0SH!iPKaDk5A!~=I*ZCxzT15 z5|WxOtgycLm1lh8XNk0}Irp5ye>z%2S`>$lj;716^$M|D(5*f(w-xOnpKj1)twx7H zU~M0|{d-~SQS*Irhlt#0hqc|rsO}Pdk7t<)KQ|lyYH&l}QKFd~H*leDwfep$Tn-W< zOoajaYh&}{-wYIz+j5vy6lROCOw{6L{?(PP=L^T^CL2YY?ixPC=R_)l97obB@H2X~ zVVqJixhFXvfU^*-N6bgjrN*T3`9i~abC9y09Y%nZ1ADDAXGlKVLu=@rM(SheHA2eP zJ;J`cFje27T>8h2-!MwAetl-1E6*Y?020?cZ&xAo|1tHB!I6er*Kmx9ZF^!{6FZsM zwr$(CJ+W=uwrxB4`keDVRbN&A=s&Hy?%sP}YpuQ3Zx-?b<;>;X%DjJi4E?R(riO9x z%ZA+|gGCgj<#4kcAGaDO*V_0yoj;R9$`T@F0F?&R*Qk=D#xEg!Bc8#R0aYGjIPEIE z8$aV1$G*L{`z`qfB+b~Xn8*m;W@}%-YfEX<2iVun*J@rEQ(?9~9=$v+{2$sZcXyCk zPJ01+6<4J%6vM+e+7EK>=5GKyA;J9i7?m)&-Es+--n}6l@d7@1=0$e9r=sB9*VlDz z88K#V-iw~EQrR1xbrp5<;rq5#(p9^~T5F0Ia&NiS9v?Axbu3EAU_^(YU0rT!$%)c@j$M27$l%La;{3}Q(uRe8qlTS?DLNTYIDW+$ zoauF%&dzZ4{7g-3xHh1{q6O5O2C&zBe+!ZPz=cdluQ>rwIF?yLg*-*O+5bKj7|4ZP zQeI++ToNsZYi-Wp$ZviQO@iH5v{`CTE-svkUPw)sK3><(>~8nv>3HE#>#V}6XZ%eH zqLqY-wz9O;q%7(JepXYw+^zT_XG3tC1VDv(ayrNgJ6c+-mMqp%Sm`iqw>z9*KB;L* z8s2x{#2>lnu8odjdWb>($XW3NHSC7Nl#~uqs344JTK#UvuVmK-m4=Pi%iY z9T(`DB+%)WijhLLieDFynMu7-!tUBC8ZX3HDpFf%1wb`qw#gP@P~O9 zw6ySYFpa8=F-g<4lQts-69h7yDK3<=<#lSa0}a3|gC5Inch%1$Afs$irJAIUJG4mG zG6Cur#s*_Q9mHYz{3Y=3MA$>hPfj|NaQ;*k4=7=q$)Co1UGt>^9v3^q`Ts5>R^BA= z*5Fi=UbnXpHq7iyhD|?dV$1^laqgzTTn1s9bl^>OTASIw1d7eoU@&Qykq6zT%+(Gs zmPKy{5ePwPUUM!!b)Q#1kqr2FT+&X`04QyQqEi9bgdL|j_-2Uq3O=ja^78g*r_7Wp z&6wQt+sz^66*~q>b{t!Um%{6>1@@4V0WPO&x2r+lwBHuzaBeS$Xw85OKf!p(P?tQr z#;H}k+}?oAcNX{hdxtI0m#96fJ!_76HBs5)wgzhMLU@#N!@Ak6e`{MshAgeA7P)|I z=GxiVBc-M#!~VF>X~6CHyNr^z>q$UVWq5Vcs4@Dj2?YcA&Zf(AFa%lxXsR0xe+Uo0 z9F(QouAYS$Ala8b&%~q#5Fs63@*1MUW{-9Y_J%fDok2vt9v9(67nzvAStrx6y^6zy zq0xF>5PKbBd$pd(8xzxKu5nc_1ksqoXhL(uB!};3sp?*SzGn2&^$x^C<6}71C^y zoL6Srz`GoHxx*sc3P=gxntkEBs@F52_^QtZzqU<}RL|%2CrdmpUlZz1o>1dJBXHk$ z`qTHXEghA=ze%Vq&p7x<$ar@fZtNTvQmQm$v{^2`lezgVEI-U2<-(#XC~JUz|K3r_ z*Q~jY&(bbxSYYOMzL;;9xtKc`!QW~}kW*CF#5;X&2~)e=!T0v07@<&3N@XS*OfF@V zrv~gO{S^M;hg&MT2_Fg;NfYipXpz+g#sJ(BdQ6&H-kx%j8ox<6ua3_qZ1MS4Sg~P` znRiGG!8hjR6yY`_4mQu{3vqU_w&LPs0H%Vj7h8C7U612fB%T+OOD(ZFPFHI(vVz~5 zZm4XS9r?<-UiKYuy%G{Vj@KDD8Rj0hc7c_R(ligO!TCvtqj9iE#WvnUc~_`#32H4c z2-f7VSEh)?Wl*kPbuxx&J!iNmL_tmeJ zt|8YDSO84nd|3Ve{Mb6=?X4)u?T53#5&OyZ3I3%2E%KVx z;xi{;fm^Id_S;5|g30=Rpd@a|nt{~*p$GPP_{f8 zrtAS<`0wRm`5Y7A{$ESQ=G8ADUn@8iViTvJ&kx~IXEI{{B44A!B=!u<(+NAIdw?CA zr+5_Ek6>P4$~u;Xe!axOM=U6+q@kwZ_CDL(s%T#P5^zb8i;5;Nv@~b2;AqWhauBq( zrd=__K|yEr-TLc{S0xoXQ}5Q2Pftbj*P_ON$pv-Nz__U7!^6ipgMG?lKdAq+-(1Rs zVsO~K%RTl-i*b^Eb>9B-pZzfz85x`6<%HD4e8OJ=cO~(lC!-D`lBmRPivLt^TDov3 zC|X(?6`N9?O)t{Op>gRc@u=v7c`7;@kd}}bEMN#F6N~n9psBQ4@kQvN)57Hz<%{Jy zaTP=kh`4MP!JR<{PCA9MYzK1%b78%I>p*Zcu8?e)g+e5ir+#; zLrO&HmS6HKQ-KpYPzhs?Rte^{0N4>%q5U_aCLSeH>=J(C-4!GEd2KVjAWq%#geniyieD!)=(ndwO;5tRSsW#Psv zK*jz1f=^tA%uiFglThI&lj)gr${6KWJ`z5Ny#G#!%O;|QygPkdK2=rMM8iRnkNIcgQBGto3b${LzDlz@T)!TdK_3KFRaIm(nJ8F^-sa;Qybc={8ayA*%()#4 zLaJTjT6~?v4`bIgGO3GDQew=C!=Eq%9L)=KjMH)bt@?5x<{*tr#dRL& z-0M|R&=@7S=2d@J17psq-Z1vOz+T;`$yP(!LwMy0qEgKz4vDEBBq0k9<6=E6At4tL z^JRWR&zIKZ?CmhwvS@oJaR0OUhcq`J(!?wdRxWb(8bvZF3-F&1_Nn6_%ZujDrU%T6 zWFuY}kUc^z(=aYJcV3U3^_9|0a3Q2t1f2&AsH1PGBtm zspmq4rmu@uY_AV&feDkIq2(^|+na$_hfMl|WPu4DV`8F-Sz!XC?9PK@J8%8Yc6uu` zX{@p%sIltW+TOc2*_&re6CHBrrqS8lOUsKnoA&axsTCC!&tFZTx(+|%cy@?S+KB<|LxD&a0yT8odHi;$+DJ+09&K!7i1!ej^xB!Fn2&W#W$ z*XQ=)ic+j1YH-oE4+)k@|Jw_TlcU4+7j)z?qqo;9YM0onz=)CfR%|=e4WWJei|O%Z zttJ-<8znLJm6-kJf)V>v;b?3h0@E)C!xHJ+)|XDeu}J;cR!OFa6#q9!^rt>x>e!p^x(_oQQS{`4q{9!X*8YBmikRg1IHjyqdOc4Os{MPC4%=(qjLc~p z1w3FR2QGP4iU26-^>6uxYeG%>I8zTV0|lF$G**Js2CQKWiTpNailDwih-Y91F7?fD4QY z3X|!Oj{%qSe+O?2u#0dM8r%^wZ@JALebZjk+!7Qen;NSquiDphoNJSa$rzflP^2ZeA;(Z6ZxbrPnC-2~>V_e^$5uYPdX#hb9$ zHzYRXYrI!vkI0Ja`r-i=;gr;L+U|A_PoO8l9C?`_yi4ykJUuUKOP;niFs}L49JP1H zeK66E0c&Vy5dZ0S=8BEgRlg~CbVqqNb z?;9Liba(+K-v&M=F?L@RnEtD;+Kv`t28S=D7}-PmZnvlT5a{GLS-EIOhZsgD{t0g# z%iH`eB0-?-vCZXC0a`__h;8wrdU>OH4O4TQzN(hk=YOP4RQ_rJwhy$#od#2Z(ons_ ztHT9m$V<>q(AZXLHC)UVuD(uwc5r9+A3thF%p6yyB@P3>m|ZuppZY+Ll2I$DD~P>8 zZ*ci^)pg*b_(iJ zCa``g*!*n3aVZ(0@b4G#WD5k<`ee1q=v!4#X&{#z8#f{=<>m5Zou@z~;q#=X?;|-W zpZzK(A~#~StdCDlmmGmlm!N{gs0!6fnF>hHD{8DAop=hq!HLz_&N7!KU+}nABB@}s zHYzUc1ij8}?VS>y%lA}$BJyaKI`+E|f>|LK9k$EO=&?lM=p7n{UXZ*8P$_In_x5Js#^cE@ zEG;eKuuB^(y&Q71N&MV@Y(OAeSHU!tmNGxC$ulcJ=HHr00+@|dsz2)+edyy1y~6yxNf$g?q0v$pX0?4SJ}=0 zcKKm8x2)Ll6wmOcQ$e;pd3!uAdK0;AT=Cs_+?YHsbO8;UQv+ky;gDrHLZwPmPOC|6 z#>p)bo%Z!U8t80oGE?8mnvRSFZ|~s7>(NTY{A|;g4d@x3PA3rHaX+2PzA8KLd+W+! z?WXJGfx6|aZ9f;7cC3Uh_3=JP1UYx?BjV`iTh_qVreE%I&H%mr?;-C14V0$fpFFVJ zXe68JBm6YfeVlnSdnD+r`xrz=;-ymrn>R}Kc;D81a8Z<@zjC21dvNoi*!!WjxU4h+ z0Y0|GdqaKvxo>(jkKE(pjG#er zcXzGFZ#f38@FzI;i@bAm=7t{{KL0gZks=pC*Nfk42qg%rNFZ7syLemQN01l{_Tf1E zFekodoltn4p}hjsg;qfnr|h4d&;iWx98N1y^nn@3;;bKO`a47jB~}l^n$}Vfvpn<( zage^bdO9rzg80N(JHHn|r$W4eUIUVGbGD7FD8XnSphJ#2)AI%G}Hbo z&ob|F+0ijm`z7ACdEks`;Mlj1L^uwiBBG&{KzMhCgRYvC)RxmT6qL60{_>|2=d)v5 zQ0si|4Zlbi?~uI?h5SE+G(`dDsO3Cue7G#yy5e8{L&}6 z1XA|-)BUWoX5Y#9EVDY&AI)~j5GewTH-0RY;M~-2bm8YaPo7152s-eT8!CjnB`qB^ zH|&El;Byj86iw7V=R?G2%TMWg$zZ4Op7gi|8$L-u9NRF_ThW2+jOk`(0b6az}$1B*x zkSCihCVxYFeS*~NOBJLZ4#}z4D=ej}2A^+HVDt>miypo0kjr?lnVe38TQ39X35h9M z()v10+MKAy`G@L=-D3$9u%`mvST`}?pqKRdl$c4oXk zfp+Y4o-`AtaWGk$B&mqc$NPR2Ank3TJos7axD8kEwN96dVA1CVideML<;9byX(Uuc zXD6D)Zq;o9yo1fQSqS@|IRhmd!{AR>>N+9b?5%8<2d;KIzB#J~{_VC@a*NigCsr2G zhcS%k>c(rgJ;GOzBl1G;Ckxb}?BaMqmh5Sg1pv(!nn6Xws| zU1a|y?!#H43hsud+Z;9_fwOm4nxCF;3xXux26v^JS&P%QcH>yU1)iPWsE>`fFK4A1 zP@Hy57JA%(ehhB2RdZ&D{Sdgb_g0!8B0sxpQvV-9wI~p?gI;}6fpvlV1B^*45|SgI z6|_ZGw@2}?F=13?O;C4F3lNd1ls{;!>-2HlFcHvD*j8)_Yaj++dQT#Zo|a`8wTzyk zACUVdy#g1H1z&;wJjqC`I!awud)Y#x_xi&-6_D`k4!pj_q&=gv2B_UQxT*A*M@AQK zr&yTeDGlT`-0pfiooI|cf`j;Tz#{Yda;E$3O<5L*k)rgqaxD_diz_4 zWo4?1ov6q?*!ACF=wrrC6CSdJck6P#BP7G^pq|0|GioEXvpIfq-+@2E?!Ro1SA~C6 z1K|a~r=Z)YG4CGLPlZFxV7g0gC6e_rPYDy{s|gBxN`Ljt9YemW|JtE(5goMzw>kEw z&wqkZ&Llwg>>lInCZiRt&%~9KtP!>gGuAR@p(4YkDbNuwxHqMT2%q{*dVHVrGwHr^ zfNRNf0r!`7KO`*TM@c9XB|=s99Rn!s&eG(H@BwVCxfkO z;}7=pbWAXx+hfmSJqFtiNjtyDDOo8XRz7gnW+w390Ql1!3-6Ant2WbXUCuJ``T5zI z?@i6Ztjdv@OxWc&M*lqo*`0so|G<#9?JovHA?f*fy&)0Tov;3JiBFhpliGP3JkifgM<%jzvvEWs|J8xHKysak6M|jE0n!dAPC}bH?f9+ z7HFr&d^xjLnQ#YOFkifs3=?u&%51b^;_e#EL^&JhS#;un1~i7i-?x4gNMr`sD=OU2 zL=H}kY9(dnV&1{=py6Q7iIzvlFNt@8V(Vpcsi(_e?TCtEKMp-e(J}huYYDNNv|k}Q zqU6c0QJsybUh389U9`zU7|KY(Nb&J|p8Q-h?`Qbu^_d8TuBScCU+N~PzV0j!q=#R^ z(k`&mneQ|$ge(69TugU$*tWU2eH@~x^}Yfk@&ft1yuAD<{rk~?c77e z{4GjGO0alDm3RZe2{>7Y|9+{(gT{w3NS3z2+W<$IT#GB^s?}6E3@LLf{JCTPc~E*B3u~ETo5*`_NfsdS+^2+K(MWtUY7P z4j2CJ_tBJ$Y6YjPXbK7NNql$TORVmZXc1R+8n0d&p9wlV{nof~lVL1fCLNxa$K2Y( zoaGnefY@rr%d!gfG&RS^i_aw_4xuz)WJTSeN<~W+eg)&_a_p*yh1SMpb`Cg_h9tda z;@o<=l##~^#1pwNGczuquk$wfd)_CK+1CqPl~b!%j${BC!KpvYYIVuWODeB?lj{qk0&2Im~t&-o3! zN*^E=-M0LPrY01k%eFhJafzWpe+om08Sima(%yN;R>v!)ZgRpEE*TCNZT$!f8vU#l zL+z(SXZ(C{S?&8TGGB6aO(5ey-V3vabJZHq29gxwR+#2}L%H(m-XLb{<`S)Rb)4Ou zzvy1sImxeYeqzk9;9_n~#C8Kzl|}y~=#8KrAL<`TXTh*yJLCO!He;W+@0^Hd&T~;L zy(?X|iiWGK+4|Z>;mIDPbOBvBNPwe_hak@<1DJX+`Vj4kL&a)%oa(ZAZ>{2m;MBIA`2GFMp+W?lnp%)Ma6#2u5dnzVu2)IIPj`6A_c}S`=JWSWes8wB}`F zwtRmo$OwIj6CBE-T3ZI>1S)pfS?c;nRNTV#JBRY)u zpn!WemL^m0Yyb2-Vd>gCDi{9Nd^ay)eL%$c-FM3IS0*Yl`c=;rH<@V0-7T%19r`wKVogcMATQ3V)R$nSoN{uEZe<&OeVX+fWXV$nx;dlxWddNbN`PJ55-fn!M;-!R4(zC^9*WKJcJnFHS<*Ra?)>zP9|0_vO zjmJ9eDh;S*W=|IcRVm5B(gH7KW}a!e!*@TUGa+CJx0G%EF9CjMLVRlW`wDT(Mr`ia zN#%U8p@J-5s*jcYV4lLTG|O#6OUiFzlxQD--{0T*`D_oDXlSSt%j9)EYeMNC*W6_8 z<_1l!0hhZ*&yi}s`>_jjGX%WP&jKk4{krZo2D&;>k4cwr7HFS2I0lfb8L#7&BWO zuh>G#(pteZ?j*_#xj&4Vuh8XsJTI9jA>Uy&>~CJt2)pbZDVkCe?puFA?6}HanHO)g*0^7auXTE znyWq|1~k2QJly#_Xi4bV9T(*KTq^+ZMKGs3W=x5{jg>&!&&P~KAVk_~hU?kZ z*X;h(zXgWl_31>`CDs9oDD~EpnrM_`P$CYxTsTaiK=#!MjK~7;H24Wq1l*DvuR~%? z85DHc1Lo4LF^2}{H-PB<(@y?UNI&G z4s=e!#Yjg3JBZpv!vF)G@zF3dDFAs19FO@!7~^HY@TLcU`c5YK=v(Ibjjv0wiP!;;g%S&&tRc9&r)!Vi+Q17cDuk zED;kc+MwNz;pvqj*gTsFbPAx7U^@6i0&d^S0diAD$?uYo7!+nU%Qb6^r28dM?1wc7 z%&Yb?#G0CaFga&mgh5jO7u$#X|3Jp*m!7!H4M|Egi1#C6SjAJ|1S@3n`wq0kBxaF1 zrbAa#@^|C_D^IM1;)Pb9AU7=@y8$fh(XqsxCb&rPu|K3f|N4^2woN5FVc6#Ae}o-| zhZGOIXD_8Sd8+pyk|S&v*f34Prca5$ax3{zL;?olUf&5V(vZE0z!GJq1f#WsC4BA# zlz#&e(`_`Xro<=8yyb{1$>`e%a#0+k?vf4-jzEaryH?4Q>-#_AapYrZ#(KDa5w*S@ z6^|@ahpxL`WhJJBd&Ybz>FfA-82nOgdi9mmFD>3L&CN~se0enZJi#q{ynyZ(9y zWuIo@BPQn}gypGTm0cTL{`@YxcuIB%k&y7w2PF8WYAD$7z3jaElS_BBhT{-|T$$67 zv08nmMQX+lhKdCG8Xp=jL0I~FO>QGLHRe%9Dk7zvms8d-z>GlSH-^H=#zat$(OVP| zq0d@&ubO84XbqMGhxwb$)dx3bS?vH@43I~K-ys}S&{IWZdolCUxre>o#_)EKj|@tU ziD$0Hdf$9T;m~gah;O84!x`(<7g|c>#HeA!Y=jqGm#dA2CZ$Zj7hM3#msoIcOG3;> zh`V`Sy$+)^r>hF;WWVEoE{L!D0ViKmT`3v!9^+#ib3Y?Np7>0Ar%AX^VpCCIX2AZu zJvUMR>mCA~#O8|k;^!Kr0N|VwI28ioMMWw-|Eu=pxr7=N4prOLr6t54Ud0??X}e24EPpm;j&<&_>5Gqo7-ClectkjCxaNuGg}Uze zXZURlj&jf~nfX>~dm|%B)6$vr_+tYxGc#IWon_Zl^Y*?|laYVdJb1FgJrR4Y(lPXs znxNMb&6dkt7(=oZQ;_a(`v4XvFIF0&8taN>&~Ku1_&s{>loXjL6)i)-qI*O0ZK^LrA8b9X=g9lc<ono%am5 zujTit6c! zr?#to_g}vyGeX`8@cE7kVHsHALW8`Y1(n{B0;p;#Cx?Q-cf>CH0-8ZW)XhSFH>r-z zj8^tUV~|g#FiaZMfx`^|N?BvnqY%G);lXL!z`VP4a&lAjaC*GWI_Xg{6}Y^_KH5PgT5~TT>oF#y-~XT!f69khHxqo@!o3e8R|| zj?;l3guL{DGA)%dxOp9KBb>m7`Q|hm$mx#b${E?I-TlXvxj0oNsJBzdYG!1`M8kt< zS~0#ZFI8z?)rAEOdpGKqUk_y{z3w-iaBF4hTGBTwIey*Wr}-q8w3Fm(TI)VZ7wZF$ zZ0sabf^D?9+xKqTcSpFqC+IILOIn>jwsZ)E6dQgIdm@_k3hZ18(mtWr*=e+CFfKI* zPy`?qJLt5U%U`d8^(%x|`GNfQJS#F-qJLJL_uX@m80rXM;0Jr;6>%=l9!?+O_&T^| zjYiYTPym%N$QqW6j5>NeUkX4})ULX~ay_4pTg@4a^~q>883B(qTBIW);SiuV+}-=r z&un$!cTo)v8K$738k3ilotu-uoAFk)v=HEEL;)R@2R8PAi-p0fO-M`uHf)Supc2y& zr+?g?L-Dm|F@;>B82*9W?f~#z%G_OmsjV_E?ILj1({oBi{*gE%HJW6D2$-Iwgtq~ZXgaE?4k^PaY+(b;}foT55G zo=t-^APS^`&bQH7o7Q}7F>ds#ImA=S_MJ1r_E*Co!J6|Lk@;lz&H~blLbvPE*=zAz?+Ui&Y_||OZ ze@b(Il@LO0vh3jlzSi+-0YLB>GA<0w_&8@52&k+? z#1@aj9kRR~knXpZ0sIl>Myzb*MACa2sad~-iyY@qm(cWZMbc&d{D%9yjTams0BZ!z_>Z(T|BjBiUP=WJV7P`B#MF{K z_;Ofi=J==nG2CDfdPC$H!>T^BT+rw#!iq^F4f&1ve8B3$JBIi%oxuSMT^U$N+>LcD zYpY-wKX3(d%8ar=-K$S9>oJCh&#V(hI_lP_Q}Q-6HA38i4mOuaV|+iBzW!a{@0K`# zJ#V5Qy<$+#Y)$Z{M?E@LRaJJq+TwjJr1!5M5Y`dD?s-iZ{CCrFVhemtn4 zz_Ib+?i<)DnlTzdZr9J}{lGma4n<9RkMABi&&y^Q|DUd-ttX6|K+(?7xjV5`Vjq`C zb@-zpMc%_K zV=^)9O955HJiUc)1c56aCZn;!I(2I8Ac_z=fS_5{t@gHa4MvvE>Tn{+P?2C-s1O*A zLcamvB4FhpUpTO2ACGsN&;GK2mC_vTlN*hX_xFKWxo-ij zi<#>X{esHP(H{O)E?7gNV)o~(V@U*_N6@7T@f|%l(5+f}zm4|T*e!CJtdhJ_2an zyzQR^yow~5Z;1fvT()`*3j=+iR2Fbz(W7BbM?~x|=)%#_>cZGRiiB9bKKTth%h-vj zk>{VH`pxS<0}_j1Y%Kpar1>Bw3hMZNH>UY8*8EG-I*|Vzz^wp)4+}a`2=0XM@EqXSFKub0Nyjt|9RpV+`}t~(RqJWpX7pZ_l}^c z2>@uDmX?V4JRKxuCSza}9x2`)mDSmUhG2*IKGROq_r6w9Qh_%Cs5)^CQ7#fj^)jIk z!dSWV@UctmEq(*f6az!rC(TVe&5O@UD|fPDvmZj)$ldb#djy0W5PZZpqob&7PAalv z&!QGx?@AgQhF{)db~~&Lfr#uRNQnah0ew6QfL-mv%NJ_jFM2x90ohLv!DKWWk@g_oSl3K$DD$xYJ*74EpdU zh&YMXQLRL041p`?%1OyRj_zP?amsNBZZ~UXstDD0;4Pasyv;ehGLoX?{L~{J&x?nr zw)(o>`bk}zQPK}(F{SK;$q+uTEbdSHls$QX#B2f6kt&!Pn|3d^$E-<^s0e4WcE++< zY{Cfi_8uuw9WIdn*1-R0{9maY;h{}UQ`|Uc1zk+Wae4{9Xm$h9V`c1p<%qMj-(BZI ze=7RG2Z(Y%rLSmtb32cY)sO!eyMwFcMtWoo?JodwtJ2VtDbTpI_{2v+(W&zmp zws;{RZiZC2mVY=kK2_V%t0N=FMOu$zvV2APd!6%_s+urgDsjnO}BgVh- zw&9PzdIrltcP^P91dxMJ4=|PiZg^>CcVe`O9UmP4K8}bs>L`( zb7K4Au=~*!YC9K6uDr5pendHD-fq6Idd(gk@zK323WMPk2O`K(6zKCytkb*XmKRK5 zzz53Vni_F3jkBZfu@R#)Ahg2WAEr9`eWcDM4r8gOi@t@}F>?F6xO=QDFM~|80-c*XGHY`qUC`XE4V1xthqH^AMld+AbOT?hDv|0g%?f;*Hx2@UNc6OO$ZUpq;2*W;V( zC8Z{FWwq>C;afb;EpOz6$`a$F>%l@84KV)FlyFnJp2ub8oShs$JuP|4zwRy;bN*Cn zdgy5?=zJGng=Qh-Hl*!wjE|L+w39PapE9rGuHpXzCY}_@QUT(@@y(8ADSi=Ke-(87_%$1mlO1S2zHTP3pIZn`Fjf_>1HA#hPPO1$T<~LS z5FnF1O)k^yoFl)aor{^OxH3Pc`sS|CboLuh--xw@gZ*dBSGBF>bCYLS+Ii3=1Qt*) z?$?dKZ}_0d_Aie0`IZ>R`4N@RVu2Q7ffOlQbK1ZLIVOkuSI0X$i%0>;Pk8}I$J6bj z$SnkWGn*|5E!r6lfV@Rj_2{(1wpnNJOiweuu;ITSrh+}d9 zDOLv6Cy2D|KlCP2wu2nHkp|FvQBo2$k!+Agl-hYi{=-p^i9(2_qNclAFCAgPVSf3b ze|t<3uX&Z6@20?t#R2HRsB4NaaZvkG9n(3q5~fNGJdFY4y^Xz=S>uf*J&L9y;UUzG z9+mpp{$_trnA+aO&nu}=MSSp@I{@C@2_(5wwnV_Wd>Bu(03~*zvY%+XK5M)Q*ANW^ z5L=Lp=?54xaL46*}@w__8r-svvLpxRgYy zaay4L^VLGBTwsf}F|7KCdw?AZLGG;)obx4k|oMGDKc=6e9Ahv(_Cm*UCiVa+(8BPm+KKr!Q$Vf`ziiUYHP1)=JZSi^i& zOcydhvX5kd!Y(A1zn~XtD*ZWcC%)>lWW(Ov07%$B2$wD!2~a~8b5xIpigk0kAZY*~ zHQd)>?C|ihFGBdA*60|}&6pe`NBs$+Tie>ynuCZnM&P}GP2w~x%H!iex5>Y#4+8_L zDGj&`)Bb9Hh++4(dWZz*jyJ2tWxljA&`=fCmFL{@B-ETTvUS!QE|NK?sz{ianz4Wp z^-bYn0I+Q5V&O5kk_XV+-~bk+yc;Q z(dkS&f@QR);FU`|0VGt5KgR(*)+hEgLi`_7?6rN>fI~?v{ie_74(%oXCy5+AK>F#T zotD|tJE}o>6y59?q!a4>tf?2qgN%dPY<+JKrb;Mq{Bc|*SS{a>g8DSI@Kj8AC*#s! z59W=5t**a}UHkR8FJpJhG^rZ^`56C>zQ=7A`DK+KYeZghncIWiVdJmTxs;F3{26&O zpRb~|KSQ_e6;hM^(sX}!CuIkP&GqA|lY@{8{X6Q1TTYe}!3*XWce53!OV^SII` z59A*bBuBXdY>X)pG2|@=a}>A8+aL0SB`#A<>7cq3`g3q4=U?Klt!ek6;IICqh1Fmm zQC}7z*sAo;^rW2_V{D-$rw}hWM!tAceI)ay=#%{ukOl&upABbW6}DFJdk_%6*OIV> zkE9FiffW)9LaoLz=AU!b{C_zFxZ+pMB?z+6Z1+^uzKp@=OAIK%RJ=}ulS21BS^ZX`+z40FIbW35ryvb?3|Gs9< zY)f2(gu8YAIQ95mo{W~lxYAOMTFi;y$aCMDj{ga2E-NX~&?&3h+CQt>Xq1h5|Ng#q zB$WxRWf`H_rVR%x{yyYCF~>ol+Nvud?O_1?4Q6M2URKeN3N3mWyzO>VE+VyOwtiDn zEiqy-xjoMAe-^B;<0CsyPe{FxS7-7&ZbT$}766)UHE6r#j}Aa2F6IUQn!do+-FpJz zDgt0i<}G3pI}7>;5?4g!@NErDbu_gzv$Nn+?lAiY7TCw7#-%TZ1DXNJ5`z#S{2cCG zovlhUi)N#%NJH-6GxR&)$pJnrnO231`Pw=rvUwk>J1aU~@0UOL;TzHLP@#;uXXBgz z%;3Qkd2fvI?@t-0%hzFlHXs_0gjzAMj@++!H7{&DLelQy?rnorc_{>)L_{vku=lnM;_Az+|z@*j{3+It0Sk2(QzU|#Pb`ZJo2|)-@!vmT&rwk zJZ^@nUREI|FW=dA-Nf;Nl^B;Ap?}<%xfvnpk8EabE&b&Ue$QVOEhe)?dCKq*Ny zv9>M=&Jv_!PO6=HCZLFj8%CjMR*5qqZJ&4agx>N|x^8YlqX1H~pEg6phCezc?Y=aE z@1@0~z~gP4C@tfeO_ehqH_Y!XvoW&#J_Ru`NzjNX9l6Oi>4h7@1U>~EZAeZFpAqZu zG>#y4v9nAZ=kNR}A{CSL{HFkNc35IELLxM)EZ-BFV8O8n+yiKM@LH{x+u7oVDHL%r zRIAIKiRf{$&?K$;7lsv|!(2e+w?K3XPS6hw>!Em+FDTP3R*OBtpXhp9(h4Qd^465ef`teJ=N(zp{hs$E!Y;9R2++80jpJBL1t>csMI zzr+bw7K6Dlc09829->xgBB?Y`jaj#cp5>v51EK&qh&6&Z(ra-Gd@(fRDdNn7oXV`R z*`1%)f{knn0{m`d(GU@dmR{Iaz{;Cc(;2q_UJsc`;uJn(CXLF$WHy5>RK?jRV$Y5~ zkxF>Gy`WCc;WCUgbW~qgHTyOvKXR1c_Jzko_JdG9((IIt=|2a7#Hnc6Wu5rxE_g*0 zGZ8K7H3G9T^$}=rbo)?+XAMF%M)_nU-=r>Q*J9axo9+F3PzjgDSt^eIH!JP^Af2Po zu`_;wD`RDapTxH88^^%(e_KoGi$F zlIO-Db{(CBKDuG#jAEP~6z70^_6 zPuh!4MG!LqaS~_}mq;OZVb^Vl^zZPrm!qopEdl!+55l%%Ro4q9U+7<`@PW9I7kkeI zF5ng}BK%8ef2ezdLfUVN@o*2#>~=VC0C)>LU9eX~PR=+2G}5blv$wFR9;iU6aIevM z{kWo?R;`FXkI{(9MOj$#U#A0ad3R6uuX*;M2seSpSVQ}(aGl=0Z+YSPXPX_K9o2XP ze2{EJM#(duz5U!-z24F+bmAS!LymHZu}&#Y79%E^@{&%?V2KFoMG@V%nnlbwebKfU zw(r>{86)!o#eW8TEe8G-{L#oA6X6;_E|FVG#SL;I9CN`Ky8)jKCwZK(+_(XihWLM2 z`|Pc6i-jMR`pObLw|)reDa$Jv#~e!x!>T;fg&L+!jx&?24MSj*U)Z70&D|f+VfOv2sX2vJmiZ;$NEYb}T;U0E9oOemBxr?W6?_CKz3 zAh$z_9H{)(m-Ra{R&Fnpk|N|bkeD-$WX2C#Q@{?fDYcW3GTzkiaNuUaJc$SVG^{@e z`VDpeJ;?o2f?3>77iQ;L)r~7C3z=!nkMNeyOwGtLIFayg3q;1m1q!M^{qDYL z1IcazI<0a2mlRJFCMm)n;CPVo*V1zBqO&*~dVRSBzMwN4^DeX@#F~>tU#)@u2zRep zxLKmO2EWK=Bm*0}S(x_B;52xo66wY-3@7RV*m!cKe`TnWp+&r;{05_Vuo9{Q>0QKc zKKT&@xrwK_P!>3O8K@pa*iI-}p$_9i~_63dweLJ@qfQ03N zI)uHQHvj&;y3lILCV<%ZaIK88VQ(<0dVvrFKX3@i*7grLwg9hK1Uhdx z13VvcbHx{XvDBkftV*N442>8i!yRRgW*QgQsQ-VA&SwDsG}LQCMl!s@EA3fUk+8nE z(HV;hBENe(RALgpeyay_u@Z( z)#u@G@hP(QB7eD1#%iRy{q6Q}J$vq(NGq#}!sTUI>4Wvnv`+2pPC~>TyeLP*+sl<+ zD-tL^DyRtH+(GV;5Fe+Nl__^#mT{huQU3eVtDF{-uJ?JU2E}1po>GzulQKFVw9CWV5A)L z#nY;sD@7_lEh|?bM>8o^vU*sN=)9l)~k-wsfm?nd?+7-TyMrETGc zTk105;KX2UxH5!s)Q*2CETxCj)cySe+K+^1ON)zJgO|wP`qbav-hMp|1A+~-pFqlL zd+ZZ74-$b&s={ji$`jQV+Wx~TlA)FbJP6K{y|?}q-@~j@zL~B!{DqZ)>nw@q>v?$i zHYS>eAH;1gs1Pi3T+-*K1Ae0rW3=6reTctJP_}2+h%G?rm#3-^MN)80Jg#Ku@KsT9 z^4;%g?0V}7*dBtBXBRc*XuLMQa_sM63UB?FbbV;TJkYn*VJJT0W+rl;OmVAjmVY5! zO)esLkJ7LLM~EIh2hdf&JP)Rx8h^<1O_2o?rN6hmg!^CH zATt@c2lCN1#QIG=2=}fR{@0ifPASQ?*K9BGAqmrcra(F7zkg4UcvNFTJ)hz>UlY&G zJefz4q-={NJ)M3U2Ny`xkSB0St%-&ezDl2w$8TD+>VJwIG-Ynl=X>4Vt(a!o@W?S+ zbTU1)IB~dw-}4V~P^&Xk)0+(VpGt~IzXUC4Qyd~3Luc02>Ivv-A_FtZaXY3Ti?w$L zb;y1nV8ZG6&9R737sn*+^5sg#bhyuxe|4^1$?QOBn3m2*=f|3!veqKja zil1V4w{$zrDWO~}@7c+qhxksPaYo>NJr6V~jqetL!fZ8_KM-v!R@;j%`tXOA%!=T} zNp%e#J0D8Rs(Uq9T{F5CE5nuRS+zzj(WiAI??rrp8BHEdA>9h=5469<2ci83bOnPl zdb(kh!^+8u1&|BYdRY<QT%YAIR<8Z4#(=qm>d+TpD0X%MTRaq zUWiKH`&V@{yIP?c{Q>844GzuzX1Uc8$_43CK(%Naot8uDW;^kpuKYWOr!dS;E?sMedT2j$ z$K&VmKF--wnetdg)Frn$mY{uy7pJM)X0l!jPla?-w`^~EdWy7B<~UB&iW zBCZn1q|thD&he%pvRh_EF|r-#P>*^wW-0UqE`lHT?&`uEEW<2*Hi1)qRXE_km`OmgWvgvS{XNDOKf#yD#hw`^sxZJyMk&Bo+Wq4V-SOz$ zWW~px#}}V_+aSNnU3l_u5uz{Yi3#1qh%azR|V%}e?4M87+xms5sb0?{&Qp|^i*#M#BnPw!pPHlGu4X>pU&eQ7!x_~mfH^1 z0S=@Je=_H8-r_zzdKle&q5;PYm@ zbb4Z>jocXkKf@ygA!X*v2wKpdmW$(b0Np&o6iN;o7YxsA+bYq_kIqilX>b*8>xlgL zz!~ICMS~Ip7h6?ZGooq^+Vc1DJuJ?x#XEBjraP%T}LQ#uq%8%4@hCv$4UQ zic3gwb@GTRA;l$ddD<>$T3n=RPLX}EeI7SccllkEGMk&`uLRY;Kv8b_bNY_^O9#VQ z1I@0CkP!xm8|mUd2A%P#E-xa}?XRq)4%&797L2mMR$vUM*5-k>iK8i(nUVf>Y|2z= z|N3)EB-nb3*_W#Hi=hy|56{Q!WZ;MqSO*<_39f(kv-E zI~#%vdh7-%U9P|^09&oMvir^9ikKLnB;{SkGS_8$PS;$w)loo}Zl$iC0TUJ3%GCuT zw2CIypohceAr#Y&_RD3J;6dA&W~7DDap_05{YF85Xc+8?(X|Lw1T znhI5n{88g)AEqBABy2B2+5PWnhUNjq^~Ae@CT6Q<Ay+J!}dc9}7r&4_f3)Rv@OX(PDL2%+GxJLV>Bl$ew9> zb#slMhNn51)A>HpE6|`}=#9ogh);}n>v81(Rbq8U(aQ&l#CQKS&~JCS+BQFZ213(0 z^l81Svhs{}*U_k+6u@fOKrFOf+ll9wTik9|n7w!l3#qKjP*(dj>gyy5k|nSY^1jt; zbP}yts)EkfwHqyFB~>n}BI({PF))v@h;CwC?U}bNooDsryy>j9>|xqgfb7EmaBi4G!>U%nR^3&>Gld(DzGS7l z^>)(^#<}Tq?*02$~tc16PoVWuGK+EFZPFxqyg7q6YJpyV~{?vjL zw-p;Xas55v?agf2{t3tulcpb~73O)e+ywfroZO5C0HKWV$qmh8!c|`U3X_ct@mh2a zRG!f5WK&o)LA6Gt15$MUpv+i7R%25+edMnY7B$GI+(S*E6MZ>XB1xg0K!k~VLI@Yr zdVQQM>1u&83k9wRnN^JU>vV36X6c|Z-hMN1$Qe;7&`RAB z_*xK`@Uc)_+FPv9v~ZGYy}Nbq_4ZjWsp5)|iDZ$LfT%Yd9e%t5*sS#0<0fn11mL#P5iJ;7CZ^l#OS1y)YrmvqPGhjr8I5uiFONJGGIU%47u0 zaguy}UyNmVO1p{|gxLv0j?{Irt_kVQ4Z8jT^{^OLxBhTpeDANbuzyUCUq6HlgxWdQE~inP}UVNQ-=2%!*a-=ewO0^+r`=q`I76&r)7nyk;O zDc^p4zbO!yfSFKD1eu03pmXA9_jty~pVZn4cwynKPC*|2 z%%-%<8lXWOnfw)?8kZR>&;+{gW`mGS{Un~j@PgRGT*Y!bY`BxMKi?N8c1&OKXC$U9 z)^05&`VXFNhjf~`msV8BMk_K-Oyb^(3+26rpTlYil=NkU<%&KeQq|WLnf7p#?;uiS z?)l%RGGfrYAVl<*^O3yi3akmqDf}{8X`Q_U>wf^PJ6%n@bTD<2^uXKHrI}e7vixil z?U?J^Td)h)XeRB?A>o+yd<__dvMVg_M(7Iq71gG8QXE$QiRLa8#$}Kqxcgz=!aoHd zpe*~j9nsJqaFOSQS74+ydfE!<$wT{?Q2R$sNbOPTr7@}2zK{rfQd8(@kDEuxT!DlT zeAke?3tgn7QbhL&Hj&PlVB;jcHS%wW zuF-bbsI_P;a~FSdP(%OIUQz=>T+l@PcJ1vwk)pc`G$RS+>%QcD=2&7DiO+58r^f9= zTq;;zr75$(Moo4q$<2y9H=SYseco;YuCCHWWe^u1S6E(? zh=E_lsR>@>z}gsK)&KwN&wG)3vFkIN{FA$D(JKN?uk7SxMCU2qWdiw=B)A*$var`tI z=q_M4`}Np^fkcQ7e?$u($NO!!C)8qugyPSV0=};EW$^6@roX(^J|(l@OOWH^05Zuo zx<|TJ#3%Rz0FnoZKJ&S9S#V1Y^^1EO0JR%+Io7YcokTGK+E zsXlZSt47XtyhdD)8%V)hE-Sx2e>W^|G3%n-@)2G{UH@{UpRWG)wwmkeyKkgjMPaGX zL~VJ!cHg-5?(PJ|2I{Mzg)i<`bo~5U3))SLzEkXiu5-j#+YQk&{wJS5Jp@@>p8h0O z>=@CMwb~}lJF%7-wT7q1;Y;0iT>)L*jVSkW=M!z7IYh))cWWy8(!I8;6Q3iCw}c$9 z2@e&SxQ8Dp8Piy|n9U6lpDik&pc7Q0cpHrypUbPs$M_A}g(?BW6vsDN4(I4iR|2=e zWvS|Z9>C@=1|Q3C(WgEj>AA}M;C`m|0$AqmqBq)53`^O#Ff@oG+t22I-?MJ(ytB~O z{Rpt%nWz6T^18VwNgNlKgyUtHho zqj+-o^9PO;7t)g6PAYVOwH`6_MLRgmG4B(DHU+M@$CLa*qLiH-O&L5{Zgp%1gY&nyzVoP>=F z3+lgroqO=H+};m9iaUXz=FGp%lpUyV4Bm;GBgfvXIby1IT zzqqHxur=gZR8$whlR(@CiwmzlLzSf&O~&tOpK-+D#hESzUHx{|Rf1a^hG4r*5{};Yg-|#Gfz# zb=K9Z?veSgeHvhZJHKQL%imKjG3~B9J7QP?aqOb8h%xl(&2ribiCEH#+!anL`qRf| zSomW*YX6b@-%cVPzeIM=UZw>*4X=Xh{~T?@h8{Posh5|RqCB9r)hFx76GtQbAg3E$XG>2bmn;I$ zAl|2)TZ%JF4=tYDE@~3p=eu48n@3vU~Gug`vWiLgRgI*9exgBBF=@72je3!&9D`si4 zd9iS@s0IfB8;y#uFrP(CDc^srZNwIW$YYeKTJ|W0%;Pwc4vs~crP*j$9Z3V$q+~(F zrM8B)duI=yhXyHH;^PT`rl2Vxe!V$aAdK_Yz*N@yzo2WpiP_5kX@<7;-oqKaZ@7Z6ZK`Y%qFQLAo1(JxuYsfu|(cG8eTyy}GWw-s0WrqX!Vfqa@eP^JiQ~mq&F%sH1^C|@$NqpFs zOuqhS@delk(}uF;1ZCKFN?MvFY(0y^$ioF9ubG&r7t~+gV!JB*?I=$6RiRdk zuv&g1+teus?rrshT078VI{G(>(Ng!+8@XKy6oT8m%I3{_R;?3kO%vrhELGAVOg$H_ ztS^U?nOqHQOm>rzuyTjvHIBX6xggpB@iepXX0gVT^2R6_foo1_ijK50K`IE%+Y@Mq0%v zAa2Dsf)g%QnP&oI)1Sv4q0PC<^aQ`c!hXr^x!<(>bdi^@HV79(N_aXqn`7dAjP#!l zD#a^D3+tiQ!WvbNz#7(Zwm__oeea+;4(Gl)7DNMYs9sWLjUfuPwenW#u9&anPQ7_< z@_5u~?=zn_=EtBAI_b9IU2Z)#G1Yq%LIlQjot zTP)RUA%KG};jOaeB+vxgU3#j!x1x&f78VvS^&JlnUoVDEWRD)QE!Or@Q7+S&RoxC7 zykcJ*TLyu5qJCmeLIJqL0w zFBdj*O#k|aL9>yZ#OsV3we*6t4|BT>Mc=>QEi>qKIy}WR1x0%?ikQxX+aNmMgIdKF zNOY-w&VpD^URLL?E)r8Er%0?TYW<;y+FImZ|0JQMS6%Dj()SVDxEFO*# zho{#%PIXdU-LCESGr|);COX*gS@JJX7gz7^}Xqm*)kbZqSg*j70 zJ<<5|Hq(=NSOdd~cw%A`eqXtOQlZ63hz{xS*doX}Q|Y;m#RfBR8wh!J-!REH%mt}d zWI9|y9iJ7aw+Pr-GP=FH-{yF5T}cs7TooFI`Q#8@-P?0cIZC(F%2G=0-ghWtqv0Rp zz|%Ebey;#F(7MEA=8~O~(1eZz+;mi-s*MjZFI)OQgy_1}t`Pj5Helb^H3gU!xtBd$ zU3KMW*^ZR>ck+c)li0kWt4n^hR`Gg-%IVt~4Sx_mj7SR3qCm=iUx9=ierkF`byW@F zDG-nu&%mN1veg0x1EO8hN~=otAzOO#DwNa$lzl>)apXKyBq#=)mLFc zhW&@fd;D6mOaM3lymR#vD%O#{Mlz6ji}C|0&nmn-B6?78asi; zG@Fv*yqx3=LEmBfB(NUD&TieyTrnQ)90&@6v8+{S+-LMYs8^3!%o9a7dsC@H; zoHX$EN){-@c`s|`c$#LZ5?ez}RqbmhxK^!8ba(-lr!OSe*rxD8CB%B1rDS4@^kfo2 zvlEPJgqoZ4ajo=M{4PP`e`>K^&C>uMq;WF{=n;#)akX4ISxQ9J=KKT73oXn`V&K9z zww_ITr8p5SE`;N>q_HtD(*MNxKwwz9$gTWVc{nK*t%&k`@Hr(Kx&)0g(+sx!1oBXj zQA{;+$K-2o6mKH!o1oH&f)eoAm$m2!(Yw3TVcM~}pgaU&XWntDai#W?OcnNn0~cP=@lhZ1lhyGRC*nLM_#6owkjGD=*8J{GA@?6Pzf7gqDA-#DhX8!xypf*jX1A zmZB1Pxs;cc0Ic&5r{R!l2fzMUlqbiX)A09xxz25`#m_K2o;J=_5}eBk9lI!@OcbYcHsw?SzAW{TMyMLe=t1wc)ct zmP?W?mxx&ZCLuUAlwnTx0grJoK``2Q2K@yAJ|6>ogwTmNu;P5c3&~`2t?~PFZQnxG z=ZmfNJ97?{bW+KF66Cf`OC*#)U`C@_vZbJF+BS4}n_vsK1bnh{vIy{rriv@$UZS}Z`ythEv%hoRM-zZK~*XfvA%Dtkr?<@t3&lgFl&V&k3`AS=XhA5bLvl^6wJ)u-KL&mG z_QzYKeHS$lo27a%S1D8!Y?Hqi zFv&*LNgvv-wq;kxi|ioUIq-fT{4TEzpnNW*NG@^g57n{(L7-m;8_%846jO3jUofnq<-(nXvvg6%LCK|CR z3xR2e*WO3a`ao$~g;z{$CW}jBw3?QsmW=hsH0wkIHE*VtcbDe&VzY&#xN*K%dv2oM zTJ>N0wioO=(XW4&f1xdZe;8csz{H(8{~JQhsv0WjwxjzB z?gWWe$Qk8+g4pJskZVjz=En18X%bkJg}%k>?KxHKqQJ)m>#J`01zt!69QS7BEAa+nPERXE4V{z20AgTlU>YtD}~Fm z4D{>S@sq^-If{kGh7>tO8AlFOW<%>1QoK!XDeDPkjUU-OhVXe#`p5E`(H4!$yGlFK z^##3M-_C#E>f3W}7G#3ATRT}Z*|*G^`|risxEQq)b0%D@ioRHbaMs4=NRthB_GUQv zCt=f)&P{9LtGy=I8!NYSyP39U@ZWg~uXRK^6o{d(RnQ|m{EM%kFIWio2ob${V@ht^ zVzxOsB4SM4cSd-xFdj*v>lq~a8lE+L`3hcm+I_2NX_#ZxY>ms_| z8M!ofO=0^|gPGnlYQVO~?c?)i*8NzS2XqeL?Q9Kx@1h9k^TY#pJ6%3Y(NTB`qwfof zY{6h-rBcksEg4J6%gu3oi=q9qRL)}o-$y%XQ#q1bn;+1(M7;KV7kfv=1&j3amr`I8 z5(g9brMSu$X5r&T7yRu}@Zru?kes{}mEw!#T*3(c@k!|27%C#L*?Rj>$CX41eGkBg zMf@5pbv48JZ<2b?Ny=ULI%Zr__e#jecVC3lZpB3@kUZ_ zO$5s|lvl5(Sm+hg#PpxBHUBTpd18fm(w!RyE+H0HP8!;W8^0Fol&OeoWCg{_jarn; zaDYd<>xi5}>PT>_A#|7d0z3P++jXl}2VHk(S8XaPWpor-MX3|(4P=uBo(=aT2EHb> zc~$6U@X8I%4>*+@RcFwxpzRXRmJZUYEcZlaL=a#_?u$u;(5t-Vw%o01N%K#+AD;SS zm3U|NU1TkBbY4y~I{+;@crYQ=RB{?M50&rP2FF4YYU1JNOCi7e455D!EqG<6t!}5c zT`G;4_uE?@9|iYLa+tQdyFpU?x-uF<>dCLFyYFSPJCsv}Waz>>lGDLd`(kWzhrd@$dz5tjI2AHzlt`~1 zDKLN8?Ioo>LU)sfrM~ciMQF#ME^g=C?!QADvoeXoG{+*nB!3s;;?eT z;c}Q8emAHq4Hn5GUH*Q_o}fn5du8K&VHr#5(Loz8t@R)zB=8Mn-Yi8ka@aQe;+w-i z;D;t2Uo`J;^%plAi=ab+SxH*j%N%Y*L5h>J%5%DxK}2xdn?!_JZ6oIO-BsmxIGVbr zMQx-n5OmvyC$TZQv8ya@x1&c72dZUl-kCQq%cI?~6qmb$i!?$6L1C=goo@YkwHT6)SaW!;Tpla5%X?NM8rIWg%BP3Aon{db?Y zETE{I z2-d-K;*KwtD0On4W9Evjv}b%0v2mV9n&3OPJba>O2GS^bq;F4Wscu`-)c9DD)&14) z?UV7}(sH<1@ZTC-MkV%t1yO}muzpqP z3oZzN-s1CzM;FvgWPB(45MBK_-@qxnSCOM4?mw#p1mapQg0^%U{7;C>6)=YdvXK$U zcReoW^GT2;(mA+9!Q!cE$1r=DmqqkA0>Ohm(m9N zGZ={QoL^x+LLrLx&BGTz@&bR zQ@Gj4vdgZ70s=U$iKXz^I9L{cEN_;-H_{~@Ji?)c&KFaXkuW{l!yQ?Sx2P)YUn;AwMiA+l+;RxZ}mvU z!uI=&(&U`BQR#y0whT7Dzv;6JCeS9Bds2*$Fa5!EWjUAn+9Db|MWCH=^Q$xW`zpSc zO@}iEuIQJ^G7*}a@Z5FRi)EGK)`YerWEawz(AO3pH>GL`Z&iAsE-s<2#P$@4j}SZw zGJM75SVCeyd082jY-93=)3n*<2_uCv-(0 z=K$M3TVSVF4^8gdI- zS-aSl9k0Y$N$1t{xk2Uawhf)B;oBZ(I9y$=(Mtm)dl~mnMMTJOX1G~YZ4dmoE@%lr zFb}89oD=tx_?7bo0|Vp7@l3_=#I{BacWakgYD^0nz_HD~2`62v-buE^w`3i^7Xg~B_Pl%p;*Ad1+_O2Rqy9vW6>b$M%c*a6ig6uSZ=tHO}~fL z)fPSuQ1!4krSX!_P?J&fm58RsKu<}RZ^nwZoA>fABm}i{$8q!Nwdt|O!4tt#;04Un zeWzsW8k6-p@3l7r4Apz+^LU2iEkrnz%F7EspH;KB-~ffxa}nv@Io$y^efei+ z5f&EqCne<>Ch3I-xRg{Ee?0HJKL-|Vej|h0wq7-7uP3g}b;^%3c6CrExNxz%yWWw5 z;!Ag~?+X_`$1L$Jy}~DK>IqHgHE_?&3o-F2>i+Exk&J0-hO1v>nL$1X@hv9mo-!#b ztsMal!Jf6D{UJC_FFR2=T#*bFe{T1P-}dTyGPULUV*j|>-(pkZ`tiLd1iFKU1Q4Hv zL`!&llA0JVP9kIwr?KOCb#l%T3DXpG%-v5VK~hZ$H@w*J!@K|&7wd1ie2z^?wL%h~ zL-WOQ?Z^i%I~+vBlSH%ivYUC6K8iOOA?~e8mq@4|57ZmU;^gEQ|G1|UgjZ82(`KY* zyADZ#OuhlVhOzH>h!l2P0={4l&A521yeo9*Sq;bP*$SDMO;sV(bZ~*3Di@E|hP}_5%9oIusMaRkF>>%kNxS?3yb!YKaam zTf7TlwWR)7_X(Cj!c!Nm9{meTTcNEX7}0=>h=ZPA08#Xs=g{hUU%L&#EkEh1*qz_A zPH7Ix&bnsG+R4Knt0cuJ>B+!C$`c1&$IygjYX*(b%Br~EGq94Aoypjoq#;vGG{kRn zxhRh|b6K?BMeJ|EwnYDuE2wwX4(`UP19$o#-9L741)nebX-=0GyXV%|wA5?7PJNck z^ZYm{SQj?L5?^#L(E(pc>ZBqn{{cVue^(GgvtTGQAa-XPvm@5s@1C8RRr7hcJOq_6 z}Q3*@O|#$~2E?T^_bxos7;%`VwlkN9wxQ_*vj zJ-8c=R@Q9%pyMO#gV@NJDt6(>-GS!7CmxUf3CWlo!<=lGFu<3I1|X#DaUDEB23^=yCExH(v!-Wrze zNCa>_?)&GLG0o(@Pv76!zcKs0)sPPUoR7n)jYL#nSg-ee+v;&-t^az$b*3li-P~B{ z98_c}%CRVn-qX+#`Kh!!=L<7R=8tytU9Q8gz?slGQvLNSK0XUtpT|5G&*iha z@>Iuh;H)x54Wls7&@$5gIGw489ButVdMT7zABI&&qcZE&8onF}zCB6>_)Z%Q2{H*S z`D>M!RZf4MOK%dSBvY*;CF}YrEG+y;$ltOtV+DI8idH%LN)dF~$Y@c^r@62ni6Qn23>TDs_cPyvNYt-V-d?1$JR# zzGd5X8q+y<<^xJZkUlwf1~aDm{!5@y_HfRX2{pOv&S-WOxiW$!DCI-}qar=;T%4U! z?Y91^yjA)bj+NPD)poOSY16Qr5Q;c9!4xpLjNa1)I)Gh<)&Az!(9E!$z13~C71H>4 zP>#OgsJVni>=Y;?`AFBAM(7M2yGsdfW~P0v?bgZIYVAk-LUqrZ*3YVp-G- zMukacKK);CG(H?k&c)evje#Xpqj0HYf7BxuGYd_hCTi3Y{Xr0&ki@~o#`UE;-Y9vo zA7_D%H6;XoYQ4}zZp%B!u?WPf9-O^QZLLhNXa5`e4OR(%1`rYV7#9Yr5|=HAR#Q3%}#2vom9z5yHUasVkwoQVkee$eQWFNMdMBZ%HbCM0JG^M8Q={Xj`P^}B>**Bk0VbIW(2?wg<6K=giu}!pR;Y4?hn}ch z-#W$k>8~F1oMd_2>xa-hhJ)5V^Da4JguV$cjFJ;+Ya&i(Iqaultb5v_@8hESJ}K$Q ziSfi{0H5UN@T~nRZ%3TCnnNp$R2tz7O-sD0qHtSpv*T+;!E7hK*Z}nJTn9#laS=f# za+9KI@vz9v`Vl#dquxwAU!Qq0`HBklEhnk*7##@jWR} zBf@Dg7+FbiJ||N}3LcFJ8>P zy$}=g0xa_gi1_^H$H17;{GAzIIq}wCoKVdpr0zo~>gUM*>W0&?ym~p}DJ?!su{DEM za?z(=FJTiQtG2LV zjhjN+e2ofqGD=^xj+Vxy zX^Z(DK@tray5^X@mSw<*I4a2o0geZ8n1v`^KTSmxD**PttFb$*k8=01jg~e7b~~k@ zHmt6Z6V3NPeJ}|bO4%kvx05o$!sKOWcKV3M_P(vq(t4z?o`jd_Pj9z%bne=7M-U+f zy;%N+b0sHaR}Hcdk2OrLl&OacOS7`P>z4>tx4$>n6!d!qwy+u`o2F2d$oz=iun+zN zE89!Xs`QEq&91d!S%oRd$bM`_CDP#94e@8=@2QBq?sTGeqM~UuSJ|Vq$tvp8Ii2h7IZ+zk&I(arT?d~*#(Mlh=eXozVkDbrkU2gMA~3L% zDBH}`I-0$9F#%R_OGcS&7mJGe`@XxCo|2gTh_*>-Z6ZvGnNu{a*p{|3+zKWS+@Efn zGTxo|5tsi$6SJ(~gWV-qUPRn-ebFapK|^F7q4-@JyvrSd{*QSEx=#DQ5W0Sbt$FY4 zY?0nBX2|%ZQan*_HCvoq+xB-*-3Z|0z1U}~JXu+Rrw^Htj|93rn|Qtj`YR2`C&puA z<6U~*-BgPcwoK|RmpgTg$`W~uqjRo1R&PRG*DrjXeIFnx6;_u11Nem5>ZEU(6El_a zktSE!AVR_f$h(Kb_T#EbZ}h&Mg5NfOJ7f?@j6OB-?37;KUOwRPp+pA*c}Vnoon0R< z@w}E@a{sgLZ^17!V(_CMphs-i{KKukgs^bw;Ais-cVRYQTP3}-)HdUz9%LpIvu_Mg zmS*e%R8mu8SA~Ny zl$FC>JrI6AhI#AfgWq0U7h1Q&xZAnD1&AiroF)1BE-f)+Iu(o;A_!`zO;lAGp-*ry z+S$)8kUhflx7$E{lYW|>DL7}_OQG?vF--IXMuAr%^t}w)H;yU8^;EH|sbjH9zU|JV zCLED5-3Njcc5>*WprXU!auLb0qdIzEISh1}Z4jwf9z6J?;pvQ{cnz*$!HR|vOxf|x z-*^zE%6CyOMz*F})%%}GUp(^b5-rKlp(QIcf=HcD{?fV9L^X(Qer~DWI(T|enXIaF zfS(P`D%^8t&?dsbIECvp@Lk}XSzMS^R?{H-ZFO^gyU8cX)YS%bbiI3D(pz`qI3d2o zTo7(D8dtCpIgIgX$M&JK-mXAywcBoxh4xx?HL;|r$ypC04QhwyTcEcEj5nv)xxee| zsx}mjg+y#)y7;kXHEg=JfPx?J|55=V?*BJ;gxL*+*W6#9%JyA;TW$CUHYd^LB;k#d zGw6AnuBdj?`?$67ba4A}*|WeA&T!pxvDJBX%hKEM!bED&Y{}pOIqLS)5AFzz?aqTq zH)eBN6E)B{QjGOmZ%X$j+NnRwmW~-vcxuw|>$$&u5EWX^Bqg<3X_AhEF=;4a$Z&Zd z1xfnWKnK@dPcsj+OR~LQt=PLqVgA=_qT<0F$Ny@F7%~?t41^|L*wRTb3AA*T7CL<@ zUe7m@(t;FxI{psC_;d(#c(<64-gbKh`PDwcgq(b)S$l40-;5`R05b?nckzlR6*JLz zW<=)9Sq7;46#0IMKvP=bNBmrRa&EDQNi{z+O8-y2e{6v%qtw>o<+=_l_$68Q@ONIU zepOfYCHp1Kj|1e2AI$m1VADnTGsB3|<|_V-iBK_%&uiF+p|}fT6B-A!#o;Gi9aIwL}rsqeOZ>PI=Lz4tdTeaS^ z?M0z2=Qr+mCoOuJgzVNz>e|Km`EzBGsU4}d31SLYf~TNf;*A5~K?2S0-@NHd{w0nX zo!j*YC~y+<+5q+SzY=+a-SE*R?Xg&Byy*jtAJ#bV-d^d)3ED00l{H)#Z1_FDKb^t! zBgm(j>22P~OyCnF>ij+UWhm2NJn<{|*u62dK}}0Jf6&FXB&%g!^-iN>bD%BEJbzTl-};3ufzKnqL_ zw==9mL@QLh;)<11I?@o;*H(JTpGe*zQ-z;vfsQE|kTn0B2bW~k4 zSFfRQe;~PNUVPZ~Nv8eh-aI-o%6Gf`e#&75g6(#nb$eSGRSPlyP^MNE3sZK74A5>5 z_|f~;w4&B4{T}qbGu!O+0?pmMA8sj8|D;=|uj1N|OQPh}dm3)`G7$D0wYxazzz9-|D7^93beSkimCR@)lq zFBnO<(4mUeW>de_5%rEBgJ4;HXTB38r!G%SHF{~2x76~_H}T;>ukB^q0viVTq3BPb zXI*XGub5w1=FGhJQzl=xJr@@02{aGpsr`FJ z&D5Su3z_Np!?16EqXPGvpNzZkOEyP<|3AEY0z&8W`6{*4hqqxA%hfVHUHAJp%v2Fi zX``FWb;f-&?F!3Ms3~3AWZG8<&?>Bi^pTd4o|f&qPh-_$nUHIsAMBQgCQ~-?B_UKy zP-E{(6NTS9AA~hE9@_3uw9`c-bR?>z#w9YQSm6V)Z zURoM=-syG9>vYmtpo5NwPI!DbnmF?JhSN6uT$r-dUi_E(Pksd!{ZFpJH?|}GBm-Fm zBrInmVhikmU^YTwYRA*@XesJ_E&-vEsl<5B1|uU>Gh_eiD~yXTFS`l8VRs$F+0W&%Y?zvi@Ww1KAZL?Rb*4RWwDG zKNoQ7H)(k2rGfhnQ$x{4U?mV(OKvZ?2e26|%#a4LN73HA{?eQna_ zTXw7^DjLSTXCFrpWd` zJ}Jqh|5vB(nj`#oU}l*9#v!s7c(VdwCevOmO;&oBBE|d7H{*nek5Ab4^THeOcwbQy zAH?NUQ8Fj>8+}&^Q#G<8kVsw%(b<JR~rV{3JJqMB8FRPwT zz2BzqnMBU_A65hb(I*FA5$R^%0`qq&A=r^$_azx7j_@abTt(VL+(9pqV%7L_VaBte z+e^q|GM1&B_6rS?K(LHU&tE_4;B?}fGC$qhVkR~Epnd4fDC#7y#MeN-eW4|tWeZlO z2bEu*Mf-9vCcGRr4~g}iL#uxbunso5ozf|zzegUi#4pYHN8Dr&Lzugzn7<1Fr6zmv_Bs#a+ZvZ{G-LD4}nS`73nFZLaE*r zz)-}bc^&;M>D^ix(84p42uzU8F-aVjr5BQekkU(CDTk!H<8`LW*}Y3<9k4`s6Ta|K zs+v6aM@iK@4F3Jc;Iwe8KmT`HMctaelhBYZTDU1Xgqz}|F+_?kvbnc#^&VI=$9$3T z;@G-U#Lv;{ov!|E_A#nQ$sShP$Maxz8SD>G1{#j1U(CfJ{qHytlq!m;B((L;%1zDH zChKeg1w92@HrlmLd5K`rkw6Nuo2aG}mOfMPgyE>_PL}`=p)(xX?EhIZKQ>XD zbaHVU;fTIo_1#c|O(&QoPvM*DB}?@rr6_I`vELB=Z~t{5w#ca<$kjLhWPIZ@^c<5a z0I8CSV#Bw;B896)aQp^*gHHr>;2EE}w7wH6a5+L28SE}_dp7)DrmBKs2OW0ki%}}p z^x}Z!PqA632RlthEb`th&{tmP+C207Jr07oB;6}8r^NXufNSjrYm*&wmdUd+MnH(Y zNQ>f zskg~P5>a4LHPSw;@16~TTYvcgvSAt7o9^T->9bPdZ~c1V>hE$t0;~SeTA}8+0KyBL$=T8@S8_dO8Z&J7u?*97~_eXxB^Q#DZEQjo@1Maaa)&+Bb6~4B) zYEnVD-_*3;&h!`T`<{QpVmoK>s~^KL=*ObE7>`XF--WBgBn^@GC&88x#^8M`4ytH(sBJ+(7Od`P6LTa*5y`}}`2LZN4~`hQ0hzBL#+O3V zLU6a$grZ6fWnbCkkIqtu{VZ9@dA2qX$vL+$W2Wz+z5`<90G8dvYC~F=RclbwVoU1d z#A;Je+LSZHrT%;eHVN(QU<-YA0>#mKwHK=R==e;NY5MPl!r{j}ysb9mQ{#FI z-wd8aN_TiilNlD~nlz?L-!v*~!@hx#zIo;hp-I&zG_=ukAE#TvMkV+Pp=mtn+5IF~ z{b9ds*N>Q;0kLp-OU>LXS4XH-sJ(9qtzT+=`L!iO>>M%|DtMD%SQTn z7mcF_+7pX=rzq&EsqOO`N=OXD^=GlJrwU zmGz>8k$m>f;cU%*fv?+=tFc-iG+FFS(CT$cyx0G=LY;DqJzujL%ka%Kh;w_#FEt`= zB)&`YPZa4<@zs^h{fY-U`VI9@r%JT$wV6utRH6dhhhC!hhrcI1L%_%0OgnKVCjYg# zuVNQ0@P(~>u^sPs=2XbY-efD!wz>#4+8K*U&DBmIM>jn=E3+ND#EdOR>Pmw;QJkNG z!B>6O-;;W zKk;8ZVJeY&io$gcE&-OokMD2|+UX`MrJmJ0{+|u0fx^9nvuJUAyj~2hH|OuvUShNI zAI^m6|IN=k#p*>2Ok&R~i*GdyA-V?$QZTGVtnY5=xo_-R(sIW_UTl2fBOb`vm)4;#dO@|g{>#24gkUU6u${SU`*S{w z!?VBCU%1dR)@xnfqC1D2WG@1R9aTMNVF~*9g^}q4K5_>AN5e0Mu&m)5Ow2j~ zrhFBZRGScV()SvHUiaWj*hMpZs*o|sWKfMj2DWGXa)L|ZQZE9tDqbowHA8yGu<|G* z-j~jZf_ZTL;4Lms7FwdfniS>|KC2){H@&c;sGq6ETmGL}+MTbX))hE{bC-n>X) z>d$KTx;!wZQRS*5dV0D`Rl7G6M3|s8A||IMJw5*ozMq`c%`%p;|6(=b_=jXLZ9Pjt z_EY!u&2ejN^v@fjfII#N=zKI&brN|bb4;33D#cRbgeZhPo#1`Hs8cQY;|wvlXCS z`G9%yNmns)+BUm1(XY4AR+BKTX^-AUmG2#qIz(vt9-kfmdblX$jI~rZtBA@O-u#K| z(c)lnTUYnB3UeG+&#8tc3mSf!6>X78u8z z9Cc`CuXIf8VcT|rV9lx96Qz=(YKXh-R-dte4~n7x^T2lFRAPLqt~T6Or$<{tL7}D{ zbbtpV{^;ZJlP-;C-Ylam$ZeZ^s=OUJ_I4+36@nL%a&AOfab7VgItvn#(W`R3l8j5ZerOx{yS9RjH`B@9aOcN12!+mF#nBCx(jyk-$xzEXD1VD5+f1&l0&8g zkTzGZFa3GmL={v1L+MdjoVA|ORX&mLItJ4cD zY|&`QSK-3#Sh09cFF3_s`N5?nB?EzC#Qm{;J_!F0<5JP#3|j`^ZgjIuv|3u?xAnbf zgJ#1&Jg6=b)SoABoqjxQ6UqteBFRx2IA+(m!ITUA)hWtf{^)^>Vl z4hm$X$z~fJnw>ak{M2yPBKa~~M3Xvy3zctKv9784zS$PKKR-XC?YT|RTwL9{cqF+@ zlWuIrb@OoXZ^iUv&v>PZqfY-U10$!~ndK7i6mR=uej!JK|u?!ma$ze*@>q<^QY;JmUTuNFvWCg-RwPaob-Co-GJVli48{;oVMUtBc z2wk*WTR_(W$K+Gbu2c_a8ys#$c^&I!ALCoHcu)GL zG^xSAHrQ>rkK@T(D2GS#i|&@~U3I4mYTwfeov4#F0jBiWW*oz#l4jm3rmo9-$FcL@w5=_PITqb+5?4F^^j2%g zRJ;dEu4SiYQ*>P6HR!uLcQ+$FrwlgBlbADWiAAKF8)rfgg4J>t#1y}P6hqvgZ5*Tir-3qIJ{ zqmNdchSy3G#m`FAelHC72(|ilFc&_|Rlx&7~K1B~;gU6N}^2pmY_~AA917Vg} zgCHy%IsUedSay9spRvh=Vza_ELI4b@)D)l6#FZRxK;E9lZ;8QQsflW$VSl+sT8z0T zdPwDEtNP=KmI51S5w6I+Ma1)up#=~BKI_otJ<7}F?FcA)hPN$IcZ7x z@|&4+B6QZniBS9bCS}R0>xI3}v6&;i+k^HG{5q@;=K$l?8$x<&F%&-`Fd#Fe7c+m# zV&&@N9Px>bgmPiPqD7o@`sjWDJw}#;EB2|ptjfsDxY7B!=vVgC0Lf|^5A=h(*F_iq z=K}M*%*9Xc)@_f^dzBkrKlmn+?UuBl)$i@0a&+q*-Y<3HlfcHVVi}~W=Wq^)5vcKM z)M(^i{=AMLPicEPeBeB>u`=&Q+rt3eA;D8<4b;Ctu|PK{pC4L6{xht<3s}@3S5B~f zDz>*me6|UZ32gG0hNtJPzIE-%3$dsuy^gpiTOr&%!kpl6uJSKiXD-X?Db(CZ8XRmV`3^ z+X^%4xjF8UXB1jb9_~#t0@~dd9NeKwBZHD+dIcF0e}$&_8_U%y3=zBzCB6~Q9$~8ty zWfOHt$?qzf_-9N~vseh~*#~)YVld#jlY&}O^}o6a*Xh|QIj!cE!&9ckc>qnK`t%2Bux2-+y2(HKe{q|~$4AWq~B6KSqw0ojfY6_g~ z?gmTRIWSse#l3GX=Z$7x_tDOK&GV}Taz&t^Xt|om5vNu7)jQ+|m+-czjR%?HlpG@w zToPp@l$I7D=;iTa^W6*3Bz9EA-~j$TaD%lP`~KGZICS)<9r8;rI8KRFI)a@gf$-~o zg0gCNy?n?No2uTJl$f#@Ixyhr##>>|fL-mB7(2}Ahu|~;Q)d2u*c5nf8!I6sWPvs8 zXdd!(w*rNwFcv4WtGJk5hLb)xI$p{2I4rE4d8^$?bXyYiiRSa$i)V1+UHr>HxBGQo zLCJSgKs#GDU#_a4ZQ4&<+2$6Bz^F7^B78hs3RckbaG&J))#FpgCoBxEmuKkbP~lsJ zW-2#;DzX_zJ*f(0ceEp)vh6h+8h@^m+=mS3{BthF>;=s-Hif|{m-~t-w?voBlT;P6 zT}g+$QPukGItYtdaaN6v!rk7ktgA~M`o`s|rT>-!y}biT7F$aMz(w`(bX8)J_1PS0 zLsqnt8dfpS+$k!$d-Cvub$WUc^ZWbQ*cgkWV>!1A+%g)EMe=S8ttB$tyDGmt>4BT3 zCHKS8;uCBumG-1}%peP@=6Ma>K&|W4uynC`eYz zq4NQ3JpnTrmf`OGwF!zEP<}OQa~nr&>~C~e9od8k%8i%~~5!C=x^Lm5?7} z>_f^PHfYaiWSvbXsOk;s9+Wmb zH8$g}FlybeqSwQlRJ1Wc3i^$HPlWXs`@MBj2_aPM^6;+*cQ1AL8}{!>>DBh}V3Om1GD(kDJPvQp{80SY=~KJMg1>hQ!$d~&=WPz_Ys2rBq$nK(En4-^fB z1LxWO`m26=b_aQY|0j7@(~@F})q_ip+VvBR(Q(USwt@o0>t_$QnaZ3viJF6Pnh&oy zxUx12`QgGgLHcjs-FCLPrioXG&rmQ< zv42j+1=2=GVU5~Md-$znpHfXLcFzv8E|JM01wKPvUGk)N8O5drxhXnycSl#@n zoFo;MjPZbW`(BXS1BeUI-e@sqapsIJ=a|#$Cx&P>z6VFh{EKAbMNggn%UjgU!;etQ zhbWGb)cZf7GSFYUbh`MDaehPL{&<`usXu9goU-OEGdD9RHukt7^K3o*QnvMK|Orx*{F+hKqYT7$0$U1}bt=x~;eO+u+u4yrdXL zHi^pMWFX-X5!2yY?&o47QQ~wT3=E{N-l|PwLt}O@k}O+T$F9xQ;q|^Hl!&ZLO-aqj ztF%VhMFJ!l>TowIieXK@yibyLgZ6iun_eb|;=kYg(~69o)H&5`p9N4_g^2RV(nF%p zUKt((4EzGf<_Zk&fSFxcK}w*Wm6q%AG8PxDy0Ez1+~oT7&~rM<`jVS5+v*GZ%|Ww1 zI}bU3%~aJUYc{KjlGxhapa%anj9dF(Ny7ww=>MZ|WY018-=&G6I{pWbCYV_K{1iu; zq-k!H?N!Lt&F9NEnSphLKve#rXHiiR(A>LqCsJr_XKG6s&MqN0AAi3%0}ti86{Hr4 z&FJL-2%6=urhxf*_e7VMFf-)*=6*DjGTg`kZ~Ao(ZHd}l7X3dhC^qYW9*_<8c(I2i z5~8zWUq?v4HSgr7TQ7<&VXC_c4oqG^tV(K!fstxFZy!hWojvQMxGb5SVjp@(`)9+} zF;Ts@&dpQ?20I^;@7+#4psn?%mHtsy8sze#wdsg(G`z-RjnB>EJ@#Vg-ULWifBu_x zBi32*yw|Y$@Tu*G(TEzE7;f`C?+_3A0V7BIWd2^)>5b;lHRQ)V87zyYsTM`na(mrb zcUI$5etUJmI)+&SNLnEQNo!L!iIGfIOac)R@yl)0mpx-SCdZW9&H{8Bcu2BBGgT*i zQXIqcVWOl%pYk=ashATwEbBj96KAY7pT+;Cpi=Yw`--gp=+1YjiR#&f1S3B=O+VFc z+1Mr)_hgvYRSgD> z9LIZ_Au9|X9>OA1TAWaq-41sJ!!ZaxV|^LngjQ=%_oUy*c+MOb-L+`{>zUfr5IQ$6 zzuWy>SG8&RSkRntlHNaX7tf&-d7&4lV0_T_alP(8Zv-dJz{G%xKLo^wMzPbxjQWNl zYLT|0$g~MH5Ai=2VK#)--Lxrwu*jh|-Y`)q8TJK#FUz#UAPR9qJpG(4GF(qS#))C7 zz&-Y+(Jg}_ozu0?Y5AwCmbdjq0IMx56(#Wgf?72Y#M63nKRcnyb~Q7zb!2yUQuw3V zY8_2Kq+ihhM#I@dPTT1*Rb~x?l;FuXu5$XrkEzkC06aJlo7J)oG_!C4|62qSl2UI6 zPC+fA#<{msC+D9%Mqt!u(PGlX1I{boYe9+aH^sN%FaJXl$W=H07J+EK?8j6Irfm|H z8V3aJU`KrFkuvtj_;-2C2}$z0{>fWJM|1lv`@wK>K_nY29lI4no~Bd;p7sf!z0c9+ z@TFmyWEQcg1wioUToFcT1Z%N&W)Fl4kr|o?wlSH2?tDdzcbdkY5Mi2ID6u1KkjY}i z(&uOLs139UuAp^n_D?}e-^G>GAu}5L)X|CuH6t&Mak>(FB0|D9LK|KOyRk+l!2Me? zTuylQFJwH{1f0WN+}KNm{L=sKz9d`j70)T9Mx9cK^zkWT?DFp%4#S7;d}b`@rXUGpPDCmrgZ)`q*a-NZ^M37Y);B>+cX8zD!y*DM;KfmcrrI&D~(boy1^=oj$QV*bg$Kqk({|Lwxc+ z5JiDOc|*wdt_X^1lZ{bQ3k)$?Jv$3HrB&^>(>^79)T97p#eTKK(C_eQ$q23<;US^H zlENhhr{FXRj8yPw<&5D3l_L9;R-L~vqr$_|=Fww`Ar*826vb{(qsvG=WQyli3C$3K?Q4e^T7-TxU>3l$X;~q>z_Y*H)BkD#;VA|G62dnM zVHzUOG-j>{CKUdunL*QDkd`!wM;_@TGL@w=R@nESYPpq z3O*_HiW2jeNZ9=8Ae0MhA^s2UAMV@~VkCqjayu9#L+v77BNfD3Fb*Kd;UPl=mQJ4X z4*Rwh{ey=)EpMutPWa59Vo#}DU2pFY0OS6}o-D%)sqkq8{ixV&Z=pPOvC@~t!Lqd~ z!~(A{eR;&SB$NB}D-?#vVw#Az37BDVlRVZ?YkD6Cd#$td@#r_HSg*u{Y>^dWnK5Jo zsDs2WLRpEp>T>)ee}&xQ>ab5^qyw{j3a5H?5BjBB7v|Ac-qZSh0f5#UAj|LV)tl7$ ziJ33cnvNQ&OZfsP~7)0H&_Z1#VUz5OQ(*(IlXr3B-99sXYmRi`>t_+u4 zPGYy8kl*yhdGEGta{=N+@BLXIj&-ocFAeeSI)r~=PLyP%yzh10+uRFE!^|U#FM~BM*!8KcrvaAve`dMxFJvEE1uZEleU6>hpew zcTg@=_$7jHU5*rlUX=HX3G-boK-V`Ybh?+YQR!>t6f7Th+x?m8y%d^RSZaR(0D{kd zXhI%h-O|0gW53Tfzzx=|oZ~f5MK&}gFm-3e<{sb%2c4QpFSxJMyc$_*jAU<(&lH)a zCw()sz1kfvMcc0m^gZY}v0K#Jeqtc(e(JPXz?p7VxHFnZw-;M8vQ(#3PxN7S+U#Z= zHOhO7KE}b8O*twltBQgSNIO2{Lz^ZFfQ22eA`c8khjPbSTx8Uqc~D`!3&;}+S57Cu zO>VpT7L1?;p`jHqDE&(k6BEIa$FdIzk8I7Jp{h;)vgM>tKr67Z* zh8eDmy+=f*#9yY3lztEs=Vj=Sd+K9%VB zW#I^!g#E3BNO;TkBJVHqCoq-eKBPj=Ez%*}Ai%!uD_OSIemA9GJ!fZnPp0G?N6gWq zhmB1U={wYt9yde4$k#sX7 zx=OMJtgPd+5+KG@9~If zg85`empl+f_u5+c6U13B^_dkJfOjMO%Vr&xhr|<_gPDOKcZ__wwY%g8p&;T(Xw8FK z2g%OD9JN3bzW1pjVEaMm8$SzLE>%K~L@02jbJV!jieI!@Can z)rP!z9DAKp{3jPFV!$fQf3gAj?eWqk?wm8X)ze&+y|tjcd5g)SXKxT= z+RzPkc&pF36(TSS>32n;c01@_-bs>n-4<-ZqVZhr|5_+g8K6jrnX!D#t&z(^tY&k+ z^8gb^5X4<%Ys#AgaitYOCI$w^*xjS0&KZ7h))(_3blK2jGyFJsd=g`q^CSS@Wm!_h zX&9?tP4xbw+2VK1EA9Nz-9l$^*TG>m-|bat_hTVhk+>nj5kcP9+$k{2Hpg|3lb(&e zWc76(hWTRYc+3kzmqGojo@HD?z4ROdeX>qnU z6fiIMU)^5n19ocxWQAUxz$}PV%RKQPfc|8v_~ zL-}w9z#FNmnP08SKnm*DMS63bhDrKG^Hepy@f7v_q&NPQ4j;Q`ELF4bp3J|AhPmm*uxsQu>$9$md+Dl% zGYzf@JUzp#?99DWkFATFZ~)1#0~at_JAe;ev<0;_y#EF8cJYnR@#mAlAHcpr>l$RO z1%1D;xI|*MbLeRLuXh)MSm-?nv8YmOb*iBbbN7YAE6IPsLyQG6GGY1Y2aGJF=WRiU zv+a%hw*XwsDQr&L|3T5kqJe2K&JHX!>2ec-ciU^FB-AxkI6or$;%~E^t*L}WO#0HG z<*URdzhN<5CNc%sgMFv#)m;9OfnjmA#-i~)N{(#K!)NLVu#FlPB0*39vz|EV-#`JSsQmO`e;=bJ1#r!i%-%-Us#yJ;bI_q6-Epxis# zu->^zy2ORM)7Z%HdiO2}@c%lkAVKj$`2V32;NA(i;2(gdHTDWad?Clk2tiB>06hQr zRFMIR5^uK~JrUJ!Db@CW+g^W(v?gX(L4ZR~0nLXLvljH-Nqq09Q$uCq*dQ0i!GQ{8 zo-tMpY1HQ}h9ex5N%%e)XQqAaxcJ1khS;KJ$#MCI;Tc$1M-(=sOn3(nl$&Nux?GV5 zVw4N$I`BUrR|Wn&X`;R5j6%FY1F)o+22Xavn_HYqtuqk?#(U$XONA5miWF-z{fCp# z@+%ECEfW7LLqi8LoOC335MoEodkA2bVPr?ecW@VIIj{y^uw0$8<(@JUs3qoj?@&yW zH6yQev9i!ksL>4GDbxwEuBDC5Y-!MK7P}D!h2@NUxUjo@Lda%qqZE@)PC+p+=H0W5 zN<~G5fq?;hgHV(gZVn@oGOBa(){8|d082fw9PkbcaC>fV?O-;UUDkcjYX>l1tN$?G zx7IQM83#O_C#FWR*}WPFyEnoD_0P%MIr)YqW$H7SEZ=W7yr4d^6Ve+ z)WF3Gc6mulfyY|)S1bu`1~x~2v_A+kT3z;fMnq}7Mh-tV0bkhvM;>wfj@RyZxt?F% zT`VUk%^e3VIN_t`|6BZn;E&BN>wgz*qk|*sD$V4`FtO4mj|7K@{;@(G2CMw#sXM}m7Vg<=R8M=ff>`&x5a1!5?>KvIt>jrl(NvKa4O*lN z?1`PQ0oi>L%M9LM7BCkJ7UdNo*v+{1yx7n`2*{COse43z3_l%@#wOETA z60W~=Hk`4auoWwIXR++0n~s7eJZNv>M{{gR#N--Hw(9L=-4;I;`Q{&awFE(r+rycJ zv`&Me44ZxywMkCBuV|BZH=aDGHiAL+PTigK? zdLNzNe6wJPC|LL+MQ1qJ5lyLtzy5>W{kncCN|qG!Sp?i13I`lr9FAiQB zbIyEuq@bkxz`>=9%O<=$nA*jkV_S9F9lU^Hacl_wlbX5NFgJ04AucB;iESdgoTI`r zKT)K%#b^J#lRBn(NW!YcKC3_M(-WOVr0pe~tHmV>6X?irh`EY|{?eqhm9;L|FAVqo zbe;ODq-t}=LSfN87MUdk6Xg0DX&J#8Nn+5?8SL-2i^rT&zS6=Fpg zVR~I%_#3iav^1_I-}CO`ds^G7(9e|Y5Bv1B_+(+)Z}BiuOc>S)059P7=Z6&f@TXKe z>x@9|>>BED@A}N+M=AVve`0^~M6%pHuGwwsj|EaLS{??;<3j8mtnd4WBG-${Cg;p& z@Sm4ZbvRrbMoW1MxmjI=nI-4bz6IcEF%sf`QkwY^1#5!oi8ie=!J4%qUTp@~#sGN8 z2FgEII7q*rSbVolG)Nz}NOQSOPD$1HIKZ~}WBui11YVKQe<*T?<;)?E6M0f||2MhE z-5?tOQ*RdUI_m}G@g3a7(%7AdVJ^V)g~ndb?id%Bh{iP63&_TNIR44(=#ZJy@HWTr zSdT|6CYIU1Baa<30)4)t#eSb;X>?4{rn&r9vpV$W*hifzxj!b0X@MTnZIap3ZtDk9 zH(7kDJTi^=ZDXUJY8kDTY!upM~ z5Cf8#G3Au4(Tz($-w6RXuy ztd-8rbip($7ww-YRFIe#()-i#!Z481gD}m8oQb@fl$9M%{!unqDC!sM5`sPylh+?a z)n~&lMYo}AlHw=E!WnB<0J(sYr4DG8SVo6-FEWeOOtAr(Q#Egc;p^MO-xu9>i_4PI zy$!9+r_Q@+mf2$UY~WP>#(NrjKUrI9&I+OG>9rT|c-ULxB?fLEaBa@HB^sb8g8Gp9 zkmtPy-+23>HJ2Tw#pHtTCp_E^s(eC%nhyOY%JDPWZTF^I0V89hVxyWCaG0TGbx)V` z)7PLg>`}y@zy6-r0GyhmCVXg|tk?|b+j~5#+pWiZ&X>0TalR>UwHcW$bY?q2J3sjx zIcOA!7mYHHhfr zIMOGgU|}&0>r~+7xBhl<-7Wo(2V)Z68kE=l_!uetg%C~-L1sJWz-R=81OL`9Yj4Ux zqrxJ?V&nfRjg=8*Oix>WJ2ja+IH`R1+pF`=Vl0twLJOo9tvX6$49nLmKBIwvXC{7) z`0o8uvy!p-7+_HUX1D!{Ck7LQj)C5AKEG36QL}1#!`}zJT?C;2!uHwAVny|)R2nNq zscNAL3|cVv;YbKjOToqTh?&e$A}*XD_=nqgV(qF)(wM;8G!;oMK-E2`~$_O_>u!HtbCw*K3Y$S9;OFvypR+xdkFNthIacwx}a&LC10 zqD#s34g1%L%S|o1<AW~$_<~SRTk1GzHK5Zs)v7K z7LB>%UC6&O_#m{)KR20vnyzd)nWu-Pozh6 zap&OvL#q1yUnf$=6Etmj8cw~V84}*a*kEOLY2hnK32yiD5fy(Eyp&`m=Sv zii8)YHu#fJ{+E8i&fb#X(lZmJ4EEh|)^#L@=>pUM%b!a~4PxY8Pz|9fTt?t7%%;mE$m*8BknPI) zjx7}gC~^?ewq?^H(nc(#47^I7G2+9AAR*het*|qPv|?0MRV2j4QSNZx+$`oM_ft5h zni?A$9W`rgSmEs9pPoxgOBEDV0xRJ%8obtevoYJ7lGME8l(a^6DsMC)z2DBK^T(2% zd42lE&Ok%-H_9{e&c`#)D~Vir1{o7oWN9fsPpASUPyf8j!S@pIa@?Qa9#pcm7d;*{ zw(liRs>~?E5KYl-nUN|?3jo!5Z`DZ=qT5O$Ds(UQAlXUiYe)h-9<8tDwb0hO!%7vO zH384wr(Ju6-9P1H8u_xUjqJ z!(sr&oeDDxu4WrgyGy67m1}66n;8q<#Cd}QYCYOpu2}NkSC+2nEqwDAyX^f5~by_6r66)q>&R~7y#b%yTFNV1j@aT)8DCVd-= zL@%0V1a9PR<^w4W9neu{I^d*8kINpYzK&cTLd1;zCm&i;zUE}N;qh9hLuBuI1+C{H z`6iq(PSM4-BI6=)UinSO3ldanEAe%Qp;Hv0!)sdVo^%oSB|dqeMs2V6VJS2`u&f5P zi_Ad=fwZu&?<*pWs7oa+JtdQcwR(n*_#Zv!YjghLPtozzfhxmlt*%npcA_-U(Rczg zh760Q*j$38(S34FiO)1`GID3f&GAU#+Ot}#TTzhWtYR<08_r007q+a^MsN2pUn{Fm zobnE$w1ATMBT83rZ@uM;P(otD2sI@uHZ2JUqOv0iJkyr3H6?L@pON9*3d5^aW>`HT z`P6(74~>*e5g94gVBxJKoFKt7uP4v4z6Btr@aOZYqM(jOL?U2zZKx`pIl>}Fm6Ll@ z*HGG9Z#I_pBr#!J@6srKLRsGua{Y;HO{J-5$UTYeK z*UL;pAml7xPau4V?C;7X=!9Cm>5rY=%oJIWI<=X_0>1L3JNeXt@&Xgj(6Zwk_lG;( zfdT(YmAi3_m?lz`6F*V`Rcl3oa6y@f0cOGF>waO#%8lz=pXJNICP{D*z}Vf5{0iro z&Z#{${&ZKrL<~=wiXu)A&cZ;?RX~j_>!i2K9xA&h$2>lv-;rgil}Ct`oz?krzk9Jr zO|JDX`b8FF8ulK75@4ct`C~78PxwX9Es^n2@lC%mZENoKWaG=u{gz+;TDYtg!aNk6 z(ZS7-NOQ2IP?%d-t9xV=^YM9Dxtke)M7+$olCIH2Pf6!$_X>{vdA_4`P3I6W;7o`y zoelA$YoNdmU-G0Bs!y+^`p3~Yw!87aAdH?S|Mz{@IS!_!1m+Le4CN<>>4b}rGEG9- z^puz%U^PYy1e;AooOsL@j#emoXXjv5sJ=vkg^+7q6xe?B;1nE6tV+WML_F3Ef9t~q zzU39k9kdBN!9S;RBpzUhUdX&_dzt(}9%=GlNEYgR;eYGxZe*k*wc9gzQ+{E9FHS^9 z2Rs?D){Tpc?z$J;_X#}i9!B& zD?wE5>^HL^Y0tE?iPo_F;b6Hd#fthbfK6 zKI8eitFtmN=eO<`)DLr_h@dH+-$C-@Ln5m5E*UtCLKw2YG>)co%JRNNuM9D#fB)hH z^Obf1&dp04%{5ljDJC&NN#P{DrJ2-A(ZJ%9LC9{FF=1h$&*RJ8*{j%YZb8lQL!}sS zk1PIGLUh@qEiQ>kPQ}BJFV>@`rGZA}{ymi(pDYzBH#RdW1_U0M#^@t6c-YIq=QH{16F9o}ZHXdvBP+g~q0$2{NX@%C(w zN`Uj#&7!$fA5^&sd3y=k-AGt~@ALc;b_WN!M*N8gQrA{|+3$PkRT`oyqj=@@EVMQn zhxc|mNop?+uJF^ea!YDIN(i_vVUj&GYP-F`7s^qX!K+K}I9N2jc( zxAgcKSu?qoog6RuybQ*Zr)_k+<%P7jTG*ELxnr6>%R#pR4J7aWr*4Q90!J}^9 zC@3jB9N(+f8bWiRU%EZWs|!++Q!!3Jg|Sq)1URvoajXU}13Y8i(B3aR?t8UPrYX@n z3SPb;GC8Kf&AUQm79t&S*<+k5MiB;n{R(--u1!EbNsD1EVy>yj%zSqHTX^DSYT*A zbUbmHO$YAEL1C>{POgN~%jiG6wQ|~2l2i)@c4e6)!zIIR;YZxPhKEO-oE$kopq-R$ zSncqSty;?_t&BboTbP^6@vM zF;R6v%(wKE*o4ul%Ert6>ns~Q?Ww|{htR%*oNP2d6A4#zTyLAV)+SG-n zx$3UBS)?-d`OLz{#YW4UDhZBgbD2#t7~t%cyz}L@{;rCElNM#?jZX}SWz-^%nx0)6 zk)1&Jd^>o&frlFn>s*IHO5+Zb7lH{HURd!)+A~Ew-7s&V{(G{T%Ota}H&yG}4V20| z(A#-N!xO2m<`cIUhrwx!{O6vmaF=@G`k)gBfXv2r)%obB>{udX2C@Z9ag4 z&Cx1s!!Z*NMwLXdo&6JHZ-JS82mtYM@2+@rd`*$#aci0?<=vXVA&%n zhYh=Iu?$9_10-Oz4=c)&1yZUgUYwl?a=VbgeN3s03Eu>$pP&3?vGg0@J|`xtedcVJ z`$2!_5_2eZYIYLtvA-!(Q&4co3&as^zJ;}a$jjWQ(O}Y^)O{cS9s9+Cy@HIr&|^UJ zGQqBBTTJ@FW>^^XcAJ-uRn_a&YN${?yZw|)Lyt*&8_-l?z>s_D%|uvC_{oU7)w#J; zr=em1wz94t&9>)~yZeOz_pq%tc5d|n82JlVU>esSFG(bK=m%5Jd4TRF-^di85^IbE&iY801^mVsSOi8Wn}jg63)AEvW=L>-%L_&Y;jf(%ZIG}MixR$8UHW^kH4lFFlYf=?8WVPOO?jhG+fi)) zn>M4%V6s(+{NF?xF)azt@?>Cf*3a^oz)VL_7Z2@4MQ>zTo0*&BYJ56!RmQdp#KnBQ zIr5VBBGB=mkCssZ8;34y-mFdghKzQq?FAutuJS5Rw?E4o8q0Ra+@0^&r=jp~6;1WE z$E)qZjro;@{)jnAX(?|XE9v$ya<}`G4}-+`u~`Er|`PMZf&?p8rxRWsIeQXvEA6VZQHh+GC69&-)L4fx!C} zj~Wt6W6#qJ6s@0yV|a6WQTo7(Nm^QxIJLvyZ}0A4eo9PJltniE1sd@ z>__vT*SOB+SZ(QOIn~AKx3?W{5%cFs&r$&HeBK%D=rjxgEWD1Y)%nRq`)_7?Y5YP~ z8UszkPN07XOjbeb#7=Iwc|6k(c5^)(Kg@RWmvHWu%1(S3r;pWuZN%!nc9B}Ku-LCk zZ)nL*&4KCyy)}B(jMPar;Gzyk4A9oa`fYF77m>|(uK={$u~h`5J06Zh#22M*(iKpH4i zY3jQYFz4NAgBlSN{UR>7Y+CZmCsT)re^mgJxj>B4F!+CMgOCyuvZfPD2O-n`S;QwL zDN88S7Stt_dt{%EkQ#=LQ4ha*`cgDbeL>2$>%#5v$~<1M{ghc0K&I`gXJ+nkSQ#ES zN=OfnFPmQBqM7b;a9oXR!gkJ%>LP~5`WrEO-*IB#W*-Ks0$-?)7x5YlazCyr7NK)usJn& zwBFmA8glx!h_NkhZkE&WTb`o76`6u5o?Fo^p06pZD#As;e#JV#^ee3@48cjyq|Iea zHHEIMEWI77B`hHr)n#)6AjLJpAaiSdKw-JAu{3|B)y6-dY`RELIA}+Y|eE*t@YybBdoz z+CVV*?&(K-IW_Q3p~JnUqN1>DXy%K{xy-o906>i7ynnTpo^1i+E5GnQw)=+qS>`@| zXqBV|%%M!pSV8@XwVJb7TpC=f7_7^i9P~VJ+RbMg^>?_svgrG!-KO+)sE3Pv*(DPq zo<2?UKztQM=SSRKw!4OU#Tmf1;QeBQ1?2)#hng0T$Gs?}Q&!aiO0Tg%@cw80If|@{ zUGByO1lTgos~iVW3;>1!7bwM_Hm}RsCmyl^WYT zgR`>@tu6pRh}{L*P#&^U=%kRBB^CKvrMb5CI9aW^o~2Io5l2WAG&A3M{@zmb$1UyFZ)HV;+Wh!KSexT~ z9h^w!i2EBIF8`vGhUm-Hd?I^{3vSu*KMouCyL)KM`}xep*mS<@Zry)XIsFqp_tA(* z+PuYOg^(XSo<~OdKKZRGufDS9KtkdA^;pWkR6E~lS3Z8FMP=e;cRfKJzVw$)_#v)` zBLthldxDh2bQ!3s&5u>kH5t-d>*-7SSU_JyP=EH6T(WXfXCx5LB!5+Ir<2{7 zP2B-;o6F3~w9WFKd!0ia_Y?ub-L)p0HR^LgQqtUoV<;h)>lb(Eq(HCtNcc#OvyC&Z zUhApBu1nORyxsAxF63WKC4ccVQACKFKf2B~5Qt>(8QI@y=;2UWZqEdPA;WJnAE<;* zKFjw*eyBE{9M)aF&+H1&zwsYGmWQkbd}N8jc0ae#^NwrH7S594zcdehY{W)tYuu#UL18e0!m35it%W;!6}Vt&~)3?gRF$YNYRC`;Itn_%}w>a z&8`^60p{7;X0FdAV8*>Vv*Gc$ZF}Wk?1%11XHX2C`F}&KDhLr_V`q!561~ zBh7aS#samr?fNZZ6TFS-Wsd{#gGNGvgdq1)@Uen*;?(Q}bey3Z&bhAI;Ait2+if97 zI-*p%Hz^_OksZM_0jdbmWLWxwwSte0nJ+e-!fJ(4P*b_ZzdgFuMidJ)L5pJqw$8&u z27grIAqV`-x<*wOV2OilfVn^XSLat#ZQ( z;IsGo&F#`7f{KL_VCe~~(BATBw1OrFZ1`UWp^Csg0!l-@DJfA*cYE1*6n-w0vY5@q z@!3G^d^7Y(Z{|upH9)=!i5$Cxr+zGp@#2 z=?6nYEzT`4USs+3cKS?Nzl8xIwNthoBh3ZEg#lg=-1jHtrbZ~37)Uyqb!JT&Aup}o zl=MUgOZzIy$|J+ub)!=w&_Q6IUzg)n@ZO{|PexA`A9G~YS!e%bm*vF!Kq>6FWE1qT z%`t=xLdjR38nBmL1#nxTbiOkmr!Ofys5MlOZ9(H`94G$Z|DcIX>)whG>ZB>;G_C8U z{`jTvJ^VY=lCVua8?JQ5Aj8iWgkg8cvz8Gh2DX-j2&0fVnpBd^G$Kcp@vId8T*(Og zlpO>IRq4sN5%-_hNj=`9npO4b{pb|Yh){K&X2tH@*0*w^mX)c;3Q;rjUHbQz%QDH9 zv$rnS$_N(0gcJ)NGY{QwosNS=p)yYzqH4ZEvrq7qH6^Am!l_Go$Q{@#K1?TH%}yyr zXdX-WK{FK?`W$+G7DC9+1IdUS)vq7gc8mk-;QieBsEUqs!_QH?nB0N6z!F#5#UY!1m$k{{CqPW|Z0`bjP-D;qPm;l!T#{<7_ORRt_e zaewMJg(fxJIak*kX@DDCOm9MJdFymQFBUC*?M`l0@k|(L<)<5+7=3m1}hp zJCJGb4}tU=Zv6g=tq_VS3+17!%Ec}m8BB#WD2pXmho+y2RfJMe3)eWLAMTNE|AhDc zS6TxGhE$}xt0A;KY*4HEdCkwB>1}sPbVYeQAT%YPD@gU*6Y)$_L(wC8DjsrbL!IP% z*c3Ty;ME*hl`eW>k8}5xAkbJ{8P?x22%JOK(<@N@8+ z6G9Xst`-|BM6=%@CJ2BXexXrRUD(*>wnrhr5^wSSR=`!u{`;pa<_-stg4^#ux#zoI zE?~Q!oXAk+3C@hvhM!x}CaEN=+3GM*GJHO^O#sU_o)7eb-Qnh!UG=zszRxa_Ld>yA zN@_ybQ>E_Bt}YlTNPh9Huq`DNJL*SbAa}cc7fAy`!kM@9L#2P4HU1iHE5NRsQswqL z@Zu=XsU+^A!QaAn=dQp06PJ_(S539npeZGRZegppVIU=qPfmG$-TA!UsB;`-8_4(4 z&?6M)wVQa#n4BUdL8>aM^iV_EpDE4+0%+r)$8V`@fn3!n+tagdvpg+!R+hnVl;xy^ z6boBZ#B%jtdVkzZvZNiT!}v}b*C7?(@lEQnreXL^8c~Yb8Bd+y?kn2T5SI9GYkciT4!DA;Gzhh}jU{)GUo5w&baE2} zJ{lWasu5s&E8OnpuCba_k*hZ&VPnC4O-y%&`j2ss19vj_j(ZGht8!cWZJVsDY!nrA zP%-fYLxyRn8tUtS_df=vT!}5Cfkj0@X=HNv8=~6;tz9z_s-XUxy50Bll2%zt@nBmw zy|6FME`;{lrp%9T!iwA#e~P|}Pw2Fwz?|N7?iQ`6Nr>QH@p#vk1{Cxb`%WF~@3GVB z(P>+=jJYIZCbu-D>QT@$mt;o|j2qv!Jzm~l5B%eZ)rq^7C?&q0wl`v9x3)#9iYL{7 zD;~e^LKO%Zp&16?mg=&q!FLA7U4JjI{Cy*nLzF|^bPW`zfWBuP%`bIP6EF-^ z`5%IBBC;9$p<7nF{-Px$;YMYvA+4^(kpkg@%BY)7)6+gHy5+t&3_)z8`WwhmRNWy$eV^3toIi z!b>ua$8lJ*61Cy?zovU~a*@n!+P!+$hVvN96`{_+d<4Gw_?$^Bj(f4M0ON(Af@tus zxEEsxB{Dm0PJ5lXRJ(j5Yi=~7z|(kgZ|@*zyG~*p^kwO=D9pY(F?nbp!2YVRK!Odr zW99JRuiAg&oPg^CLICbR@n}u|Skch?y)EoC>-|hXcg2JsAO*OaI4>dm3%xr6yk&8B z6;Bjg6aj*>+B9 zn&i_CV5pVO#s*g_{WY%DE1f_cF<%VqAy^?&vbeAkWN>n0?e|;B9MWg z6)~UuJ9|MQOq`P`nT(#e_)^TDA(G1)ejWe;j5VWK0rlXUvl|Q9%vne9YDbQ6RVR;#6SvqHpx5YCDc)f&+;S7bMbbIN_!f#E2`+KOo zY`QaP6pN)6dF0pXMOSFA(`$}r9I3FJphxpU<=US7`HT=;+ViY)5UgpWXWPo+O@gMU zKS7OTV1>q7C6&6t#bgIDqH94ak-{d4-*J@`eRFl-So)#lN#B?5sU>cEBg~@v~;4?60Gf+1~l>qFa(uqGGo*Fzg3s z-#?R;vcSUcXCbWF-Vak7a{qIBeVaTS=%DO1MW9V_e5BtRyzF3LVC4J3{)2U=@3wid z8bU5*!@jF zIk@FCIGHtEc)M7eEsgcJy&-1uUuiW?3#FMFIi|5485t$F{^Z<4Qwor?h`Tlm*$1P! zi#v9huHHx{Tx4A2iFi?3o^d_RsEV~uX7`zBO>3HlQ z?MA_6yKtP>za}Tw^1?in;M>5j+7)LP@XG*vL_#`mbYZ+jjbR>Cu%0qcg2lrlcg@ge8`u27K?N_^!?4 z5`r*3+5N8i*SsA20NYBtKK#cR(9r=}7D;Q%FpiF%tjWWh!YrggQ*)z{UGl*9s_f36 zM(v)Isa4Hhxfs}3$N2c*Rilz)7|EE%dqy;4GVr>Hfdo&F^;dlhML3kyprEgXoffYpi~FRz zYdwXAj|>2{E(HV2^7K?(Qlc`8HI|mSJGQZqZi_PN@{hnP)DQEkh~f^!L6h5d+s%hI zF1Iy1VWr)|$Ej;29bR*=JcMBl&Xq59+aIKF%X1t|vQKeRQew&-T7WWD=WkvU;?78AXnm+mr`=uDc92%A>YS^qTl7ECo@nzD4bW5Ma)|G!{eJewzi+J&PHih) z=(KOYz66G(P<%vGCP!t_q7YIOpcVCU@Gu5BF$Te}6FjAr@ux>p@;phJ}fhy@u#00uhs^CI#s|W3#*UC|P)9i_BP&{9&*2D*Pc< zyLhWAskVj?{%_MS+cn%XXW?KJHQ#w?)3%P@EZE1d>cgM@Sw1#sNBglcB?qo)v+yr5 zR(;k0uMVS((Y-s~Z>U@vxi+s@=FHPsnO{D7v&IH@S0lS(ep3g=_4_yZ0YPbFkyTGg zPK;O`4(NX0i%4-I2Q1q88d$pwQdlBM4{i!1Y?QAxD~S{vt5ru+1)k!q)krQ*SGiEqwM4a3qpIPLp z%l?!_9iONUnj+AHS;LGM1^YgINE-Qb;5AARM|#<^;G6d(?ZTti@d+%N4%%{-)qbsK@ zE8m`&gv&Z{;mF*>tw6H|N=VhCJf?rExusV)fJjhG(0FM(4)SGOdX8NZbwcCt>4f;K#L}3g& z+t_JX_dSS1`G=+)MUk2j0)6MHo2#(OIYaDbB-aP?(R7!>Y2p8lR46DuFisA~`DPUCL!GR`+g{D6sA$3t$nMhb(Z6pFYM zF9N%6bVfj2vHIaMu4PF!<};UDX7e>dQ>XqMB!j9uv)=w-PP7bDJ zdqkMd6cdxCiQr>y!*3Y&`5+Bi;@U|hCX@O)3Q!&iGCqbqftBK`bO?woXNLUHQ( zG^ejgf&1{BAqf8`Xb zI@hc*4E+NUj0+)H2P9@bT@|sfG702=C9S=&emlK8EU&STcynr-O9EoLlw@qYbNoj= zjoh8p{2wi|YfxNACiEdSP+b2RaEXm^*J#fj$5NNg2>**xbVK~-Yyo1NHz~O1s&shW zpvyb1OAFDI=2 zVLxf?z-*jpmE8DF@cmQ#7^P3P|9AhudtEtku|a~(NwQ<(e|#D3WIeF}!)J{>E^}{UEGt!+Q3$+Am2MAN}bqxk} zR5+1J%bJykH|G+nM6N)-oGpG6N)BI5!0_8p=mfavHPU=ONO_>A;AfVkfdA_6uI~*W z`UMM)MH2rLr<8{(4iLdz}NJ0C}Ey5kuxDcfA|*L!A>R zIcdIPI;A+d5)%G<)^ejkcZu8mY*HK<7~OzY6XsL+q#l&sd`6}P-u=112|C&I*Uu1g@N~vjd#l<4|CPM8R!#-}qW? zcI;*iU_uh%%n){6ZznG`A)>)2C4=lHW46>74R9#(Y6h3iUhs?rd8rRa zZT`d#mI9d(s=pM$*myZA2finYxz0HBcz!0sHPec3_$`nKm;=DT@N#+NqV2zV2y8jOOwD-#p zj#`T;%20d)I0^cZyeNi}u2_`P$)1txLx0)un=pznVg^|$x%I z?sZJQG!3j3c`emw&Yh;(CXOj!8G-doF)l?7!V54aK}rzr%7t7;*cuq359)o>#ue&) z-iN5&DJ~>b7%&x9m4k)jR8sG+`Msmku2f88vq%8)QY;!P_)Cn=a~paZB)k^7F34xj zrX-nh;=799&~=NM(Sj_}(=y9cacs%bKVr3-us`o{^bt+np0$PCg_fqv*rm`KY3mcr zW`Z^u#JiX1u~nL;+cSZlp&u$e_7+6XYAD7nN);>8elypDSS2mJXG~DWSK>Arv;+OH z((4`&cc7`8Jzha9IDCqsQv{h4fhYUu0Tx(saCIx3;q|-QWeODXz}l$9u6?V|PWO!V zcor&=te?>@k@>OhneJ`iL|7no501{PouM@{&05vtAhC*#hoJi5MA!y@93hi+-xa^_ zaN7FRy%jXF=c8w0AfwC4hKKGwgsfdil3bv8!+-cMMMCXuAs$~FqA3hBY+38!=r!q` z4uc-CVQLLxNYg8rf3L~eYqF`;WMvRz6a@ctIiJe9&Qhj&(xgcPW}>Nd6!uS>aeKzt zC(+~EOJn7{+z~8?Qu{IU04-Wc%PD8wpI7^yD&64%t>q*&X)~`nW4$1Y)(uQ%?Y62r zh8_`1Rvr!#ExB8nBvsMSw#xnKUbl?7cA zjW2-s$Y3<7Naq=PIjkNGEN*L@(hNFhR(=K3<1s~0tbw}z%cBPuV)63=%5k1ExAj{? z3VC(QEG9>8!$9a;h>WqVkoOVC0@ri#X$7VDOQlL~*>PVubl_Tqc*ktK5E6za3DYpI z4@mPeUAlJRb5H|Ex>aCNUYr~9NqB2}FN96%a^PMdf^Aa-->6ks6G~w;I>*7^Ikh{; zieXOEm~^(-GLlu>uh}YK6pYq=={jtA;lNf#LPmal%?{oWB6aGGL2*=U?Un`s-SWMN z-n9+RFXtKG8Y}qsX$u9)&tIs0@6x_%xg7l)8%)C%k%ArIbk>?)BkJ!L~%fa6VlW`YhWTC`i*~UOnc$f z<;s`eb=9YlU=SB-)026|-l=R;_Exr|L_bYR=dSNvC8%lFT_P1bKwrF1+hEKZnBpOo zt$CgCM?WcavPYw(dn7#psknz;yAv$WL78{1-P^=9p2 z7`nb;)2woZayfRPi;XGXyrSs2(tEr}+tA?u|9fOT9X0+P6=lWC5Yyo7jLT-J4Z?TD z$;Bw_j1&*dKV&5g3P>LP8uSVEpIi2S7hyLe6juqsc4$aL#duyg8Q0xOxpCg#@-iJQ z`7{)w-S@r5%lhUP%GJxNo|~TXLf#fYjAxKEEi$3^DCiwUJ5H3-rLLhIb%OBUfAsrq zOEKNf`$6Z`feQ=k*Hn4B`5qxhOAq;rL6_O2{uILdt(i^@79qs#v~)>Zm~mxc+lp@7 zGREY1g39s z6H;fVcqjYZ3r$Z(VXoP-t1n15@=o^uI)fM<7t;AZ#qLtttt1uqZ@WsmMFjRENjm+v zS6QTOWj+9wZY3u1XYEIM<4Iu4ZRE>mlg4y@z$#v5rCPPTvuGYZpac2q@?KJqfAD#- z`@H@M$OZib+(m+c%*lOY6X3|{<*UA9ne$R2Dp~$x**x7nol^!0J({Ms0#@qeh(Vv{ zB(3F;GLA1>({jz0j=0gx>oc|*NY@0s6IaB${I%?WWysslFD#^W^}Fl;U5t=45SXxI z0U{Itii2LTtt>nElQ||S$P`sxR2QBTHK8DLnrfRx8#lCE=F*VWi*`(T^jgbzD2m*7P~tkOBzp&bYU*&pXGZ zH=$e(Br=nyn|&K?WmT2y-;B32U8Vp&gEPmC$Fy_}vpcPpQ>S;Z?>iNLhua{Y&v~65 zcaKs?t{)|#6odbDYP06sRUhT&B4Gcp5wh=3%=g;yVB^AVz&cM1knCf#5A6X(Nx@t1 z;0eUtg5mIWaDf)pDV6VYN3G#keh*97V5Ks^>7UT ztO^JbDznb%vaOb_T%_fn_TNjHyGmf?ZNA5NH^&gZIzjgXd@Kx=WQUph&h}5Q^BOe~ zboLhv%{2^-q8!dAmq#X$ozZ-R8mf6u%t_B{MlOOrcmy ze9pPNgvOYslcokJHQn^5u8aP(U@e9$q=)v^OQc@Ls!FEP2ReVmAn$%?*k_BRO0}sT zuj3fFl8bTLVm!X#S`w=HZ$|t0Q7jS+2jlfNfBhd+;f<<~k=a*Nz)T7>w~*0hw{Q-> zm|03qU~wYiQ;PKbYIydch;9P&|7Q~0-Ep7K$pdoq0cjaCu( zIJt4(_VP5UJw2-6xYk}4%dk!Xh<9MDv5Mg4hkK>fwHvAA+?oqb4O%Q7DIkPYw9_(m z({WZhLH1bjo}JvS11hTo}J?pprSVQy`04e(AgnnbY| zbp}<>7h-d#lw3G)O)qT!ez^t~jP2tD>X4k>uusQ$_-DU6vGCShfSQF+1yay?qm>~X|<-tvYYZZ26wpu7#tuAs!DQ&flT{J zq$pP#cMnw5RO9V2l9CZt)8~{I`-4T}Ndc4bq9YHa<7Nlw$??Ud{{F1r))2h^stDm7 zZsg~M(4Q`YRbXKO=QVP5cTQYRb#+bv{lKO8Ycn8d0-^j-9w7-rqoMgB6&V4^w@uPu zFFrO(RsO^OCOJMiK0Y-uA;ku#v>Y%(Z?CH>0AKT~%`0ic8#(th?~3>_T6c4kcRe~h zA~7b(l3vj^BwhEex_h2VWl->*@~w3mzR2$*Hs(m2_i>YUXo2hNCH`-L=C!x<>vsZn zDimU}51VnXLTV)mOX$^FrJ+YWkeGrxH7Ui%QB@$HEkB$Lj%uDVB(>z5$Z1OKH4cA^ zFmbu^rH|X&)51F$H&R0!@l#)mS=~>+iqM*rF&?fImj$xYsPm0Y5d{e*YWnNF3$ome zXBba^qA@K&PCL3xs^=iysNln(1|s(r+Bg7r*RAQxM&gNB7vTHi#kC5W{0}f zDxztoIhH0?%K4V)ex^D`2z&7zK#>FgDpyfinVghxcCz9*(sWPg={nC2nvj%${$*03 z9pp-JyBN>Dh#-_N{R6N-nD61;avZoy2QYDF#zhSh3pr%S_C0JG18T7v0sv*EvzsLZ&IN`V$^aAC8 z!wA|p@77c$@AnELzFVMUnhMn);;yhJ)S38W`XxHPtEu&?VO`n_g=iZEREP;hUV6>) zZ+CNQGe4E&ngPFVG!IlUhV!U=nTm&C%TVV(9d7D%d?Ye-u9TJV0rf}#Oc^q-0H z3Ds{rS2JM3vk3zW<6`ZOBh6HEbu~cYS+nF~u9z%sR4hakCP*wK$kNObFtguB59~1a zyzPp;c=6t6Fp`E8frLQsyCT^$s57@(dKOdA-~O23R;NuV&UPkWltly+lwRsIAVUN1 zjSW2+EzhQ5uiU7Y*c?AvMCT6Rf6-ogzg%4Ur4uwV#=DQPm#f?1>ai-gQI|5u$Kob- z3mI%^HTkQ!9Guu%Z0c5iTK=EU-Wgy^Jd&n|krJN_$-$$ol4$SNZ)s_1ull!~pT~pK zqchY$y*4Ia2dG7Egm02?k$wD&#}g6*te5wHx@%^3&~BVBhpGq1ZyB2yXW5tl9V0r{ zg#7G`oAd4TGNIUTbAlln_{IxD4(m++OqN*UT^A}Y3M~mQ5d_aYhX6$?7=U&{;i{+0 zdV6X(H%v`Uj)==5-aOEdX^8R4z(r0N)GQ;YB4&zIi3TNr*E6WdILq)70u@djts)OO zm+UQY8rG*0i4LN}Ch*nY(n8BXRq|w&dz(Phy9z#|PFUek7tbBj(WdvwN8N!2;!n2R&7Rfyo^cRH^yl_D`a( z*vL8YtFZj!Q14AUheNJJ0k5@0yJ}WXW!2WMcAu-06WUsBmZuhnhx@)>_co6Qgn*ND z)^TdmTtVa58fDbz*hq)R!A)W2BT%6Qp2{~D9*E}T)O4%s>Si40=7NqqHi*Pzh*C4N z>6F0`t5jVU_%7`}>#O>p)mJnS3ARNC8)_QC2MCEULL_VKmwqm*FR9C1@N;n@Ehe=4 z+yx-$0)qH#tv0h0Gwi+n*Uk?&yRnNIw8>G6k>s+q)BbCs}K{G}-?Z-;k6N>W6(lK&8b=J9;_-htA8loP@)%^GNrwpXjsOVVa zNyYcv?3|BB6(wZ~I;szQ2Z0fF4$ZZF0C?XAA=Fg0oRk=TIR{14kUn zzLp^a(|mB4=7c97px}99hmfrR6fczbAWej4WrXSyb%ogWGI z|I4=g^ztTl#pX8J5ub97q;zs1(|vXa!s@;u{!Z_abb~RWzF)bdNNw9^`A$i4sbVMmtJyjjmUS5 zen{eXhvqHMMd88AAD%jnuX4k(L+Ilqj+O75DarMjoXq_low z=MO*BNXl#N9IN|O*0Nqz(rR3FMvu!?NN~huOVaM#k^eiD_j^Y z77k$-Th<&kUxq^YhaVHDn5LX6I{nc8aL-s#Zej>O-|qu$FjE1wdY4xMSMZmLRL4-< z2hc~bABhfqnaFS-;ror|Wei*4%zCE!c%T6FfXi#Y2pAM_e!&o6yWq-GvohP8rD@(z z6R}_}R&_9r_<_lc#-@nIw)JDg;P%_03RSywop}YnY5i@TLpK8#6#}acXpNwayQ}4z zkusZzklgeWg%7_sqn#N?+&<(q(leHz-1-mp$?4>@Iz`mB%0 z(YJlC_4!h8e=I~rN|*DJ@U33oDb9HTny$7cx5Z5wgzu#xI=oO+^z{to<@2NH!_n&L ztY_{}GqIEXF}uymFUPTmdQp$KSXCRXSyR2wN`70_MbPgC6F?c)8|>R5@Fd{M(G{E9 z^l^zyZd}~(BKCtV;4Z15_YE9hj9U?mSMR7hY>Uy3w*_&LNMm(%&&b5o)MOeY*mpT! zTAI^+vs{4%$PG>rve700C!%YNoRoox8dYM>yhHqw5bUl!cZZBg3AvxV4 zMBCz5Oyj14`57*m@*X#$R{@5!Nu?GEC4=wz9%Q}{?9KI~Qznc}Qj$tj&dTk}hhz6f zd!v-tRGQu4+kHjD_z1j-)#FN+(YO_ebX>F9>F%!W%39|&6?J>-K89W!e8bnn<<`Ho zalc?wm0WZvcg6kdp22nqrW7zTv_F}Wbj+{%w7NarU3VcLW#X8WnqI*hOs)(RmdLfZ zZi}jF3<9=vP1(!M25SU1*g^B|3uT#U`a_=^pU;RF+{KIx#Jjf$+pQ+oVdlG+yG6{D z^l6>@bDhb%oJCv@XJ}8?w}1c10mqnwO5KB2m+KxG?x$kZ1LCZPhuG1GQBriVkM_&z z;||f3+iW!o3|+pLd%S~DgIYjpRLQl)#ULf7DK8B$g+$M#yOlnMWqG*(Yx2%l492Zi zn~`xg_}I5j_#lQ4Z<*8&-l=oGl-$J4MQ@T%8WvRs0(R%|LI72sWf_{he|q1mYDCBW z>i+r<0iR?f;Y+xNYd4#*YD^QSdHPKRoag~X5AnOeX5C)3Ge=Ag_rKdeRqE^-~KEbx}p93J2|i# zF|E}7LBmjLYhq<(P62R76XP2#=P&mf@`W#}qWgQE!o<8`2cCY!0;k0m2`NeA-A;Rp zNh^My$3;wZtSKj4uC2EmUxMK@pCe^fF&bi{YYS-OI|YG#&qK8A_=aj~xoaMFJtZoMDU&B`Ufs*tLvNdIk)FjO zxrWdszsvMk32&fyrOe<@FWI+zApUL+dLlcjEKYm5?^e}%W&9OP32-vry&2Nu$x6aZ z{n~l2FfEVIZoPK88cQOlZZ@9$RrF6PWYsTSjmwqap)jldLXXYL9uU_jnqO6ufxQRW zp>!mCG{W^WtpT_|iZ)^bX7LZHa-*4uWPCaLTT6|DMecJ#t0DTk_IKM3L%ptvmw+CW zTm9IYP=(o|YLs9kx8}vG9t$oFhN=y$6TV_p+3;}Z4ly)oY4tWO^)?~he2^?lM}@|Z zP63)d@A!a>!5VXPolT!O0`$!r2cw8pNI21W^PIJxFH016=5x4#EJaC01nz09jZdF= zX$CRK>--Iq<3jzg=;sk#gU|;}^?pTdk`1*EK@Z!n=T8PR-*CaWHeYS@doLe4w`g7xbzZjb@9k4eFq+qj&BruRdBH5(0XfF-$#UA5Wa6lvOrkBN7ET*>hi`~>;#XrXJG zYU4xv^96=vRe)G4k&1?a!{=aceir)`eW0|We5Ip$Y#zPEhT|J!P!s_^(K)+IOM0-o z#>^tA;d*n$$N91KnjIe<=e%=KrhJt_Ujd-c=&oJ_TvLzJr!IM*{8v0y994JeCHFBg z2d8ozTt34Ap>cv2QM(UZ5k4x$3HzY;s$3WEzxS}b+#RmoXbDD6lfj}!mJ}$T{zWuk z4XOQl-|li#aMh@5?k+>aaPU5s%(p5498jE%-17ynlKaRCM; zXfZb)4ovlJzv3bgqt~48Hz&P4p6uDUueYZKH$D({q=&bahW_&z8X8@u;@}=~dHj*^ zy#2FfXHqx;DW8~}Xl-kYiHUImsx*|)uhlj!eT>x!uyj}Fta2`oeY#3R$^8OlzqAFS zHjMe`gvXHoRIu^T-A*ZzMCdhYb~d_dc$1ytL`r@G&Zw z7TkW&=1#%DTy=4IdwRlb3HW6w^iAM|q<8gos!ovwkV@j2>uyF5Kum#}JMS4dr4^2h z!b|U~_a1+d!Wm>#5vb-r1$DrUsr@aas@A*Am=M#|QBhT5YGRCqMOx(On{TA<*GUYC zQ;B1#WBglH9#h@L_A6HYCgXQTpsumIh@eg9=HFPLm~O87sw!#sMH?=;5hVPyztCm1 zJ%D{uP*j*48>JqeAR~XcSs(+EN~>QS&()8$z5D8{_?}E2kNx_W$WqG;-A=x>iu#k# zuPVMXB1A*q#>a=L?pRc;j{RetHCj!Sn3InJ%&sv&1@HGi4~ zDN)FrW1~N|6(T<3^M|T;$@+bJDkXl0P=A8 zf4YizVIkj@8>Y+f?x-N!`=b4#{|V4qI{88S*SPL66!xb(_ok1z2>82v#*+={kvwXX z8fbfuB1zcZ8$N(xX>(ougZH8J!iE;WCff@39TB6Yh@7ZOPDm&(`H9~qRed2wpQ~rr zd@-rRg{(F7h@Xz3W{QBeL(J-MgJZ|yHU|>W{RB9JzP9|$3VksbJZ6_?cSi@jb6CH6 zI>wrHc-`3D?rN^3E3CITh6S>!9YJAP8~2K0i@ zn$`V&MY7Lsb8CuEw};(Ukr7nr0nMe6_rPIQ-oy=yO8~CW-!EB|Sdx^J1f^KnIpPyi z9(Hq*aIVP#w}GPUXc53&A&+=wYl{Jpq4|xRn?78#P*ao754Y|?h#{YI{+TL3Whwvh zcf4Z7f6r}$@*BkU-nca_5ZV(Qa*F}-Y877u?d*M{VG~vmf!+Hy$3V5`xHS!pO{CT4 z{5rl*(1}@s8ZY?ym?g&?uPZ)^6-|>D9Pk|zuiG25FIR1GZZ!TsrN-YMwQ^z|%$ zarq>xDVs45yq&G>rF|W`$Sw%z?YTdhu7?oaExCx{%@Xzk$E&D2i3?%LlQpYD5abNu zutSB{(=$Q93f1Mai%KX6>>Z1clBryM?YajGUvWK!5d!A>cKbUme&*?m$^1@#lIbu% zkX_f-db2EVhsR@2D}E7t5-}KH1iQ)?x*76`l~+{LQql5DLPbOfjd%bE4(n!Ppiwh3 z0*-80k(l^Iq&0-Ur~1EW`DS+Vq|BYeWkwvOZ^0dHnpA{Y=Y3X+@qDjqE00j4UjWx( zgZVBxV69n~|7f>J?)z^0)_eRorSrG4veB*qvRW)O`1W?NG5nyt$}sGZo|`T(SHsiO z(ou7)y&_9*hX&hEpBtSS^G80p=%9^yOK0qB-oEcAkNtH8K;QkQO8{d%^w9@e>tE_! zd;Q1;`(~M&xlXN;ly~g0?;Gkwx-?&JlX}}RY z8fU;2OPBl!`CWD$e!`W(yY~Mv^_D?(1>4qWf(D1+?(Xg$Jh;2NyIarz!QI_q;{+$T zySux)^VT`{-g@8q!4Il-LG@nUbM}}+pnN=@@Yrwdr~OvbaI~AeU3arJ+R(6nYk60( z{pM?WOh^$e2F}YX57JSD;83AxbCi!$R)RbW>$mP5?>HnnU*NCU8|+i_WZ5TxF!~NX zxVN&%7*1j?V*oM}tvSP=Q$ZFUzLQ1&k1u5b%Qfk(b144 zt{Bj!_36nG))4|e@6K_@Akp6P`{0(Il-M$$51m|%d5iND966g&&0*daw0Ks2>r+IE zjEu0)>|n8-`nz;>ilZzL56aKs1|7wWSX6Pe8o#1pDw!g9bM=euL@f2zA-BiOTAs4ddI60iU>{+cvEXsePe6zr zY3PHV_$8wf9m`&x_HYpHaNa1&cs~f3SfJog@#Pj5<4i(E!W7t^iP`^hwaFqG)& zG@qWSG)q>3jC;5cIj{8$UM2%CXb-Q;0C^cwnM(~ z-_YBN$Y&*`Pe1*Ac=%vN1ix`Y+b7?+uEhqY;lD>thZnmP#l@<+v+fqd{ZgHU$G!A= zT*0tXTlZZR`Pq;)eWdD&5|aBF*hmlSSt0VLA&K6jdphdNYrP#b>P%;9blaGt^Zyg5`*8#Gl1O#4W7gXg*x-TmkQz?*$=TEHYAG`bX^SZPUP)NOIm^(!7}jIZC|^FT2!050n4skKdl?XoU@q z%qH)iUzK1yK)RQdmv()`8io7BkymirR%mi7FUZVDvo*9|k5#dBgb61t4EUymuiH9D ziB1XYeZYZXAmwqtwEQ%b$|TU{1aEwMw_?MwFhz2^-iz6kg%4nh2p)%UI8Hwdj>3<3 z5yt)q3V6~>x0b;S2OQc}cLWQRSCu)Q45y82^Q_QN(Z)whYzX>T&JNcC&|l!CAaLSJ zK!zeve!us-38l2{?jDJ&2Qq-yDPn${;|GevXKo1?pOYw`KFqMNY{>&GbGx9I%JnX6 zP#Th6tVFgr#8&HyVs^rxm5g|M>WT^;7k7%wVNozraLAa0NW`9wg(z*d-l3i-__+AE zi=7pjv`cU%Y;!(WybGA%`|!mUSF^2!sh40vr0)!(&{R~^Wq}0XfHeheW>6+ zKzZPj_zg{g7bE_Fw#q3gCfw8M-cDCuEK}QJ_v{N71n0?0x`_`knx6R${d=QV*AXgS zSqchys;`s2W_n_xoCzcpnN~@z4}VY62I)-&OsjYwj_8PgyA}Dv-C>>JoSbe(VHS~} za#%^q%!$mOf9qn@g?v0 z*YlFNaFa!UAbPcu?vw7QksmM!9}jl69RV*;GMPX14E3D9qtx((=MAp0skcXMHnGkV zlgUOgwJ0daIXN@o)pIAMC*cs&%t*kW!8S_DNcp&1@wkA<0WW|%hJreXwui2wsyeP) z%S0`3{XXhWRKwJ@H4tJ=;A~!MUEbyOrlhFJOv}z1;NA(HQ&oEu#!zQ%<+I_F%He+i zxHx?Ag>rmbX)_0vjOX0nY%6p0cj`vL9J0e{*X$VuZN`}0tDF6 z8keu<$<8u>xujWQ6GWPch5UHx{OC5T2W7Q0Ax^0)d%Aw6Ir1vsWc9rD0152TkD2+! zWgj2M)?(!SXHk_z`fHb0vRx&dlR5(OT#gimmiFfyc26I&yivcacE0>(hG~}5f6(BQ z(Nh$lr8geQ*PJFs5daAo*gRCts)sv3lK4dNYB?_RW6^AU_lOJ92EX0>}zNO{imU;|F|f6bBLU$6G=hmLoFvHJUlSJ2Il6eS0p z(^BGe8uf8``pH*9A7@r)kHQNt-K>UilkbAT$gw0ko^zb0n4x=15EzmBEpEeYVT>Lj z-*yH<#a&M?Z=U8o@%QbxcyRkF~*7%+0eP2AtRri6bBT(yZWezr4PEj#_rYQf%l^;vc9>-wd@()t1 zvx~!zgT=eJdI}reH@Mu#>to!>dl_Iv7$guVe3sGV<|g?^UJ2l*0Fye8YYf%f9t+-c zAk#u%KabOe-QDX6#kr1+B4Ao2O4eLRT+M8TMP5NSOqLM3+(^nWF29Z?A*2iIf%>ZN zfZqhc-|;-~bjgrH?c8mROD{G{U0b^%uL2zx2m9#tMO?WsA%XJrsw996XVy|oK1D^dt-g=ol(&k% z0BTaHX-9Yre^!h~RYgG)Y^4RhTGGfF>p)~<|a*D-r47QNvN}kv#X$@1e7|Yn3(%3-?{0zOJv=5$_p7p)#<7jKd?&vGB;09B4cD^BEu}t#qFIy9A@1Jt{>QTK(DFz5~$?TzotZs|6E- zQcrSnI*6627JWuSiNkalj7*<$T6E4Gihc?4j0S7`8+zngAvIeOGJpwLDk?OcLoHz_ z92gk)FO)w+b$-r=-?uue&FS*Q_Udh?)_H}8XO}`gwbnsROFI3QvgBslN%8u#3A8w~ zaN~B%Q{x#kgyQ2e7#P)Xx4kJ=}+QybC!J{ zJKdWl$V==R`==}9B^0W{%}zm8`Tp^y!}nvQ_fs0lmxh`~uhSJ_Yge5UB-o5k6uIH; z^Ee&V5JhYpnjwpm5TELE%@{aJM8`w@t0Fx8zL&}@sII*%7fw{MtpvR2wVob ziP?YmciCMI`G02)3uyUMAYVf7DHyX&=SqcrT+RkD?KcJd$Un}L3d~_|;X>u`ii#)h zom}{v9|=hgSIw&}jx7-CvH1Ni5~JqW0_?8-0{?wqu-uUV}OHFxqLicLe9Im(iQy8(PKB~7SK|P(u*T-5T+%h?Vs+D^VR(f zIQ7qB9AkVlev=f!j{OXIr~EPQ=wWFt;6Jj+_-mIr%T|za`W2&bD)?O(*9Mrdeix8rKJr!NURZqTJkzv@X1Uo3yt z>o7M13265j9Ak2mH_i_Y-ed|s32s#ZkkK%aW5bmI{iw9Y;q@*_S#5&#e0{!Dsu#d| z6!Io{7)Z4E#-p(-C_t&!D{UEy2~aeU=re5gi*;59Kfe4i*c3A0PD)HVBj`HeF7!`G z9`J&?pNUt>-1PJFyhYi*VzJ!R+Bxl(gL;LG0AnkmEV0d~b$SRTull*_%!Oz0^=;j^ zbIFfpXcW_4PTFT?m_FM%!Vx z95-r#aYiFh8?V3}0|nmqt*lJoplfex&sGWpH5yvz-nAhM6yZT02 zenojG+Cd|qMY;;`%h|WMEavE5_up8=#C9Dismf?RQVK+%t|LC zWr*2-n7D~XqfaS359!Kd??=$_OEldX7spJ}jd{A<3b6Sz*A33xceYWQ z0PlE^M*RBAlEKp3@R_!mzcL;Pw^-9@=l3mcMIlK9zpAt{O5$mH=Jav&B^R zQC!9NnIK($FNtZ1;N6HCi+8vp*=OMc1_$n6PJ?^Qpm|Td6jCD+5}`T zVb!jms=icp&53Ew7$(r*+_k|MkCw$qs_&$PZXsOHO5(%MyAIZ049y?7G(RGmz;I@& zT`mmPicOP0GcFKF4fN&4<{iWB=$oIw zs|Z=WXZ$55ljWT)^uCS{7`lEBiI zsCX5fJpK?x)Y%)AxL6buCa^vlDz*s_nO^X2!GB?=OL0@V;~G68EUfQH6&V)QP0_|U ze~ZtA=kTv|JC)+rKY=x9jHdP_UXKiC72}*)`r3e~;W#3aIK*wpAc$CFBd*tr(a3Il zd3ZrO{raDQ5nqKKG6RQk*XCqsMylnczi{vLwr zYR2QY^by@3i&sa4{WFdvPA#V{7T?vmT_e(Bt%r-4r@G85n(rlgQPM7Op@g#N2p7AM zf^2@`EwRim?ZWv-QJCJ`^kTx~D}1b8H#ykVAzE3FSI*aXV^p5U%W)TXSXuwNYe8jV zo+74Z$H;@ zaBy<1ZlC)f+exXuowVZ3==zJjehn&1`uI7In%5eKmPs1J+|ircmD>hss$OY?e-bLH z;8xDv@p?uFuP_nru>c7>OnwN@j+J0N2n7b#BR_vx;P#Gpi>5BJ*>6w$ue2(x|_%F2c!C(XlED zjM#sw>a}#UK{2-39)UGZ-tKSF=>^{2BV71aN*<{`#fk%WId!7$av zEQ6+g)^#uZuS)qFo#8h$Rd&@(_0lROqQO&-Km1dcQq=buY_L~P5gx**@VJ~~l5$C} z_fcSWO4Z4E;&KYDc|P1GMa9RQOz}0+n1NvLrhsWq658TY3u6j_bp-|)1vxIv-6Hh0 z2nG=lPWh`Z4nkR5hH52Um=!;@9BKU?#EMU^O6)61%HMsF7ZPrsUoM zumPg`kTHTDiSmFy>_6jt1270f)&BP4sztm&X2P-}5uT`4G z4WY%r9vY{g@ZkT7@VrG>5MNwYm6eiEQkBk_W41G|6?Nh?E&#N`dV0JV4gNx@cTA`0@7e(CNz0D zL-S0GE#$vik8A?&^uH!2|3_&jdUKjuSR5apFs#2ywejWFlb=)v8A9GTJF&YqqL3a1 zMR)q?c$ob0P|44nRE~SS2YNqzaNoXfT6gO5jGVM32hWLDOU%n&HTLK?i4ZRpL3iqE z|6OqiCg2P+HiKka54&MT-+fBa{)*rkj`uvGR<8C<$vGVLZN%;`dhQ(vnbP~`c!cB; z;TbU!D}+;{+oTyM^dV!9$H@L;&0S*PEiTgK)yvMu_P(~IPp}OpoD(^(Y1o$pTBdQg zm`aVMEC`hS0lV4i?B1rM%Ex55VO@c;iUIqjN6kz<31}LGjdrObzVVA#tz9rekmm5Ab+d@ zhLA1!rme5nKRkjQgZ;lxLX^!fji10!4If@Z(r?2Nwf_s@^x0|I>b&#cfufv2mgka| zzFFnea16i;>s>+MhDT;+jKu|8_wvfy1OuuzIdenev?;u)aZf2-kNqfwP-?vD07Lto zK6TD0_r&fk?KhzovOT~eh{f{7dPQpGUR}O~h!e>|0h`CTMrC!z`=2_VW7Buc zWF{4NwvE=Gw*AY4-_^CZWg-8VInx|7{$eAN{vWHPw*~{}CHM2}wGOA#vU$=LR%`)7 z6%7T+dGC?w*O-rO;kqoYw-S+1m`5xgV}J?F|62@Cf% z64FlEF*}*1;Y{y|Ui&H~ehU^Nm+tFd=$~jea@`67|4v!#U^{7u|1t(2br#;O{#xUc zwQZ10rg)zp#ykSCNDS2}J^bdPoigIs&c@Jz$x>x_RZi8&?c$oiG{-ZrmP+$e+oH(p zd8?x=^3v5&3BFSoM@F;|NX=JkF^bOyTz#g#?KIGF{FWoJ{UIb2&_u)McN7zw*k|$s z_J8G2V&J={XY=#(tV*+RH?%oI;fjr-BB5ELkk8LnCu=K?1}KgHf;rh+>d5%jm$=;& zg^5Gneu*g>#=)v1Q1jw%l~j`rz9L3S-Rzs!NX?>ohTYhh5q_-gtvYX_&C zSd@XMt6q?l0WOf;EZ@r62W%t)cc5TU9WY@o&qVr<;0fWyJ*@ z<2kCKSCO{CHlkFZI`vTI;blNJH>UNzNIfD7OBtf`lYGS2Aw`${`NOqGAsA)%Tu4PG znbrGXifh%}KR<#iZvSvML~lyWo@+cMWEQ0OgLBF3`WbB+n(|m;>kMlBMW#!&Xdrre zon-`3(^Sz_nu0y^P_zP0ECK-+ERy6kRGEVRE);^86e;II?@yiRXX!}{lNHU&=$~Bj zpo+3=EL0@c>_WeGX|9^O8J1E!0Ts-zkRXr#-)Xdn&QE2=3njDM{dT@lIh51?^ip9Au;Dv}w<$#VPBdqPdnBnjd`I1?vhuqY?AKx?onJfd z-`Hg|dL)V97U=zt?oN^>OLQrbtYDB%zZ|Pyt~ea-Dz_0bfP4ix?dL^QuFdFWZNTs- zC$hxfxNY7_m658KLjJBhds)sjp-VO#PwKkk>$k(XdG1+(UkHnSqmk8RIZcbn(hVPF zU-j;QdL%v?FsnBQ>3N(M+^-THj)E>rOJSqqzOn|Auc`?;`8z+4XVtROtF)9ubc9B8 z@;ZLT+s2OKhhhHEyt#ps3pnBk!?Kh;Zp2Mo#)iKUt$#OR9+b2?)4)IWN4FOudKO*T z{8tR3y%|V+o1*_@YmQ{$y-helQGVO8D#gS=W0HvnA~)Dw?QHA5fV}#NKxBG0FXvd9 zLR1x{XqcF+c53}>y8qB}qbFz4Mf@YJ)csFc5~WQgA820;(ZBxZ$+OFs_|&_Iu5Oao zo3~#xxSv3vZLWH^eigok=p@*9U9e-MqhiakbG&*JJmCKi8&+y^ws+e0Xekbl91#@! zxO$oOFCki27S(u{osB(8J1txy0bF z9=?v=pJPn`{bJWlgUx>3Xuc3~>ltuG@3nRhe2K{taJ=mDmpie9I_a``O~0HvVd3iWy-4}e3@PGiJ zz)BNUXWLqgBO*xH3bte2Pij&i0&W|i@R}1hP|JOZN5f`0+ z<{U}HptsJpRohnP%SW9K3GTYeJM8!l(ilFk4r(JA`hZxttoq~g--&M-7;Kc81sQn1>sC~8)fx!G5!DW?`)^MNC)4J-3`C-#QEn>@}f zohfLaO`TO)x17tx1o?h&v3q*pyL@ml%DWKr*_II>8@vbc-#xxf36(KEkmlBzjFv)0 zO*#or|0Q@oiRm(cfto>0O)>eM?nf|BVHaQE2MKh8%}cl>U=bkn2y0QSM#AcfWoZiv zpipbx;S#@%(4FZ88SIDo95b4{mvN89viSW=`8mU|WMh&WR9NF977~I-9uAT+|A@>UWvy^nX}Ogc)C+p$S@C6{-qzgos&N^$@)ZpN ze#QTCS5!Cq{ObxKqYzvpeH>L#Dho)PKYwj$S_v`u!%Zrz189%!XVBaQSjxpIyzwMs7)BRIA{l>&{%ACu&t$n=Im{8oL zcJyfQ+x6+>pu=+GByU%IOoJKJ4#xLUqJDXRl=B@I+gM<>ZiZI;4-OUwTf{d+>-ju{ z($90}&kzWR=T>jjP4O_XU&8*20_*+yzY$}=Jew>wDQMV4?zZ6`#eN;;=&#bVWnf^U zv)Ubyk)i+3`6|fF#Bs}j@()(JAtZ-@ikkM?lkY%NN2y0qq(ZO^x^^nq@gN@`zV3vS z;6umNf!RYtE~qjA$ATt|Q>PPKP&{jl#s zkP~m^;`r#Hm$UnC(r?QchB)Hw*84laGLWz1IY82k!&67iOI%U$`fMJ~xF;X@WO{=o z%t@EeYdR9+X2eNOR@(he_5Dc)?tCK~$uE&VI2=z;C%S502cvBZ$#BJ|^Rv!AubRr* ztlR?E6&33B$>YMBig_qWBO?FvwdO)bF&d}@peF){m6#OdFc>~^u%>dr(5R2Vgqbrk zub=q6DX>zes)b!F!oM%bPxIeQ*GBaZMZQkWF`OW>m+$7GpGdYHHHEu`6$TUm6)0G4 zGQasFakT?yM*o_}qkrWELDxoiSxa)BK=6JRPjmD@dm>9uLjf5D zFF7q6rn9cq!S{L~i682&$@5Lb<@4ZL=GtbH-s)hR(R$s->(wx;Xy2)FkRdAjrn_)E7-U3&84J?lh(TCX!r=pUQ2YW73l~sl1KC zv*Lg^xt{*ojq|PCIZt|8vVh0f6-vTDF&TyK^DSL2B$YJ{RfQtB!a~?#Q&Wsy#4tKL zv9*=(Oj)h^UMN912bStXVYPg$1{bN5Nb_3!ZLQs1&|f?#G&#njectmh!P~NFWr1@P z#1qMnsa=P?%Gk;3h2e#{e9u1YIQkdxtk`Aqz}uA09%jvq$-(f()(A6sD%kzIit$L= z#@dDSUNrvUcUK3Hv207|4tsUe29~~*9%Nap;CeJ``Au0iQR6BDJgCTxS!_~zOQ_g9 z!6wg0dP9RNBmQl8r9U(it9u5zAnjx7xgMx-ONTYj35_WTE&cKXZ-W!5vAU_RTL=6= z43h}upv62UhZs2B(m~Had2wY&EHf>0lq`Zbv!t(~;=JD9m-?ca&%oPLZ%lhF{Vs`? zc0-%;J%peF@Ur!819BX>E`xh8mIt0nQrs0pgq4z6q$3( zp?c56?0qgMX2aF4n``Y|OMbtcg|3MGk;!X~6S@5h4~zxerA-u$)Xn7~9i=2okwO)P zL7A?7yP}g=Z(A;meN;cfUA%(7^|8H-zah^!%g{=_u>+$HxZG^q#dlTPnaY z_aw;Z|G`F8>XwJv%O< zip29$xkq1mp#t+eU2gP4H4(!4qF?jtyQkUFG5=RXbOX-7fPS04og7py!edaS5OXey zAH)8ju_A2qZ-QtBeLTO#0bftg(<^MMRss?%eMzd1y# zz-6GAY9Biey$xfWY{%Y(C4XAo#vN~Y0Zn8?qHR>(&kctmFQbM9R30|yWmsyBUm~Fb zMB`9AJ;Sj6jAlEaK(X(BcIoN5W3}iUHF_?{3YZ)>#Pn-lvGIfP>p4y}H)15-e5-!8vk2~)msrd%QiM0tfqQ3$ z#zM-C@hRyqz2ASS$T?_qDv;*XxK#X6B*QZ{I82>8DobRaWjZsuxYDcBD4pU3AIk29 zVlM<>FBxfmM>T05rGPNTr`f?_(WFs)Gwy|x!tSs9{-+}Z{&(ya1}Zu#4W=s*{OTW` zZs!{nt1;^M8&)e782}R#0APS*S(#UP0D+3QS#$6~dith!$tl23j!>t2HxMvzOdz4y zXbfNQ2pN?qPT@keh!kCh3iNmzCKN`Gx>r8 z+0SoeT%5Yrws(->sQ(&r^$7%7VP&DpvYN~%*4UG70KKhlScH%)5L{18Jb?yZnH-TNWFGH>biqoI(g(RcBT+B_-UKKMN8WOF|g}G`#=! zpzJ znlJ1}W{008U~j`f$X8YX;xz5&V|TrX%s?_7lLcIrpF3s$v#DI)jDm{)DD5P4_qO0B zr_17g9zSa@K1KsW)cz2#E~`zHpsp5g{iR27QEgUg217(D7l#}fX!!t)k6VH z46W;DABD6-PJ(ZR9gmm#x_syQ?WmHk1L(OEn2&_eMWCgw=j(oLK;36CRjDW~@?EjQ zpsV|F0VIrg+niX8#^$^pugFT#+44%qE#SD*gWbmX*$TMbOp3`y#s6YppF~Tl1jcs)x3I+r&%9v2_U=nBlNd6yVXDDi!5cU6w>$tb z=NQ@!IDiA$Y|F}4rxqRp?W>C=>3>?%+u1KVHGQC!3MT4&j2=cd{sSs%%M%M%;E1{# z`yKq6DippMV_&_Yst<$o?ZNdLj1yQzK<9?$E>uE6CI%TsT&|W)2>T}@YOysE7#Z(S z?06sLI+CV0u^~Rt>e5!_m$%-J<&|z-SxZa=2&%SN6`1|xt1(H)QRohMay{Ryj|bP1 zwi{nU#r>^;j+{A7gGU#AM_+34#}4iH zQ)k0ZWaGze}nPu%*Flzo2S{Q>D!mjxZ>W_rJrGuTzU^hJ()>#%g;> zH5>G*rd}Y!`b0b+#=Tz*7xS}0=LCOXkv}Bp7c;(%sQ;tT>YPdXlo$8;GB~MW&v-N87&f?;*qC zjxvdMNf`%yOn^$ug47C3Zu(L*cwGOb-Q)~U=ISe_Scn+V0O_x}gJIHs18G!0K@)NC zX)P*rS>c49hwhA{I&PCm4bVE@sLfWLc7!3M{GsrVuj(C{@;9 z3h|MyZorEOn>$|~{@tcD6PA!spw7^8P0MNY0)ma$?`xcFD03sPk-XP$gX;cM7`txt z{CGOy>Q9A+kt1F4*;4cBOw77uR2YnvF|l9+zmoOdGAfJyq@$X+Bu(Z0{jX>Z)GOeq$2Yqn+tfsGm58bHV zk>`~Idyw7$?RRY%{~;#F+|P9^PLX|5F@JJ_!Tl@c;qTItd=SutPG5qj%dgpxEFhL| zhb44(+^X*c$t@&c)Wp@{A0mG1h7cTtumAB71iN0_L`+H6fHcfh43S9UH?947L&!z@ zk_&kw|3*dWXR5Nj4I%T7$8U!4nqF^+7(shb>=9C-Bhoxxv|q5m^K`IE_>lP*Ee{9 zy@|BJNB>ckQed6p$B%KY;cWJbaz!bjS%Y{CR0x0uLUITnGl)8ATfoG*_=rfD&NEQ&wBzMhn10M;D}pmGcnFh$@$UIO(P@HLMa_lr}82# zO~F!5py)gWOa2QCU7H37KPPl2XStD33+T=e5uv+1ZO;d6p`Ydy`vr_=a^d;G+0h%yf|Xz z{d3x{?(_MY6+mQ#IWm2~en-j+{n%41SL`_YOY$u7-<$SR64C38IfQuFB9#xZE|9i^ zbdQuzR?&WjhhR(pVaisPr_Nrv@qF-X* z>e=UN1anpXyE^pu7ES%y_*7h(BchL+hx+=g-fM{z2|4C2uRUPFU#lci0E6i|99Y=> z>x^d0?Yjfx2TB6{uSM!kLXpV0DC4x$$1^3oC}jn*C5Sj$ z>2V@qHhOXle^V+Y(7WQ}VU}s<6$09e9CIsaOn%BpTQ1kqSMnvMn7&F4s5_ZjL(XTx z_3CDjSn!ASZlkAA)yM|dWotZJfk9qje(j+V@zHa$t$#|vPNxX~bLO&{l6b2#rlrai z{g$?fJ>34oxt&MMUu>83nFbzyxJ$>yn1V2E)L3fMN%nO?WQpD&mR3Ttd3^gW^c#`B zrARV?7YLG^l{pI1Q<~QlmygI;k1D*A>O=*Lqv0EzlNc+5x-X4oAez~9XFfJZB5H$> zGU^Iklfb@Nfl=uGYm{Sq=9x!J)gXBloH0znY;>j(FuMX-=U(paWhWiljtN za*xrAPGgtS)?YjiDrikMvodlD7*tm*p3aLSYF<7~iEu)dFitQ#Z%Z2p7CSjQJ;4U3 z_`c~0N$(fiqmbHaj_mCDqCE&WSlr8gG=gA?R0DwE^pc+j6@**CK@_2I%KkX2?iQNlGkE__j+8z8I>f!}B_k3cfD7qM}x)dy26fyCq45*51=c!t51EDWBb?ke**6u~j%Jr?>s@ zGkFPrnP4CM{omUTu9~V!kP69*)RdCT_2W!Qu9L9J%ArePwN~V(X5x4UhI6fj~HGvF6LU)=AvtF+0c_b5Y2T%7R8$s72R zDXyfY`@mJ12aFJJ6lV&%#;ln#fL7AXk6oEF{ta^e7J;PK${5zzhn%~vh>?GNKYlu} z+?T|O5Ql=aD|H9X)Tc1~L**K!RhMfmFKYy=!%1v@#F3>nF6USbB%m~}m%it}Huig2 ztOdz#EeI)28nh8d=p_{|n31mGjU^W5qeMcO9wc-CwNfFI7+c{7V)) ztE>!Z8Joalm|4<$A~eN$TAjVtbCdQ){uAoEb)tnZZZ0DyWJ;xm#Z& z1jX3lwuycjFZy)NvfG>%F zJSWbRToog+%=0>Pykb*>KfbXn^=eIo%Uh{KoWpuHzIXfYif{6ugHZILBUh`TDCHmP zeB(XiT}jj~4V#}Bp%D?Hlpp__K}AHQlEtF#uY&ns{8&Wy@&XI=RYK}F-4c%of})N} zVPWN%2fGlyG;*XRb|s5GGEDfWM+C)?)Yio$tyu)T=Vz?@aj z4RHq&e`tJU+p3gR4?(qB%TJHM2>Sj-d#L@Roa8+TTe?OWvAk)Cc10!P0y(V4#o*0> zBOff^YRZ?2&^0WGnY3A@5e@@u-09mY!^$zp!8~aiH(h*Ms7?3R=B$jkh4_<^^!sfXj{%JQdL+79b`(H#}`1m42 zOj8h-hq;2vh!#g~+mavqWq@HpCK1sPnV?F)TP3Y98+z14qg`~YZ*rWzt7&_n%PHWQ zzh0Yt9KEiy_}bRWU{`ZfU~w0?PwM*4h==dQQa{hmR%dk<0HhYugYVAIwX`g^&_UpI zA6}yyN(MD0P6w~i{X>!jxY0?WphhVNc7_y3Xg1|ph@sRuDv1B{5dQDi4F)Ds734Um zW9P=9p0JIKpu@1zBM*vVJ`GY+RHYx9l!(d|^AAC^FgwjHo*0*Sp~anowFuTXD*Uy0 zU-c5ZZ^YItGksISy9cN2L~H%-_%EH}-xRD{5xn?x*^vpcX0GU0g@WQj+5m@SkzrPw za45V2O+n!P(elMTFs+fZ7f>>qvTW>S!_?EVSa8J(~Q4$NR4B%SHou>Iy^-E%QR@|^i?pJK; zGFk0rlP1JpSQjl+-OWFRX#Wpn`!CYwC+31XB_pAaIsG+|nu&m$jGb7jnIM4%kjOX+ z5HiB~MhbBQRLMK|Q)Z2?3SQDWBt{VQFSt2{%JMOq@B5^{yKVu=CbEuKrqH<47+r~G zR<6?krp1G{=ODA)jh|AWc~wijZHCBY(vnz3*6)})*g$ASV>?0Kq7$#NM>mojJ}cwT zbKd>=VCx1X;`v_4uw^31A_wE?CuW?E3xY1AkBbeNOyp9DL{Thgffn()iC zO1@-~E%LY0Ce#Q4GIF=DjG6gfO5y~qlO{zG2~%N<(`~;9yh2#UX^V>*Q()r&IFIj$ z_4nzJVR`HWb~+_&(+ygR81eND`4rdqE&_`qP=)5FrjxTgu;yuJ*>x6&RJMB5P|41yF%260+kXu!u>4SLwgp zrC@z;s_tz*2M=z?2edNFrN{Fe`BZkzCivw?!O?Uq*j~ygmQs5vKk(U~59cxRW9C{T zAJQE!p{(j-hgNgq7DG~SW^A_0?N(WzuU8gl@Nhem48CogHVYbewkZPW9}vGm9sX3( zbRec0P`f{q*T4^l%@(5%6&d{3nYP!05_ut5fRhjq&`tEj*V+9%p6RW!D8xuk48#0O zppcxxnzeOOR9l{tpBkI_7sfj}1HYMqzw60y5%GJH@0&gj+MiC^_HQtPbj#HM>LJ;N zY!&g4#dG#zy{Qe7pCHaw<3M^vyZ{lQ^Sa)?Ed~>I4*$D+&#dOJuS;bQ8Q&)I`)AZs zIXp4l`R7kYgrJI|qUZLr-|MD#h%%!dFmgOjAY|f4EtE>M41i4f%VC~sC@6wfr8d97 z{U%`{ZFF3?e>Bc|-ug!I@-Q?$d*13oCPU}`8%0n=8CALaeLJIMC1PLRbCx7X8cw8i zMUzzF+nc$~+=-|*(k7408mG1G4cS(`VedGetJ4PLY8xkBP8D~n zsIqpXB$NH@O+BOi`mK-i>F6y5eUz9d2ZyEE{)<=Q)gxuVSL0BEzkVlykG!$qRA79X zwf3`~t8I@R8+spC$ZHkWN!hO^0`?=WgC#`!!<37y50_GWeM@JdqB^C=+9TbS7TyzSA$X;XDL~t6ZXOcg| z+RqF-k+l7)&8ZF)IMc4vF%3?xmJ_$aQDS?!Q|}6li+bxRThxC~^nlFK*^1cxs`ULO z_Ze9op2b%TBhpPW&dzh-sfeuSX_!_LpiDQJLwM)V4ozT z#2}`!tZX%X;2-gc0~OOy=x~4(*Fq0l;iu21INMma30@gsH%8+B<+C zxYXVT%o6Q&WhG?s+8+DzhMh~sae1>!iA}>WX6PpGa>|quh@)_@sHth`SL?hMBgXR? zDH&6za~(x(J7(^QRxv;o$pXO7lyN$kk@ZfKps4q6mH0s=&d-=_DR#k$+U-7dLCU=h zKbzFWlv?bUlSf?oXvt79x86sayGJ}#+gu#_IYtKCzaKkT?7O|3)#nEykqf0(KGb7S z|4=N2joLVo%tK=LJ{TToZk$L0O=Q21g&N=?#td4MzU7swmOT6h^#ADq_X6vc%livB zkNJB1G%Ll*nr|{*jzz7*z{RM)eRdOG>aR{xsMi+HoK5qByrLv5T=_YDQFZUZ=Ykx) zc3;;+7?1q2sz#&F0|`ufT|u`_!}A|1gOB)&Ay*n;era@G)E8%y5Z+_Xi#pE>dWO8#nnLYwd9- z5ET$+6@xNCBl`kf*I&%q|0z%rw+`0&EX~4D^YkT=)EM4}S8lL{{WOUS3xNAXSy}o^ zJ(Za5V&kMfTdEku*p#z(K)Sv_n34djgh z)VlIgQRW;dg+|u^LT5H-AVZ<|3$l6-3#g0}CPo;&!^8}|`4@7F(mpn-=x3_vf7EJN z09Ab{KwJLteHIE2REMm11d+IGafET9OF;%>A_|!CKVLt!#$;*p+3Kv7 zG`FQL$HiB5`^}CTe&46RC6Tq|I* zimJ#-nj<1cUUV}AUVJ^@uKV|vXI19s!qqu0HXmm8t0Wq7lxrj+Ig%!+n^KuQpSW0i z95qAyEBpTbuvd@K#{9@&cA7~P9OHFk)~&ZLSc?#L52Lvj&C(nF?Ij-i|55dwQB8$Q zv;qQ36{U$38z5apx+J0k0s_)|m)=A=0RkdjKzb+i-g`%S@4fdH2%!cDBzfn)d*6?D ze&i2pWt|n~n{Q^%-g_z{$6xeBSXoW{al;oDu)e-c2(qx%W7_Cv1L zZWPzkgb>V^3`>e1!QD~mZHwVZu(em}m+4GBu0YLIbl8)J(3RWc?<)&AlzOXQlfbEN zmD@0{%eH3kCtIgOH=W@sf$s+5P7Cr2OU3Gk7bcGqM|)$N2AB72C?G3nQ`gpJPxQqm zN`<(_>F&u+E#smq`b6Nlugs!4%-9nyWcT6L9fRot1HvLlL)@iOWoU|!hcKXQ_tI_ z2{-P=QAUp^`xGEFjUqC!+M>rxagh$pIJ&6m%re)MB4UH8jy)@Fh918k!v=It>g`6z z%0MSi60aF0QsRIaakCw6s{ohRbR?J@j-;t+K_Q+IbUx>3;8F$qbIcJ(@sDLV(b#!v zHsrMO>Raj7#4#?M+V%sVE;>O?5IrfbZ#vEmcFL1}v|vT{ zswadZ?6uWIdfYB)mrvkukLt9VV^yVzc7;6X*CQ zlDGG44VQi|iSr`Wi14TFCxkg)e)VNfsdk+^4V(Nf!+lO<4CtQ&!Wc-PmOTSd<_9EF z(_A$nn(oPXGNA1U2p%YJj!OweR`F}+KcY@t=3`0`bO=kIn1;{Z^rv^}s2 zsGfSq93kWoz$#t4M~lJIudN@}ddyVPQNqYstX;4xYU3IQuJ+7EAUMFMxGdEwS*kR% zO3btG60Ry^1`X!%EVP*E*r*mSsbR1@W3!#THXHO^0O7ZQE^+pY3;S}P@PAS03bUC|n<+}q*5)EaWbtK=uA0W^Ca0-&1*+eL=_I=e*9Wm< zTcCVpd`CLFIAlkpN(*kU&1q44<2vAlSU^HD#`W;lAold* zLh3bMclbU6j9;}XG0=yTy25Th*ULH9q7&2bu+46JTbb)B{{pX6ewSiAu7n|n+V$9h zaelxjO|RKm;KXx1F4l2|2jzINQ1zo_Gg+}EK>d;Z?rDaKoYYqWnC$fpLl>1gNbn)kKM`-nwMy8?e4U=o=CATDvAf5N2lqlE&^BgTC6oR?ch!Q=r10w$c0Q^ zdI`}9m5I!c9r6%o!pk-E-iGZYv)(_iJpE-K{8RVa9ya+{wHU8fw+H)vtwdX{Ch1bABL`my&{FYWiH*{KctDtLVrAHM05frnb|JT59LjSK3Y@Gn-{$oG< z;9yb_M*#gP@GfYgg>k9Nz;daB{?9uXgWH?PQOI%Pb(=p^ldHP2y42Ebw=dVf`QZ7- ziB=4{QX9?tPaePQW=p4t_;p=874s%z9nhs_u57Y?S|(?hjvx>HoTN~NE#%K^^N=Fy zcQ^?mto(F8@(v!J@yqP|XVitN(JMS5ZQ7W`g@L<^yb~q8%2mN(A@fysy{H#W(%~$a zHFRoV-I4jDwvDJ>5z;F-@_Zc6({rh1L`x4YP#zJAp(|}f4@o-G%BLN`*T^RJ_V&+N z-X8C?<%E6$7{*IXdf5k5G8nGE>opglC4sK{@PnMZT)AhACAX}r+Hw!k!G)=-<)qp>Q{QKUI-@UF*5yFg? z5ObO`pCg*;LW!@)-aUz;hFRQf3AkBIm18G(inwxy2K&h|%w%@qx}tH^bWqP;s#4L} zpV&V&lkslCjg@zatM<;ZS-2KCq3+ew%TrdnkNB<0TH*YblW+emmMsuLgzF0n92b*Z z?j4^VEaVaY-2%K)ygaXKRYvWu8{F|gv5xmpxTEct#}V{XLMgA!2Tl-y)fZ0E3Jk6m zh!NM1((bz7hsI8RZC?WwU^J~loBQbmVDIqz{J!wbmd9v2<~`H$hhW>UVs|}mocFn2 zRj8EN0iL@2gseN;#Awfhr32T$|Biy?KYnGrQW0grEH#TC62eW!%CWy2R21yM$^!BL zCFCmNTOC!LI=AKR~#;kImjG4M6|Co;-rJxu0E0;*D3o>m5$}{PKp^M(l&8 z;p;D}#j*VnW!T~gTi;)DK{!f#_ICJ{#|3%MNRpGwtiju)H)IP69SRNwm1lt2{cBlx zu#wZH-ycy1D?5#CI7{MjvBdcceG0o}^u_VjR@df<%@H`Y#w9Y%S0CU_>1%0)GIgso z-hDt9p!q`UZ74*f-UYGhxIZGmUdP1797|1yNVseR#!U(U$>jVz7!q$oc7FOOKCt80 z^Vhq*uN44lSaJkF`>U))OOWuAMzc(i%!V|e2F=A0lq<(75d+}|@I;!mmh z_dc_#VEzNEM^f?(EzooPH$m#3y(#U!PjKfFp}AOmuu|TX66f(u|0Qc27j2#(i0xsE ze`?;r8onRhs)cHd>ccmWcm_iaK%zUl+cmfnzfep(ZHdm07-2eOyhqABeRA(EN6{-f zIvP38x>+AkJd2+B{mVnYgG>Rr_UY!;{Cn+e0?I#PVqQ5J-98_i86O$wJOAlIiD9-8 zvDfw)73xGwMcA$IV_K?evuVaQf=I&h%`Kj?0-F9}iTREC-*av}OtunES)9?Y`9muR zq_A)7x27^XI$Tmk?~@=0 z=nf#LXGZ0KGl6K|HruT}9P7ErGWqb%9hezSTzUYvQ%ulza?w)j3Xt4aBfInk7THmS3nF`mD{f7i z6YH{cB=oVaEI7bfQ$Wyihnr05@&6mBLCOuDURC{Xq$UvsnY+Wc8m}I4X&_ET^U%oa zg5uU!WvE{XvC~`dyD}6q7(TifJr;)Y-%ToDTm#ard+#6c`q0<6%^$V1>7d z+IV3SX^lZ96Y6&#^oPUF&IdPsz(b5hmkDIMN=gGn1W{v)bVKC_5BZ_-=mIG&07D;JtMMI$QK!rRaFFrAt{H9$9dEK2L~uy zas<=u6kN&9MFG$!GzN%D2dgOSKF|2R?xiF_MP=}dOj5GDD^u{!Q~nRazVDA^-Drqb z(H;ksb}c^-JrjO#ysKFEScTg@!;^R}dhE7c1_*mL*19)wsm;gkn-FsOuro#bfhm2X zFg>s+ig9VS|L9TQasTj5XkF=y(AzzceAorlHK!)C{I3O@5_u<))ctV>Ws3+>iKQlQ zCwx}X#rZQ?*|b%UdW%6$uTKQWU1+q|v8{u{$pS|xaRPZ_on8NLk!Yb|{R_Y|d7(B4 z{z9*oRra~Q$I_SiFiktz0epoVHZ~2eQMYct2V5CiT+yjG<{DA2?tWBsV{Q*H>J9e1 zC-X(-%fqTCpV2#Fqf8Z|ju(UK5@-`jzSxOxDKVxvf})P~AB8g^=MOBuh<&{Yv7Ad; z8=;S$d8>W%qEKCPvLz}>mCJRyLV*00Z8MRn zbyJ#KL8T<>(Fiz$*c^dal_?(E$E8LRHU{($n)OP3hRlf(_yLITuASzN#hI^xOM9X{K%cCl%%dd@p$g>Kwa}zp zs=YyTxG*81JkRiL^ZOqrmlFWFl1ChU399#w|4aBQ5P+Nkc}TVT8WbW3kjZsoyG?>A zLbuMYN<^!@a7%Hl{YH0NI~;Cz61lo1C1cI4JwfYZ?GCM>Rv#+HTyr3+C>Wqs06k+O13)^ zU-0xcK(Wv7ov-g(R~Twf(hegG+SpeJ!!Wl4Bken#rpaPE{OtW3K5PUDxmJ4?!MOW{ z&u$Lh7)AP&|7V0fNE?#MjiY7K_VYZ#K(ZeC8F%>F&JFF!i}McbCM~J? zpF~R~VE)U*0L*{yE9;9ok(?t<%rvL$m!3XjTbb=Hddi2}@Qv2mPs9vkuS{m)pDqiL)udw)Qt7QE{> z!&k^+L-DL-xy5}_bHBiFmP0Wo_$%zd)jsXx{e6I)B{x$RbdTJ%{Lvw5_{*T1(;4&=jwrZM1V6P{`mNzasLo{!vL`dj^p{sv6B9dyeItG7 z^IOD3s`d4IZy>w$aqLV?272CrJbJnS_Z~ez4}IfnX~IAPBA$g>G(ZmCAbWmlQ0Yh> zF*-Or@L0r@@#OtmVX|z4dgoXSml%idH(-8c=&(B^aQy7ZHy|AO`pc~jbA-7wIwbb> z&lX`?^3;#0-4)j4peJA{EDNT4`x&$)0xZT1t_R4jT-Pcdb5DCqB@)4j&+M|t^aHb&n}y6gD6)Z2gkx&>Ok zWR$JSW+A#BVj$u*4xb=DzFjgf2bfbmid6{>-|e)27EVe_D~SVkt+Pi<`6XG1{f!D& zjDphfZ$F*O+`OC!M(}_qyes=Edy*IznZwXDYxm-Y6C{YG1ZE^X;a?TLhLD9WHQ5DT zqylW9jUQjaG1WQ@IY)Eqn}vA3L!(^F%a%H|pj1}f-y;vx@Lpx*mv>QccI6CIxqb7; zdqIRJv*Kpa^s4>1wk5(AoDi8LI0fuw9(3rx-%l5j_E6*3nol~kmMNvdxINo_vOQn? zxiB}sc-GY7&-FIRCmI*@V+SMG2LRG>SIE9F<>2%vczBAnYS}+B91OS*w_$V+)8>Ox zYr8q^<=y261*lZnxWpZ&sLuf1&v(=B?jjA_+xOx^U|^@rr(kGTwu7#7X;aHtf2y?H z@63DJm)L^gt?sJ#jJoYNF#W}ng}Qxl`Un!oNuhip=Y7Vk9`cPWW6=9Lud@%|be!eM zD+T&8mrrQ&wsK-Y(6z3(O~|DlT8#CL$Xnstj`rx}2*k2$#kt}>g+-<_(9`I*nqvwH zl6@E0K6l4S8$`xnfwcA{0x|Ek&iB{x`?ptA{}`%;xL;o#mbS6+rP_kbe<~RnseTbo zr$3niXy@?={W`0**SJ05=eT3!Gnz^1@9{a(SA^nsCdlGC&Xe<@RCQls)4n`5$xIlj z;ioL&(&o82Aek6xPSG866tGzMf(AWH$wV{MSw23b(^S^gEm^_brsC7svVq?>d$#T% zj|8kcNuWY}?%~gWBMlZ@t`S)mTn&hl=5Edz&uD!}P;3MXU@QW7K^+L$#(dc0dnsYG zzgitDvsd?TV5P5Wg$EoAX7L=^=%V zQ3F$?KsI3E@;irpnJ7F4Nw3Qdt~|F1fPWHN?PtujVea|jm7mGZJxA?K|NT5$mV!%M z2xc0o7jv`Lqc`y&i=IfpCk_*P+AM89ewt48)&hg~mn+^j_Z->`{-?4vB zM}K+ag@ej30=az%WbVC1|BW5Y4FZ+FnUT4O$-dJWaKX~pmdHQ%yiu9@W1lY{k%&*} zz;aI03@{xrKPfKKY#**X1`Yk!dC)E1=(fBMkCw;8C?=2!-lQBq5xoF^+E7n?%4 zOo}u@u&Zq5Gi(gp5G$50LrhJ{57w@xKU@kM0E4b**LfQ?wb);`_-qFpDF0SqrTu(d z?IlbGmOty+eD`-3K&I}Ew>MY2mZWv@RO?;V^Zcqk`yqHmZ4VEfM6RT)j$KDcs}alW zP>u_XAs5;%F;yDhkBAc!1(jyo{%&{Xm4SrSjeY}isn;GmTdtI8%3r<(_e-z_DyCi? z!fl^#sSck8>edtW#~MZd$JFV(wj$mgn@J{i=lNM+5X=1+r&gH{82@i21$@-}7R*Ip zmb@~pFUc6G0=~W;9337U>4Q%-E#4cf05rPU!nhMN_l5?M#QEHoMhe(FRCkGV(B{2+ zU~y`7@ ze6=j*rCN+k3`)A1pOqS7<#t{r5RlLxTu(fAQ;|x1bXoY#V|f3 zZFWzZ`Dci}w-LA5IU%0JGe#1DDiO}Y!lASYb!Vf`y+?Wr&iu}vw$duWfWAULDCDf# zHMb{i%J!rH@qqF3fXv`dz%?$2JT%+H8(>qt|GDrRFdO`yV>;C={qdP_cDnLC3VZ|< zIZ;|v5FN(EdbcF0c`?29{&)q5f|q(b;v=xh_tq)h%AZcIokA%)83g8nCJqpL|9hze z+TQJK7a7SX8Nbg17XI``%@XWM;L`n0l7hlXSZ28pY$~RZpjA0CC9AkcGp||`Ul}_^ z?LgO=NTnFUmPze@6%fa=hv6vyIhYyLP9g~UoUemA(>S=~$b!-|p@%!0Bzpyi7wahE zt0P(bR-Zq^Y5+V?fM~1#a>e}jLgd{iMbau7JhJj%IA4k7CU+=lj2aOvfrbCN!Kf^x z)AJNVDQqoCy2kU}`JH)&%fd^8MoxXh{v(+G|DHRB5S&&MFVn%aP`03sJX47sfk#^- z=3cj@5p9E(2ura6IipZiR#%4L?o6sEpoE1wUVQv)_P~V_RIfEnVx|!wZ$V+ zdx8FlXqjTKlI3^MgJ?83fhmPOqj`u_n?BOWp~|Vdom& zKb&G}@)Li_t`xrT=!^S7BW2Sb1ZlUw_lqmQ;mf34Yvq@v-h`*9cO!+KrtP|f%ywT( z15||S;(4HKCIZIAg)DDFeN1u$wR!8b+$A)w9>a1E&h3vU~TaC>z>)v|b-Z zRjMQ&(sbjq$s}me7c5o&@PAE;5OsdFL3eX=6`7m&%88&l)z_BpJWi^gN)+Aa_Jd&&?0Ol(l-Ua@m>1AwvO4ytl5 zhf>n~>svZ5TEEH>8^Ta8MUcW@vJ~AjA+2Kii?(r-Tvq60R4}z zw4uFY!hhc&Kk)>AA3Pw`@q5#_YtQV7}tl zAHuNFG9yUXVy)He@cD`VlWs}>dM8=K9~#Q+HevBjGo|8P-_eG@`O4rlkI)R92L0!m zfIBDXxko~dyVb{^gqYYOJ%A_XHze)liRR>e-k4-#0eVCjs9H_Sv|v?a`SSPYfdPXQ za`row7j2pJV~5&rBn}HTzP)1;9uMO=(Mc?OzHnBg>;CabwZXW<-n8Y^G@dfjFN)JQ zOYjqexJwlHC7YzasH*ebN%6Jldso4a?t593viqyt(IkE+<9HB2kYwkLv3goZ0k#h{ z0?}`gI!(3}vWj>iC+wF+W$bxEzgJW-a-}OSwajH$vlG?^I!mtPCxp*FL#vq9?bqV| zE+~{W5$byL?TC{q{wMBUD+}v>aX9{h)j}SmN|5IW z)}*cZ&8LbJeb4mqt19|qP&^TJ{xXIBP^-+ktFxQoBhA!FosL?|GSr+DfT%mT@~~! z7bfa2k0k~QIm^qc<`02v;R;{Iw09>vM2-igkp$V7rnyiWkTKZLWPZ{S(Vv|fXBM1q zt}pLHPYh@N`e>PD^o}jgfkcAot@6YXtYISC-(l3~C)_?B+wv8H!ET+FT=mg+v5*Ka z{aFl3`jZg+`57~>Uz~@rC#%+5YSY0fT6VTiKgRA0IzAJo?++|7JlE*hkK=MljdLW^ z2=WMriF4!$Be54^$IsrTUt-^6wjDns{nDDAXkfFj$O=F-&X77X`Zx97n*oNJ&4x>V z5`ywglQkmJ-UIs7i}edg84C#T5xUbq#NDGklxDop;`sC91bUw9QyVcf__{DtSyY`L zFab=8>Dc)}TdE^y7Shm|8!$-RYa&MZh>9Ou=cMJ9^5o&AIn~u7|{fP71Z#Qv7R&(rN$dg6OvDjJHYfoJbgSw|} z|1QqrO%^Gs-ps11#?aYnTe9_uOrwECQN2&i+kZfNPY3{9e2Tv~9+qr=vnT1T-IK{j$)?Ug4B~N;whPqm~pU|5Tw}Q<>nspU+Gx|G~vzE}~pB->K5D zs?%vNft&h_fp+*pI$!0Cu<)D4NcTfZG?_(yb}^v!{hIOKgu8HOlg4ei0um2;K}2-p zO?i5@8+-hnDgr=0YLRB}&BJ|5K|q zr!>RPdA+f=6g9F*j1_Y~IrlY@PZE;Pq=kI+=|PG(e#y#FfIuWKBV}( ziw!PJg>IB2#Db0UBcu5xZu2&yx&DrQTfA$@1=%^S&h;#W=>WUpap%2mg`-#7x*vAl z<-vP{Y6rr;>y@13wQFF`<}O^{?0(g3dLxKitYdxuYHMSB(*OFp2xX(~XgFBP`sDA+ z|M@ib;k}-^-Z^4Aq`SIF2bq{D0N@xYjydWfOmmt8u<4^0EMD#Esy8~z1)!{A1%m?j zTZ`Y?A0)i7O@X6iPXzWvYz*ssy`HxQekSyneQ&2ApSqZ?6`fn6lkYIy%%p2m%sd?n zI0u_z$d8ZjV^A%F|5je)X}#>}lEmJVk^d5v-$q0Z7kX@12L?RJ$^`{qeWH4 zwVb8A*Cr-cxSMa;{`HPdj*~C_oNiE|8_^bV&S>%@y;70Z$V2|cQ>QDfyDkyG8rV4r zt=|KFQf40|YFn1JdFrSB3?Z_>Vru-1Aj9^6vgfi?c#?%r=eh%0(w}-i&wQ%(*@GBw zzeOhS?}u0SGcH#kl{bjx?eM{E)Xz~Ea29GdmtFzhVy3QJiagY(hmN7CW$_1a@S`Twc3PtWcB@%bkN=AxvWRU7hHMDgsDa5D#B+#hoMt>j5o@)xkY*E4@$q6>?Tar) z0fqV=!>xZ@Wa3>u(zK&LwfvT^#=g=$&EZgh+h+el?mahf>E$r?-&QChRs)6Xq^5dy zWKcRfF$6kB5%67KiKaQFXcp&;-m0G}FS1^`*{{?$xU7ee%W1@x&}-$Wf5illPc=d> zCSn)sip47M@d>7lg0*j@FIg5IwK=ZG%v)Mo>XObaZGKnzv2)e$ZjwiPkGw#$#j2#2 znUhiJd?qYes8mm}#Y8U~27a0SL9-9>qz;8t&=;}B&Ogd~Z7)DoXScFc@3y^TYCWLZ z+@?GXcZOBYtXjuUqaivNYeT~in(H46&%>F7V^Yc;_p6~Ivj&C)T1IiChOUDkbTi(Gg`eU4BPriUE^b9tSfeKL76M^hp%nblw=$2c)?Bcckh7A+4sYqVm{8*=K7o z*dBO^J9j`)aY-KQha!E?=o~i}oEba*h8`fht9G9SGNy(MP&{c{Tpv?)5)F|U_X_nD zHyYV;7%hvyOWN+c*J?a^eXc?`#vzL6XSXM0wO`(*37?Y_^UpIlDZrY!yMfEjlg-HQ z*DzDn#aJDE+fq}kIhQ_GH-L}7D!s0J99n{VUyV#piKA63IgQdHUAiqAjUUmf_FRd& zKZtcN*c`l{yiuy(%Ao&x>G4Q=3_*dbGK=S7Mpr!o4mPn;qvWGbtK{O)+o15PHZ}^p zWK#ZAq*-!0F;BXjRJZL&SC-P|G!*riuh!mH=!4jHx)h!ID{eo{6e+tvNLP|~!$&oN zElFn9$Q6zz*?;5mO?1^erhb1yL0q(;^{q869?%T^A7UTA(^)PF^q%D9|l9_7&Oz@<;v1Rrs(nbtK;I;>%0jWK~Mfm2^$5Dq<#chd9)8>HF&HjHcIRO za9@Q9{~`e5wC~e7CUds?j1D_nJ$_b_oGRk(aU9WBL>U?zWPx+pRn9?*yX^ICB%bXm zq~(BaTg+F}2+-$D0^crb!R|0P#o;t^C+ta>ju6)aWy8qR`-(+JbVh*H5LOfMG>ok#Nt=g)G{8^ zDpJ;~LlZC(7Rn%6Kb~8mw(D0%ZDGmk#lsbMgZ1AG%Z&waNh@p;J6s&3A|W=b_0Ge$ z+dUJGrSFjEr|nyqlLJB0{P1d;Ru^3D`C+I*9*&tQtK^mIq`OSi+tuyAOfP?WU%+RB z&PZF(1{IsO^NR_wis-Oh+^-0Wr$jF}uo^3WP8>AxY{5i|8ToCF9*6@fMp{-s;~OrQ zjq^dd>xmwbw@L$wZByA!>l=%-#VB_y{TI2m&vI?wfh*xZ5B(qZWROnrXNQ~1xj^Rn zyhE>#S<(2}RH1qA>?W6*>gEFBK??WRMhGIN`E;wl9F3S%g_jI|j=NZfhI!P;#Wut< z$XU2)7TF;JhM0tS>`o?m7$EmcEPK^+UJNG61z`JMx;~&$VHJk9rjV5@+teI)_>YM` zzFR}g?QPFd!cJpch|XZvYE|P9WDxz^nU6oJ@w5$!R1YeBm@=y4t6m%~o2n-1ch83_ zgvi4`dUiuC=!3~w?uyxIp5_F2D@cZ=1iZ(pXyx&>Y}cK;t)agC^p;9jvHwEjz+}QD zN{Ds^HXu;Q3#z}Kb~Tus2n1yjtA>ZosIznr=ItK0k}A*eEwnjYbp+dA-d;tTv()i? zb+}~9%VGMu;)>dOjC992Od(^fR0n0To>RKjAdCL56=R?!cmW`XKCJXzksWu_4<1dVsY0Z;LGStfAqW9_EC>-mt zft=}g68V-~q4TgFN`)53-p$Y&X0IQ|ODFsfX|ltU6T0F-u;gPEA)#m z=#g}~up8YG=2JX2T5G}O*DpV;?i;a}?}rfXt+!elaL8ahLIh2zL-gJT(DmH zM(ykRgXrCVgT!MZQ*QChd_=%<)e1gVQBY9e{rg*qLfE2^ea_+6f!n-|%NX6Z?-$?~ z>_oeyrTS$v8h+kMZ=KE)u*^0rEvwh~rbZ+I*fH?CAyNOM^M0M#Qr%QR&lEIfX}f0z>SLKf2=?}(kH?4w^CAFoNuF3}jHe;36 zP0VG@>n1)Lyt-J|rRv2xyC(ObkOB|*+zA&QpTw0&1SiUUGk3XP^Hr>|391WmeDxVq zX&-2Qas2CyCt|!n^*2Qj$I|tt_?N{Ij2f4LsOx&iepM;u0qEMIir2Qy?lSK3Zz630*j=tnS{O`UaEKFSM}0gTw)SwQZ9`ATcM=?`K`dOw3{{k zcAua;&L(f45i+|Uag^v^4Eln3Me4OM`B;8jjZ#r=grJ8kR|r450;^qcgie#?SKNA) zw4&uyVEBs1geNe7^d?tmcP`bxgyW}3p4pQ;^j5Pb~jsBg)d%7}2c> zO%~@?ZyIy~J8P~ZkXY@IhJnP7uBf#P2N{T3PI{`6wvJ6^IP(~6Z+!TYhPj6 za7ngIw(XGTPYe~!x91YXPlB0os%1ugOvxLy#oEx5!)va1UTN@y(x)zestlOf zemR05QPr4ni<-X>|0-7tomDy5PZ^J{#xl@6NsU?KJ>zsXR&hBTY5ZWVDp%W5L?fBQ zFb=6hevCya818_cw%{2yOri?=!ih$bCX033Jd{RxirP-UuD**`>n)}MmFZQW{X6U3 z;sG88J6oW3_|jJHiS7n<>&~-F7d#F)olrc-&~q+YjoFCv*KCirIUL5J`rG+hydyfq zlX~54C|`q?$tbXrB6VTF>9K8Cyhj0HNppVul~U*Kbee_ahq&-4$q(UTk||b)^KHe> z`+;U&8F~u&e-~|yTiEpRKh5ea2t1oIIHgxoddD}e9EASF%}08oEbXu2O=BfFaO(18 z^?V+T@XU3dT-K>$x0BI)Z#!~kt5cj%rKxnJ-@Q2%2EHMitF~%!K6PBr+_1zi_^$kN zhhtaBZs`ZJ@m#t?C*nyh#T7gcsF(7>nd^jIPKpeyK+3L*3&VqEeB2K9{dNW}$kX{I zsOMP~ri99i$gVbLYvP)eIW*1FouY>6sXmFcE%6@We!NmK4xqV*iq+YHr#1t1gzN>Z zme0@dS{A?yhdmch6zmB@so^4-t07Rj;ndfkrHP=cWk1HB+pa=eK3Mbt z`=j*ymLJz)#`0Q@{2^6NuhV|Z?`HQm0h?E((ad8Wg}LQQQ+!-#p5cf z_Nid6qN7ImO;ERYp->JG*+W*@FyCXLME8B&P^x)=n>L@;o=$eL z5Z{^2n8Y!fD;l_E{L*W6YnyrDtacwdzuw{{7OiUk2uELlMJyV5ZDJRNU2mNNVZ^rH zD zaHU)9NdhGI$QUPG$4(PxSnOLFX6zS}$j{in#^Yzl*}Hfg7Z90pE|qyJ&Nl>_dSuRV zk4F<1z>V(Tr-WdND6Pc{3www0V3!Lm0_};FSJnc1`N!w+ z=sdo_i_kjB-5vHqsUg%wa*mHr1oVI>uO9Y@{S~W<|>zG%A z6C%z&#s(btgf(4j43;w{=#URDdXqcZ{#i_Op!`|ME`bQ6ZjuZR2_QMQju8;;wXdXrWxl2S;7@fmFIb*d@I=wS} zkSZg)Qo(LylF}Qm?84Svwpi>P{7NfRrYRnKCAfUYYiDZT4|17U!2G77ovX2qGMp~D zHm|JU{ok00a`&uCrAu}Z+V6zBqnC(s7$ssEeAv4>JuzzV6dH}If*IU2OU4 z%rFH@9DfM+)F4L`{K=414^#f6DdO5+V8R|{L;CSk$0uNUpUB0i!y_9PA&uzqm9FJQ zAzPI;vykd^hJ7GIOzrYjTVIE5HWcQU2G7@V&10J_f`fJ!n}zGm+s@~9=Zsyo9BLh{ zKQ2L&iy3qZyGU(y@)igc%5}cuJg9HX7$;$G3#@NI`?r)pW2=0?rrU&3JRnN z@0fSFzNPD`ZlztNa({sHyNvC`9yHeNEoC|;?;6-*J!0HgeJ%}eEL6cSF z>ukL-6$G)r z<}Si(R1VwY_#{>6>m^Wa@a@M~&`MieI5+O=ftl;k(zTfzw2uAy6G=>1;oq2Y6_OZ_ zFs5eb?FB{c)|vAfjpb-g-J?)$LqQ`5jE)RZe=;^Jj4NW*-pl+ITCbZE1rasFcyoOz+No+()8A<-~Hiy{1Q-Xt$o z%sCgRoBe+I)t1h$vASzVF2JBjfj6AJ6pR%IMmuxM&qclW@|W|()fQ*$YQc)Ka|N<& zm9jCDNr%rO)ASqKWF`5^zW3iZ_oy5w;4?m_g6N7%pPwley2s_i)kf1qz19yK*puHw zP+R-={jed$${e|N!`oGKG~utbUuMp=rpf>Sa^Wb+G^bvJ({{Y8Td|9;Gf&o1ss8-Ca6(6;tjX~J zwH`yjA?6Ab{b@5euxRgj$q}9X@G_3`0jsC z4BFkmyQYeIog6mwCcTFoZSD8_;TqdybAWZUrD)d-{+>J?ffkSJfpk8o6Ud=et@6AD zwU^?3X!XcJQKsg=-el4jwu&JWT@#X&{Y=fN{?cfft)^aX$yL#JYz#nxrw_p2I0Vst zY-KAAUU}CC2vnDC-HodCd9G=Z8qA?+cG_)EBJ@IaFTW_B7glL!-cV#nZs4)LunmkT zuloyJX-orftD3Bfsv!mr>+0}fS$qsGLo%< zTRihj@^aKEGB0y-oObIx=>Dp^TubJ+?OdghKcl3X2c*t&=_j1b@m6>1=|T-#CM+qL z-3_uboxg{4NRIC#XfA@-HzHr8oJ#Vzgd#rA{w*JCXqpvpK1PN8)2Pu}RKV$#H%cTgpZ+*vkN)JTL* z9blDHITQ+;c%$!_zei1R2Jtk8RDAV6HK5oNcQ{@>h%e@SKs#YS@meEwzS7DI$j7T# zRF*dkrHp(0z=CJY8;1P>gam)W)Rb!8+x!f#69_W+lT?X8rEIGGW%9czHMOIqR*cq- zD>HU=({>ecdRxTPdUTty{LyuN$lcXh`B1y~d-#;TqRQk1{x5vQC?(sno|Zl3Yd_|d zR@>Q6&UQHWKvx!T^hqt!S=|JeJ1E^`gYq8&Ehpi#b~adq?4Ay|{Y^T2JM#0s)Uz6; zk@LF?KhZ^;cws3EP?^RbsOEzMs|IRL<-T1P5T-obC*9|~9#!8Jo8)rY$K0*oWNWFy z*zlk&>GQ2;NL(P$?;&;tX5EXu0sM)*6b41_1p}uaCuXM&j9-*pSVi~(N|gC~>|&g9 zfI6>em(STtdEVoy%z58>du|WY6s6|ue3k_QLw8cp$H^lsD-EfOWNM8OqiWYhJby6Z z^-(!Ut)_pR*UF|xVqWL<3l&n+0B=!Dh9?G%gBbT$&!ZMJa?~&8p^Bb+^X$uMnl`TY z7Zk}$F&3BvV(SR4rnU2mM@755X=2_<{8AU!(6hMu+;;a?M^zgSCp&LdO5jEe^)8>G z)C2W-iT;fS@F6@?!rF4BCJcj?`H%xsj z%IWQnisZLDyQw-44;4E|X%2_6nDiLWwFVA@7{)au%qZoLrGo*-U>{Z;kRE zZNcQ)o}0eI@ULx<*$l%?CXID`G1_D&zo+b-BmW065n!%lWo0!S$WjiQQfiQLvS@z| z5oqwFce-qWZq}VM1v^I-~>F$OZVqoBR{CuC^_w&Bj`&{q(1J0be=A3=@*?aA^?sc!VLp!{Pyl)3;kHwdd zkW)6W77)=rl*waf2o-5i?TvHI%*?d&Lx1K0k125%fzz zuztQ_8ekaKE|_X>a5)OtkFL;&x^dGt3<(u1oF(rYQqx9Q7uwM(ik>W~EqlXFu>pO^ zBaQhwkbJaz5DYOyAL5co@x69~qL=)k>}H=+SQ_KD$%4FSuOcmEQCAHekb4vq4~E#N zjUI1&okK?RCb_L~eeQgD+f*zvowuaV>3x>780qf28f8fj*0C9zoCN}xPLj$?E&ID$ z;kBi+2`P1XcUqBldJV{h-AXS~H>rE;Fj9p`AVgAl*LOIG9%nAYUz(=75FbSHMsZ={ zDwa}>P9k%-W$kW0<{FOaH|LkVINY&+gzeP){;vAP1&lC<_WQGf^StBYwAMl2;V)~N zb)koE)-s!strO?bS09rvpC9S-d~~gh08w%qn4!i6GgmVKQ(kp}_L$(}mqZo4eOY2F zCzp!rL>6DvX5mzUquG6?j2u2C7v#gyXKFAA0ueEH1>m{h&tK^08e6XQ zP+bF*+!kM}OcErzg3w;#FzPC&`*h?WwOKy<}^`O!3fr`6^*n}*{UWM1rUTdTscweB6-U#?<^e`I7%-1x2 zUr!6ESR45fI;r=F1(ruN!XFS8!Mvz1TNR&TS`Iy8lX&r;4^`>;MHjj3-gW_QhW-cL z-ArBYJ9U%5|gPqvHs?I~}ux+2(~=)6L0hrCuux0~Jg zeY7E+>{(YDB$d*1+-EVuVmnW)o4-;$03N25vT|%P=XX*4h#-aNA)Ko3Li(=={-z2$R}QZaRoHV4c^SPvegh`P2< zSxTF%pmbi$f(42U^w(Ovim`1z2hls}Wf8F+`!(%W7Cz5U9YYj>NB+F{NNt!CQ3$bZ z>!j9|^175->RjFK*Ad(cinb^={sjjtF2klJyY}M_4FUQnMvVVxa;LN}Ajw*D1QvL| zvOg(k;EDL9b_>RJ9wEaMU7n_kY{X=6hv$8oCoAISU2B!sG2*Kx3m-OOf4f-$l|-uh zP0Ekvdt4Io@O%1v%e-ionIl=2qsT8-bB7UM#1o+_^R?0RZUXV9@_=Q`}6uy_f zi*c8pKHbl(b}n0oX(U9q+62uj|Znu3~_YDV(W=_K9X zPc^Y9-IsIE&>>&n`}L@J0YJ0Vw*#P9&Bbb(YIyJCUF^ls*spK=?q1*PXXkZJmRwIU z_=ve2?|C0ZF%iodx_BUZTK)DV#iAelI18=D;C=kH{I0Q)|?vsV}N;E?Dlg?M5kLm7ze9JRI1UGFI zGl7Dw%Ahrz#Kqbqozgn&RgmsfVx?1_s?jv;3XV-Gm= zSc#BDZ-@3!mJvGh(Lb+btDF08Wf4Md3zG>A)&1ZCk=;n*>$7bJ5lhpNR&2l#J*L^6 zZ1cm$!X`4{*_`+!Mb2(lVt(GO8t(f`S560;c1#onr#jK9Wew0d)r$76A3J9=JaOgPwzEuP@U(dPDa}`gw>K2(@>bE#`*?@~J%n>)CiRV+> zQfdt3H@$(wCV50pN+_m}ou7N386LM2PrsG$YlmBZv@V>2hBE=4w6WB^>eWxbV_?uu z1=L8T3z=zW3$dxI=q27>y5C{uLGvG!ZTu)%QDl%rFKqHk%%e$Zq zxG|5weC|UQl%(7-Bpa^NvT@M{JJW_;k6Yc@MUf{?kNkLkbBj!!i; zS7=5?HjudW8T#_~=P%i?7|_R*>>PrcQv$i1#6QkM)b)v$NP!3P6C8!9Lzc&KN@PUC z>BoCr1DA`?qY_9u(ebQXWH+^nq}=bFA1j$e1|#OC#s5Zwr}roih!?|EJ0OJxwIt^( zfx|PH9v^>ab)3?)Fo}3q_O?myPI9z*3c|BM)e|S@);DI&tkwMbp~gz$NtQik%F=NK zjP|=M6!Ft%!dx8;wUAHV*Q|M`{CV#6Dk&~|t!9bf8&KVonSCeY3iCz1%>mnm{239R zc+ zykKU7*@x_T75(nVs`wf|Nd;$Ey7KFoz#XoXfJj+ViDHw09ZZA@e#m!INulG)mJQ%~uoo&XnDsqi;B7k` ze=`K1Xphg|>>V%qgk%Y{>4QH*)id$iIQcko)ikK|muL0Tj0m1_@Nx?(R?>zbnSJ-G z!j3eu?>i*4*mDmw>|@(1eKUCh&Hinc zdoqTd%B^#8U!fmI+BYC$PYy~nsdCI!v<`B2471v;`~U!}u~PbjeD2-(>yK*>*q2xb zZ|9s>b`4f7n^+L`rEm3 z#BfQhC^9qnDbo#fb@yj3)Wx?xM`4|)seSw6bV1enLURMIHUF*|D`|2iWYdO1;_~|Z zbYvNxF1~Qr?7fK>c4^D$2xY&KQs7LPyjUFGi+3!t5Ih`xi#i*-_Yt(%l&W+qPN;a- zmWT5E@;PWui#P>zwU{RHyd+uJd_ABP+O(Y{#IA0AdAFY(rv|>CT#vW!zzZt!)9Bb0 zw#r`wU%!pQzbpkg+AH2j1&^ek?7d74pH|)zQsqgyqbhDl&SNIyz}dT10`YDbwO6nU z@45TW^f;g*c0Psa7Vk2D`#^Y8xf(dr*`ZLL+?Yu=`P72?!;uJP()B@T77cvUssQbbUV8j!fz*YP?xhkF?Gd3T}!B9Ur6=l`v3XJryGfpO|I9V~`+Q zD6u*o)BSo@dvdDwD40EwV?aii`^Fh z)ilWsCh=}`Ir>Y4?tPWp_R(GReetq)vHRd+br##J4D>kftq)w8dEyW+15wqNsa6CN%?EAKG(E|U=Z$~0mx zY9Ms`m%;R3mw)M~PKa+F?|kZz3#HU*T>!UyBV#;VNcujjme}j`s;$j%CbtZ>MA~{j z7h4pilg0gqDZIo!{LM$!M^B8iA+}yWaUskP(a^rDmP)K)`4@jepUYsQVMJ~9m%&66 zSiG|V`c%J0t!L)UtSe)!KyjMXs9)p?mwRr$kju@<8A?0>+ExLyx8z(8HB>Zh{vFZ{ zsX`#X2wdr)kxdSz0m%lhlp3EoX zl?0+**k?r>z4x#Xg2E|JeKrGvJo?M_`yTioF7My|voPIkV&Ns4yoH8!8|vEEIiipN zNe?J7EC}OB3dD$*1be!MA$3;{?>jh z6rc?(*SMbNoKt#>p2GnYh+jd)Zs~M0Kn|}YskTbl%wtAsh@Kx2TPqd>IQWvjdz->@ z$0`ezR#TpqKmRgoF717+!(7a3K}*Xu!!+z~AN+kZhyy^N6)v+v;k>U>>VpR~3`Bxk z4(2yg(2;b-kX_+9a~IFuWJvrjZ=kWS>BU7So71p$aE^tO>~a6(omjAzB8%2}dYzDV`Q~EfQxyj9 z{NKMvzQjiQt)jx@(mgvlP)({ujILB3hfX!*&J@)+|)V1i~q*ndHRJ>&?S^O{)XE5F5j@F3VW>-dGyM5JkouwcoZ-1G!WL9uRnLr zdH8)eyP;{|Q|vG}G;GBk*TCfyaYwCUVjsr34n~M)jyve;!1ZK{jneMT4_O;^0->_Z z{_rHIVxEijHPLs(7{{T*vmbu15T{*)C8fDb3F6imq~d6?oZkIW;u@21p!V*MUQ9;$ z{&-y;Xsn4CT^YH( zV}NuUMyuZ7_@{aU!;DrnMJWWM3kUY5`%zZoimCae>j1-h2QOFf?j6m#CIrj0yNGV( zrH_IS!`4<;5tdnrRT1rI|)V6&2-hgQ>4!CiMg(PNI7C z0`sY$L5Py***JEgnD}Ca)vioeEtlSAQHy>+)8$J$*Ed094f3u#=;lbjR;x`gmTI)YPbV)PZ!xcr_2|Qi{-jEWr*#Jw?wXkCOCI^0p`n5L;J{?eax2Nq=&fXu-l~gIswzj>kY>^OocALW zJv?c}wxuUW{$jyDGAR5X7q&UtP$ z#ys4~s!6t8KgR=G#j+d&3Y$v%@Y6WoqC~w4+)h8RF6O&XgdO9Q%JQG5qPbMh0P~P# zHZjRUm8)sQX@cNO;tkG2)H6Khp%j4?zZG$Gc};h(|I2UD#Br$ba3Ik%iHF} zXW`6SSZv61XqS&-PuDbP+TVH;{5&_!@J9NW8g}+{M$5qS*%+!|y2BQ7#B?|(5?6UU@RdJp!xUHXZGrK=gG*^B46TxfOHS99#E$?f$WLl?-0PO>v=>(mI(%01grwww*^sMRy3#p;#Zb9h^q|}8O4oaC{mFuqAAOqw z%iEUV)hUR10+eU#*gG^Str5eCgD^MRH)&py9r=xFRuozz=K_AD_r*fVrXh*tlcXz} zTV>+5uKAzh5n7{dkI*04T`tOe2}7J~VK!V}rBnAP({bsC_b_H>q6b?C*#>#poIjSt zhVRDsuEtRg>Pyj|hMm0CBa!VXNe3|{Z8*`?8os|{ z5^*Sb^0cdnXb0@Bl!LlBP4m&$h0xSLze3Z>G&W6=?xKu1mGfKlAEeXSBWJ%(CnCgB zS-4t^&9RE0NNsn>;jb<@BA{kme+unLq}3%Cgb? zTh4lHdy#QqyI6ks3ng?b0*t2&CTJ3qDL+s2v-(PW)ZIfq&4j*?T;&Ohrlpd=h7k@; zaE(T)jstd6v|n=)OPjS)$xKrOeO3)-D3egCXEjZzD!E#jeyNNKYj-%K@DS;{daU1; zzcBtMQuLo$;s5v-h8SJ3gFyVPMnpcSw~YR*9M+2sY%r7`+$jk8=Dtf!>YX5fs-O(} z13#Ig?tU<^>~QE>Dq*Y(>-lZlRn^|pS|f?y;;rLQ4l9-2a?x#+Y08N*Z0s+Z1NJH~ zI@w%Gfvdat_Qi9XO5*}f8%?o478;tf^Y%sR%8E(vzdGp!VD?zK9Z|7L0O1KV|N45z zLr)ltZR0=f{QEa{^w+52j6DsjL<@b}YDJ*@!StIwUG-?Ya5uAwDe@nn%3dw_7_GMK zz$+KA`k=CC$Y~>I40TacXQvmCRj`9BFNAhq9jLHaf{B~RQyT>TtWCtJi_lL6VwSxn>M z-lg<0{cK9?J5R&l!6%8qBpjT=P09>i%ZqxKJ7K=Kp>+OvpPZX(Tl8+#b%VIfH9-$r zHS%?pg<%m-4|bw_q9L>(CS?IM2%cNdhSI=Ru zh)-uXm#Js1NinlTSS+V6%szl~Ai{%sD%IkivTGh|J=QeUKf~H3OUAM?cB>wF&lq%1&f9UbZ zRTZZ6_URXs*Yzj2Yrza?JR=W{*a7y0-8j=CqLZ34Vg+~$&d#R`LG5yQ*jNu`{$_Ul zBhvJ&Y$9x&;uK5~n8V!Oh zG||8{J=r*)e_Sv$w2t52uIN0pLCm3&ckTT1l=qfZpC5k4{-RD05sHL%$$K^rTIYQ` zNXTyRnVj1@6)jU@m9<}8C2Qe-+!ts=?j$cP0m-y5uYO==2xQdHDGinpY`b8a68b#m zX0R3`$G&LSrP30xu38Hg`U;{{94nx04$8i|dq*}>P~gU$Qa^f{I*e~IG!jE!NKdja zI5Et@Aj)sh)amUwP!_*YNgySHoL%NMz>#+$I)FvTiwD$-;| zdD?XTHIeCB@8+4Cfh$pt5qh!G%~x84oYJ3DQY~_%8^Zbg!RTng{?F2ldwv>41=U;C zXkQ=jt+8_hc`z#cXncBI>Q1g{1zy<9zW%DEXwQxZwmCiEv#gM#KNkH7iXL7}QMKcJ z$H9j8ALnM|h6aUR4Ig;oeM@%Arbh0wJYil4mGsPlN{qtVz6>h6) z2WepVWxj$AJ_uToIZL~l1&~q{14f3YIiMo1XEWA?oz-y8msI$^?RZjXB@} z|LE&4REwVFBPN4*1hNR^M;aj?yS`t2-O6bw9KyH8+T*sfCURIh#l)5*_v^t%5avkqER z={Ne|?_21x9xqml%9~l)k1xFfVYgwyTG+ixEeVn&5e(TC?#xpstscBLi{tM?}a$4?WcjfzI*wjg(!;E|ZVC zj%#XxhoGf36wP;61pp^MtfKOO=tI%CwJ&QD!|--1yWeY00Lw9t#hN%cf1p@V+|b4gRGUhJs z&%LAKf}&#;Dey>p{e+#GnllZMgLI7G{YS-*D(#r*_TIi;!w_`3iQd#4ghTH{_i;&m zHgHI7PsYE3vs5Qyq&GY4S2^6Ugj3P_NfH%I+RYiLiq}GzJF!BA- zWr{1>8vw9qy0xsIV46S+n&@{kZ9>|f@+*imZ752Ne*%kSAr_eGApDgni-UuXKhwt6 za@vdNNEan}^m(yMu+YQQO|hFziz=Zj0~*?2w}YxQban6BkiJ>l^TQcehRjj^I;^AL?kw`Wt242zQ6s7@X*)X+Aj#tNOU#m{FSG9Ht> zDS2>aY^Z{TNm$7f`GszuD@(cN>fnVn-32_wD(TxZCqnTj8B}>EAu4e@CDOaLS$_ji zV2yK|@VUk6rNYFqJYfJeRpH?oZ!8|~jKeM5 zfwStgP}uolPCINnOlW05^G-5i-W;F7<19()tS~akI_J;cPt$!rZ-;OTHFZ8;psE6{ zWYU*i?G`>tE_hq($hndA%MlyN9j%CZw=f__r-OdSjzgQ%s^<8pR2BkH%3bZ(C1$5K zt_bbl?awm93s<|s>J;UPdr%jeD_(6B_NC~jhlA}4YxK3gMa%T-CFF{7)+8I`y(oujxUQ0ZWT7tZb~o9unl+SJMMZBeq#7^{Rf_~Hy4d95iD^qOEf z9jMYgSm*M7i-Z20dS=%(PAppjtjxr)*gc=L z%9i^*@VbXJ0LAf5O>WKHl$=(KU-u040@P*ko2Z`nHu@5q;b6DNmG`$7JH&qGJTIy9g`Wbhw zKE%3;Ya0zsMxrZJ15JH7WEB>1`Y^a`CW_s&uMGxlJoY0Qf{K7RQKb5gt?szO(Q9uF zl+%3Qm$;J~`wf-ZhZYRX9P9!!aE0NIBjEk~E7CYyQ1tMiShR$Uw5%))f21nD0)Az2 zeit6hIW}G&`Kl7SXI?k3Oi+U{Cm#PRM6Qf{RNl~|1dQr0Ib;Q{;{z;;|6UF_lKC&~ z^*^WmAAe?Odw0Q=PLWzewf~SeHB`SwcDLGm>Ux2m(akZ@yeKL6R^^9k<%g&7=CkTZ zc@?5d_&n)>?xV_dpGw-r46u|+lhE;zSZF+6{DfXXek(ZtuP#NC!TF3M?fMIKw!YfKa2sIj?^I6JYIHL2 z6b;LofwNnTq>c0N%h3kGKHGwX_hLD?tX)zmfKTdRH0;I8pIXSNchv5ob4u^0pn<-*GRs>sdUD>BB0& zUEZ5b4Lx4VK~KvnC1L~zW%=P3m`A9c@HgEf`9=Y~sh9Zaj$_e=XU)Dk@7)WqpLJS=X*vBi*c~uSl`SoQcjOWeYCO(P?H7gI( zsbF)OwnIt}2VQGxV7{wB98(+Tu0lJiVJNH>+oBj#4(y`fM(+3Y6UW%Hfo1ZJR=H3| zfe6W*Wr|Q%(R0TV$BB*fA?R7<0=mKyGLQPZ9IR!~iT#n!KxSW~ZEjuRm$hEPiI~V| zG9&y%waNdO@YrXLn7n6B4a%Ec-`wm-`Fx2J*`KLy@@Jz==X0$ z#Tb98Oi9<=%orUx$x=OGyAbyD8h~|?yx~&lE|57JXXwE{s?m_63;l!r?8q+Tkj^W0 zWc(w+8kuNx5qV4T>T>kH8tL}?ewJ1mQvH{$X~yyqa#?Xmb8ON2De(r>MmT*O0fh6^Nv#v|`anFq^k6N6yk!_$FRRPe4 zY8eg^+2uP!?UC76#$2DvpiHyQ`K4TfKN*I|#ys2W9)KErgof%;t@Cx>TnMk8Z;HEP z30Tcwc9r>+uDMaj9<@HEdd>Y^>OUj+E+Sp7k!l$OO&W5*#pxEWfw59bMX@+y-{*`4 zTPVbp-629l%Si7}^ggu?4yPal)m!CZuQTxPwvI)}_S&plHt$t$!J}rz^spvgXUAs4 zM3d#xhcp3z%l|sH{(HvX@aVtt*P_`qdHC4>4jBCl!+HRO3l4rwl%6jI6bN~N>cN8r z)^y0qrt7EA0NAVOUNy!X%xQF=Pi?RgQ1;kccK;s`*yJxL`>!xQ7-ANI&tVkLjJxQ^ z88e@~6g!LKXmfIw9IWq_4OQhmd-9& zSD&ZUn1oHIbKVdOKT{;3DU&1SP^+ATLe?Lxt|oX(7lTFd7%Y=EokZIZi?H?AN9*2~ z7qd(?v_njOcBn>ELJ8hE7e$wQyDDa_D`T1u#g1WJ&(1-<>yY2(k$ZV&ql-AD^Xu5(JpP@*xGA+#)xvB&QBiikvBlOm&2J+V=rQpVD^=uneqk-oIj z3}|zPy{s?)H(d&JfqzpVL_zp#1h_046K=2@7)vIq1(Gd0At{jp%D`mP2}T>v>-+|% zS=fV}ZCZ=LB4~%?X#Sx8O_}W_0McleYYTADlhbfu)a)rw3G8lU5b$`%vxAoBN>`!mN4AFzEJ;8x= z9Z@hIADrR`?~;H-y`MKon8_fdqSGv?Io7p~$++&7f6<3darnNZ>xz3>>+WGYwyATR zk0KseJtc6Hc#5x@FUHfx#asP{npN}!FPPIZD1JdCCz>1Pvl6SSdKmJose!*75x=Xo zENZT#AVKz0El=o)!Csl*jP}<B=hqoXf|%l>5Dh1Tdi3=MU(K+%|3z|JoU5R zLl@c6wBM#B@udR3Xl%!luzspIh*d}W-7z#0u3asvHn08d2Sqtm*-{ykfJb;-|9>JN jBq}P*%frjdBP1j$D9SG&z{|tWBP=SwE6Bz52=D&@Kjw)c literal 0 HcmV?d00001 diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/plain.txt.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/plain.txt.http new file mode 100644 index 00000000..5e85ad6b --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/encoding/plain.txt.http @@ -0,0 +1,13 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----TLV0SrKD4z1TRxRhAPUvZ +Content-Length: 221 + +------TLV0SrKD4z1TRxRhAPUvZ +Content-Disposition: form-data; name="file"; filename="plain.txt" +Content-Type: text/plain +Content-Transfer-Encoding: 7bit + +I am a plain text file + +------TLV0SrKD4z1TRxRhAPUvZ-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/filename-name.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/filename-name.http new file mode 100644 index 00000000..43672a32 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/filename-name.http @@ -0,0 +1,13 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Length: 1000 + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Disposition: form-data; filename="plain.txt"; name="upload" +Content-Type: text/plain + +I am a plain text file + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG-- + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/generic.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/generic.http new file mode 100644 index 00000000..e0dee27c --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/no-filename/generic.http @@ -0,0 +1,13 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Length: 1000 + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Disposition: form-data; name="upload"; filename="" +Content-Type: text/plain + +I am a plain text file + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG-- + diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/crlf.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/crlf.http new file mode 100644 index 00000000..1d5f7095 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/crlf.http @@ -0,0 +1,13 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----TLV0SrKD4z1TRxRhAPUvZ +Content-Length: 184 + + +------TLV0SrKD4z1TRxRhAPUvZ +Content-Disposition: form-data; name="upload"; filename="plain.txt" +Content-Type: text/plain + +I am a plain text file + +------TLV0SrKD4z1TRxRhAPUvZ-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/preamble.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/preamble.http new file mode 100644 index 00000000..d14d4330 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/preamble/preamble.http @@ -0,0 +1,13 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----TLV0SrKD4z1TRxRhAPUvZ +Content-Length: 226 + +This is a preamble which should be ignored +------TLV0SrKD4z1TRxRhAPUvZ +Content-Disposition: form-data; name="upload"; filename="plain.txt" +Content-Type: text/plain + +I am a plain text file + +------TLV0SrKD4z1TRxRhAPUvZ-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/info.md b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/info.md new file mode 100644 index 00000000..3c9dbe3d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/info.md @@ -0,0 +1,3 @@ +* Opera does not allow submitting this file, it shows a warning to the + user that the file could not be found instead. Tested in 9.8, 11.51 on OSX. + Reported to Opera on 08.09.2011 (tracking email DSK-346009@bugs.opera.com). diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-chrome-13.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-chrome-13.http new file mode 100644 index 00000000..4ef39172 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-chrome-13.http @@ -0,0 +1,26 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Connection: keep-alive +Referer: http://localhost:8080/ +Content-Length: 383 +Cache-Control: max-age=0 +Origin: http://localhost:8080 +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 +Content-Type: multipart/form-data; boundary=----WebKitFormBoundarytyE4wkKlZ5CQJVTG +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Encoding: gzip,deflate,sdch +Accept-Language: en-US,en;q=0.8 +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 +Cookie: jqCookieJar_tablesorter=%7B%22showListTable%22%3A%5B%5B5%2C1%5D%2C%5B1%2C0%5D%5D%7D + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Disposition: form-data; name="title" + +Weird filename +------WebKitFormBoundarytyE4wkKlZ5CQJVTG +Content-Disposition: form-data; name="upload"; filename=": \ ? % * | %22 < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: text/plain + +I am a text file with a funky name! + +------WebKitFormBoundarytyE4wkKlZ5CQJVTG-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http new file mode 100644 index 00000000..bf49f85f --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http @@ -0,0 +1,24 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 +Keep-Alive: 115 +Connection: keep-alive +Referer: http://localhost:8080/ +Content-Type: multipart/form-data; boundary=---------------------------9849436581144108930470211272 +Content-Length: 438 + +-----------------------------9849436581144108930470211272 +Content-Disposition: form-data; name="title" + +Weird filename +-----------------------------9849436581144108930470211272 +Content-Disposition: form-data; name="upload"; filename=": \ ? % * | " < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: text/plain + +I am a text file with a funky name! + +-----------------------------9849436581144108930470211272-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-safari-5.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-safari-5.http new file mode 100644 index 00000000..ff158a43 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/osx-safari-5.http @@ -0,0 +1,23 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Origin: http://localhost:8080 +Content-Length: 383 +User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 +Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQJZ1gvhvdgfisJPJ +Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 +Referer: http://localhost:8080/ +Accept-Language: en-us +Accept-Encoding: gzip, deflate +Connection: keep-alive + +------WebKitFormBoundaryQJZ1gvhvdgfisJPJ +Content-Disposition: form-data; name="title" + +Weird filename +------WebKitFormBoundaryQJZ1gvhvdgfisJPJ +Content-Disposition: form-data; name="upload"; filename=": \ ? % * | %22 < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: text/plain + +I am a text file with a funky name! + +------WebKitFormBoundaryQJZ1gvhvdgfisJPJ-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-chrome-12.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-chrome-12.http new file mode 100644 index 00000000..f0fc533a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-chrome-12.http @@ -0,0 +1,24 @@ +POST /upload HTTP/1.1 +Host: 192.168.56.1:8080 +Connection: keep-alive +Referer: http://192.168.56.1:8080/ +Content-Length: 344 +Cache-Control: max-age=0 +Origin: http://192.168.56.1:8080 +User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30 +Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryEvqBNplR3ByrwQPa +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Encoding: gzip,deflate,sdch +Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 + +------WebKitFormBoundaryEvqBNplR3ByrwQPa +Content-Disposition: form-data; name="title" + +Weird filename +------WebKitFormBoundaryEvqBNplR3ByrwQPa +Content-Disposition: form-data; name="upload"; filename=" ? % * | %22 < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: text/plain + + +------WebKitFormBoundaryEvqBNplR3ByrwQPa-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-7.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-7.http new file mode 100644 index 00000000..2e2c61c7 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-7.http @@ -0,0 +1,22 @@ +POST /upload HTTP/1.1 +Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, */* +Referer: http://192.168.56.1:8080/ +Accept-Language: de +User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) +Content-Type: multipart/form-data; boundary=---------------------------7db1fe232017c +Accept-Encoding: gzip, deflate +Host: 192.168.56.1:8080 +Content-Length: 368 +Connection: Keep-Alive +Cache-Control: no-cache + +-----------------------------7db1fe232017c +Content-Disposition: form-data; name="title" + +Weird filename +-----------------------------7db1fe232017c +Content-Disposition: form-data; name="upload"; filename=" ? % * | " < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: application/octet-stream + + +-----------------------------7db1fe232017c-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-8.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-8.http new file mode 100644 index 00000000..e2b94fae --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-ie-8.http @@ -0,0 +1,22 @@ +POST /upload HTTP/1.1 +Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, */* +Referer: http://192.168.56.1:8080/ +Accept-Language: de +User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0) +Content-Type: multipart/form-data; boundary=---------------------------7db3a8372017c +Accept-Encoding: gzip, deflate +Host: 192.168.56.1:8080 +Content-Length: 368 +Connection: Keep-Alive +Cache-Control: no-cache + +-----------------------------7db3a8372017c +Content-Disposition: form-data; name="title" + +Weird filename +-----------------------------7db3a8372017c +Content-Disposition: form-data; name="upload"; filename=" ? % * | " < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: application/octet-stream + + +-----------------------------7db3a8372017c-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-safari-5.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-safari-5.http new file mode 100644 index 00000000..6379ac01 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/special-chars-in-filename/xp-safari-5.http @@ -0,0 +1,22 @@ +POST /upload HTTP/1.1 +Host: 192.168.56.1:8080 +Referer: http://192.168.56.1:8080/ +Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 +Accept-Language: en-US +Origin: http://192.168.56.1:8080 +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Accept-Encoding: gzip, deflate +Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykmaWSUbu697WN9TM +Content-Length: 344 +Connection: keep-alive + +------WebKitFormBoundarykmaWSUbu697WN9TM +Content-Disposition: form-data; name="title" + +Weird filename +------WebKitFormBoundarykmaWSUbu697WN9TM +Content-Disposition: form-data; name="upload"; filename=" ? % * | %22 < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +Content-Type: text/plain + + +------WebKitFormBoundarykmaWSUbu697WN9TM-- diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens1.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens1.http new file mode 100644 index 00000000..28268903 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens1.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----TLV0SrKD4z1TRxRhAPUvZ +Content-Length: 178 + +------TLV0SrKD4z1TRxRhAPUvZ +Content-Disposition: form-data; name="upload"; filename="plain.txt" +Content-Type: text/plain + +I am a plain text file + +------TLV0SrKD4z1TRxRhAPUvZ diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens2.http b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens2.http new file mode 100644 index 00000000..8e181947 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/http/workarounds/missing-hyphens2.http @@ -0,0 +1,12 @@ +POST /upload HTTP/1.1 +Host: localhost:8080 +Content-Type: multipart/form-data; boundary=----TLV0SrKD4z1TRxRhAPUvZ +Content-Length: 180 + +------TLV0SrKD4z1TRxRhAPUvZ +Content-Disposition: form-data; name="upload"; filename="plain.txt" +Content-Type: text/plain + +I am a plain text file + +------TLV0SrKD4z1TRxRhAPUvZ diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/encoding.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/encoding.js new file mode 100644 index 00000000..1ade9656 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/encoding.js @@ -0,0 +1,69 @@ +module.exports['menu_seperator.png.http'] = [ + { + type: 'file', + name: 'image', + filename: 'menu_separator.png', + fixture: 'menu_separator.png', + sha1: 'c845ca3ea794be298f2a1b79769b71939eaf4e54', + size: 931, + } +]; + +module.exports['beta-sticker-1.png.http'] = [ + { + type: 'file', + name: 'sticker', + filename: 'beta-sticker-1.png', + fixture: 'beta-sticker-1.png', + sha1: '6abbcffd12b4ada5a6a084fe9e4584f846331bc4', + size: 1660, + } +]; + +module.exports['blank.gif.http'] = [ + { + type: 'file', + name: 'file', + filename: 'blank.gif', + fixture: 'blank.gif', + sha1: 'a1fdee122b95748d81cee426d717c05b5174fe96', + size: 49, + } +]; + +module.exports['binaryfile.tar.gz.http'] = [ + { + type: 'file', + name: 'file', + filename: 'binaryfile.tar.gz', + fixture: 'binaryfile.tar.gz', + sha1: 'cfabe13b348e5e69287d677860880c52a69d2155', + size: 301, + } +]; + +module.exports['plain.txt.http'] = [ + { + type: 'file', + name: 'file', + filename: 'plain.txt', + fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872', + size: 23, + } +]; + +module.exports['pf1y5.png.http'] = [ + { + type: 'field', + name: 'path', + }, + { + type: 'file', + name: 'upload', + filename: 'pf1y5.png', + fixture: 'pf1y5.png', + sha1: '805cc640c5b182e86f2b5c8ebf34ecf063cd34fd', + size: 768323, + } +]; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/no-filename.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/no-filename.js new file mode 100644 index 00000000..f03b4f01 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/no-filename.js @@ -0,0 +1,9 @@ +module.exports['generic.http'] = [ + {type: 'file', name: 'upload', filename: '', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; + +module.exports['filename-name.http'] = [ + {type: 'file', name: 'upload', filename: 'plain.txt', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/preamble.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/preamble.js new file mode 100644 index 00000000..d2e4cfdb --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/preamble.js @@ -0,0 +1,9 @@ +module.exports['crlf.http'] = [ + {type: 'file', name: 'upload', filename: 'plain.txt', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; + +module.exports['preamble.http'] = [ + {type: 'file', name: 'upload', filename: 'plain.txt', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/special-chars-in-filename.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/special-chars-in-filename.js new file mode 100644 index 00000000..aa0b79f3 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/special-chars-in-filename.js @@ -0,0 +1,30 @@ +var properFilename = 'funkyfilename.txt'; + +function expect(filename) { + return [ + { + type: 'field', + name: 'title', + value: 'Weird filename', + }, + { + type: 'file', + name: 'upload', + filename: filename, + fixture: properFilename, + }, + ]; +} + +var webkit = " ? % * | \" < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; +var ffOrIe = " ? % * | \" < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; + +module.exports = { + 'osx-chrome-13.http' : expect(webkit), + 'osx-firefox-3.6.http' : expect(ffOrIe), + 'osx-safari-5.http' : expect(webkit), + 'xp-chrome-12.http' : expect(webkit), + 'xp-ie-7.http' : expect(ffOrIe), + 'xp-ie-8.http' : expect(ffOrIe), + 'xp-safari-5.http' : expect(webkit), +}; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/workarounds.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/workarounds.js new file mode 100644 index 00000000..e59c5b26 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/js/workarounds.js @@ -0,0 +1,8 @@ +module.exports['missing-hyphens1.http'] = [ + {type: 'file', name: 'upload', filename: 'plain.txt', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; +module.exports['missing-hyphens2.http'] = [ + {type: 'file', name: 'upload', filename: 'plain.txt', fixture: 'plain.txt', + sha1: 'b31d07bac24ac32734de88b3687dddb10e976872'}, +]; diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/multi_video.upload b/node_modules/express/node_modules/connect/node_modules/multiparty/test/fixture/multi_video.upload new file mode 100644 index 0000000000000000000000000000000000000000..9c82ba3661ffd71eb0cf2d9690639c45c4ddf1bc GIT binary patch literal 1953781 zcmd42c|26_-#>n4F*6uu5*bTogt8P9Qz**}%2wHzN{k{@b|ULAB3dX!*@l$0XjfTg zP$J6+@h&lTk?i|2-=p{EzQ6bH@q0Y(zkYxGPMMjrT-UkIb)K*Nc^x?LzibDI2Z^fc zhe)J@q(kZ&hlm>L8sIMtb#--3RW$)VeQ&P-SFeBr1|I%C-u@l|9^PI@2p7HmJP)`y z2RI)kcsYBzYVQf~2)N?9M}Tkp-~V#20|)*;xm%#m6>n#kJx2)_J+8R^I{<%oZ@&On z{{W|}9xkrl$``L(1xNE=W4FHM<9dX!J+|W~Y#}@V0Puo;fDiydZ-0Xu6yWprI_VnV zYydtK3Os-YP%eRf&fAX*knt;>oAYmu13W<fz=d0FWd8-3J8z z-hF#wz^1MM`Np8BK)^ZB#l!pmc479P zGnl`}{hd91uKcH?ksGwXjsE8ue~%FGw#5H*hVTz?^>g)xKmhdL*8i`Yp|&URZyU;C zV$Z*=z^Q?Vf>Y4`pH5V`>*g*1W(EK}z$4%Z0Rngh_&*=q1%Hxg002KhIeE;+#%B9V zO<7YzSry#*|LX=0yO$TB>VV(dn-BoR08u5tj8OI|G}4_69n$lm9)$v;;wtS2ni=fy zN;(CJc-$tBfR(~%73?>3pcw@eL7{JG?z$3~N*IL~1yM#rXd?)KBtjtDo<}1ILgf%A;UDSbv_ zDH|sUP+?K@FoY1=)&Y%_Czw-fATe~2XVFpC#2T`~!Wefy0+xw|Si*T+8BBjDph%`Y zy#W;~$*EZlCQ34Bd`SeQg9um>4q#hHLC*U3ZY@u5xuB7_e+TxGK-Gw%3Gx_WMXG3~ ztIOPV2|A<_4TSw?bZnvom5KUybk8KAL;c*Dt7rt92qmzp=)4FeZ3N5(2f)w6B~0C%E5aixw`L1Y7yslwJlrZP3>6Ac+{l}Qyi1Sdv!20xeSGH}p`D3A+O z|1+Y6xW(&$0|sXf7aFK!4CFBoKBhvPGYb%`TOS#XOiJPT6q5orybgSB-&JL#7GgfG zHVwYLLIT9cgK+Z;i{=7{EYz$l6LyI_(;mhl%KD+uO1Yry0C{-T0ed1Zjmcm9lLxa4 z4?DGy?SO_F5n*!6+6E~XI3E44t+(2m8aEFrp1&!fGmN67Xprz_rYrw8x*|-d)dL&d z(m_DTIEaNxLXGdB6?{Zz!bevw z0+Np9f5Fye?^n8kht%wN4NfSLCOnEFixAMr&ll&|R81Oj8<~#VSb`SN>}@-Mj*P+t zgY9ef@L~C{{ZBZS=9?fOg|L`%k~ZQVAG)cB2tE0ZjioD~WMjSe3Q=gDC<=d*O;LTT zIsz7q17@iG+u$sO0pA4BTCV7yhEXXl_*gGN2<;~V(88%R!C_ux<9KGMutK5}t(KB7 zlzTIK27+yJoX4SI+rq-ChJmo!Ph*k*R~`+l$lJ8t7iJsEQ87Am4C)b@h6v#+MFa-v zgfNQ`_jm)=zTrc);Su$H2*@kx@Z51yk^zBvjhF1;eotq17}=w&gGQ#OWV&mik%g-o z?9B${h$zN5QR>m~5QRM8pl){E+?>!(m>91Ina*2v|7*;+t1n z$B;%?GMS-t@(Mc>C&;9MSp3g5_V)g8LX$lXL*;h|6%F-&D4PBIHKVbv`_ag9o>%|r zDp!NJI||^xEz*_ALaC;L!-9U_Nr&`cfeP?p|LsyhR;ain9lRlf848^JFRk_8SD6$) zqs9C(r)o0~46|_v_I2{-f1Ab-tm($^{KD@!E$^eojOmaWi1)U3BN#IR#Etgkz<^Fj z|M+ilBf0BTkI86r64C1sv*`p5L;H8+NQe(XX?vWYI>d^Ul)g`dDG;`A!vY6QmE>X4 zO7n4oNrF%g+4fcKvIWOg7L8=`R45`~`7i)%lFXz^K#|`q1!Q*$l_z!lWX|VD(N=&r z_1n)yP$nsW!uoIDVaKJZK~hHyaF`_iYb5Y(6T%uJg)8w72)mRb-ZTJXQm zS4fAUZ}V}80)UuJ7da?Q04GFCk*T`x12d?|`cv0n1cS^$ym+H%zfpjLyVVR;oO!h4 zQj!PZ{;mcNv$m?QI3QSFU;QDQD$1f^X{?BCSn8`FASZAT)yW(l6fr5fg6fV}jDm~f z$6m7iChy78A?awKg6K{DEBp7*2zw%w!>WSuq6CgE3G)9lE*wu_y3zq=&MC+*e zf4119(-uN_UT6@-I7~h|Vh$}UPn!NrV|u^<#s6w?7O?UEb_BJ~X3@SP0LzmIo@p8@ z8q_qo5ZZAB;NjGegu`SZ1ck+eCZ?wrlQM)s#V@#t3cYv%oZQ?kC#@fS@f4aB0}uyR;02wrnjRI?t{zrwUVO z!a^b#n`kK*5~ZXk6h*T}04Jo^!p-IV=m?Zjybz1FQz)9Ruw-Jkm5Do6{e++xu zs_-E?Jt4$(L$yC{eU1`l$8+4r!#f;*Pkav{t;br-=sQo6*%3$H219$hVlAZ5Yitt! z<^uFPS+2Tjp8JyRj+d0@d6#o7bb3?D{o=YK7rMsPkk`<#8(XVK_&ztg9T6EvST*`( zSRL7L=%8-&KMxuTRrWeMBD>t$zFJ734z-v4+D_tVCd=sm~!QaFjGB?F5Dd#CYl+agKH>g}Gia!Ds}<##&7(fD9Z$cCaPgbyad5uJen#lvonrl{I63V%2ESS8NFnHbDqjng#lwWykw@qmku>DlRrQlSo(!rxjQ26* zcOXXct@>fnV}I2Bkhe26mk<}9#C|I4pFecy@ZkvVgWRH`lI3-JTu$O>tRXUIGJC@d zGw)zjUS2YPSzx}YrN!CR+4;@Qr$u+p+}Dn&d`~+w;OjHn^2*B2*4EZD_u-2dFJ1r-qMOC z!}6-E+DpGnAgC{T93*NX{*zlt38_BZZE*iyx6oS+_9!x&yAN?$8W6`1b6P%KC=`Y1 zZ#1z9iJz@Sz+azBad=|Or*rRX+k=V3+=orwtf&}tZ@;q3%%k~00$Z~-v897f9-rqQ zvZ}4Es}G6J7DPz#H;X(26zexXyI!0}togV@E~iE)BBK6eny6pVMIis&tpKdcDGz;T zIn0pIuSZ-eVP}p~kvHp(%xHb9s;+hj!`>`kA8KI1L+hphHlmGphh4QN8wbp;$K+_uVOF>7^nTX*ddmtNiSwRrAZRg`{eZj+}w-8yrTAR{0|KW0MqLW5!ehyJ4B1MM5e+Gnatxwuq{tU3+NN- zuHaDN){Uy;D>x($jV2<~%5K#PtjlIlaQqc9;Jd^ThIk;|c#qm&Dk}Rfd zt2FYLq2XDA-fHAnaiYBA?(--)Cc{RH&tLhu)P5Y2NQIfEe4RmWDz9CzyuhJK#FR%R z&~&?T=>DgSuwX_2sMXryYRxy^ImK<=_uQ#jzcedvjOSG|t&!>xfDM=HBLK270?@#T zG6e0I?u;RD&>Er}6*$pUyUwhp19KdvCRb^?8c9}8#~P%sOYaFb4E4`<3<1a}L@sjB zXaxtfFLKAHHGZ|x0gi)gaDexIELp3PP}1LVyS?=w12TXdfJZKRKR^HuINX}BXEPl* z$fm-!gw-2#>(U@^Rbz-$=gMPz4l?hOBGBlg8BdNLVUR{sKR-x?6sWy4%D8C9Jy}Kv z_IPe(ID`K65C2iY`)F7&@u13GTTgi$5}=;Xktzj^lqSH}n;ErI2H&%IUM;JhLFGYC z{D{jM*l@}ol?@vNryg?M9E5Wj43N~Z?#OmN!c8nvjC#P0>+`LcuW$1Sm%287q2Zy_ zL9KO|0jf~#Xg0c;zn|fLC3mz~>dcudUDE_qS8=RFEw zZ@qa&3q)LB{B)t@8}k4|&6d%w^Q!8T(^ELigY}T3cQ{k5;>)5g47M^Vy%z@kCBI9w z7=&>H5ssxsh{%e*GyUm%F{2sqjxkNr$y8fn#04yJOPp0}7_N10x@gXg(6Z;Jd z#Rdk>J6EzU4Xc*F2a4z1($(AJkN-x_;6#fJ^>jSHIrE&r--+)96wRgIEds&f$YLL= z^p_>O&p=SrG2x6v6+1anpIEafW==}0Fa^?eu0wz+=}>4=8%$A}VC6x5gyQ-wpJe#m zUkyq3RP=F4Vd#+VjfT)w%*=w9A2q+Q3JD6n>UuBZWyzyQq!h1{fBd}N?p^%e)6?1e zOfqryt)Q-d$M>H$@1|ymojEg!(=lP(OwtK0)5(p&q4Psd_@O&@d&2^f$GBcXfEFfA zo_%y6gP7zfTcT1kZ*m(nZmEmmvv1Di!=j<@Ruft)SxYkl2uQin`@$;guR%U!RGkq+$qgnKJ^6#;HTpO@pBya{;YxbOpFnG&B4wX{Vw8!dM`DQaVwMQjz_cenHAxm3n#(&zrNeyGaG_ZgVrvDJf zgo5s^p?9{lcJ36s}vC85$O~V9M3kE*RxKulIcZ;v1;}@xgUJCR30O6L(BH{Z<(b ztPl@gn8~eHeaPMNYuOk1JId4O`hxu`|JXnZR9}!k7Yb-*ceH$+j(Ga@Fk4WF zntF=6%+;72P&y)3(cMUPhX^vU6y%^u?pSUEL>?>mUhGA2aqi-8Uo zKFi(s!q3-~!yUD^wzl5f`ef@myMS&==r?0s$WG8j*?XL-`X3yqTjGaJC7$(P*mB&sBn zRAHoSDfZ^fM4>FNOIZ-g;tNwm76mX5C)Nlj8^n{D2Ss@=%;;I4>VKAxfXa#^3yhh< zDW4qBuuQG@Xk74nv8*%Yrk(mxx94-%S_pl^dP3XmQo5O%C)qi|1ZjM_N5LnP zRh-vMwjy0?53j2MOe_p0EO%W3^mcay5O@{%90qVf1G{#VDaY3;jP+Wf5R;b)vX|uL=m1n|AiJ&)T1= z2vMPckh$ah$Kn;9Jxc%OwY5_}$+6Ws*(DmU9Xjl?SH<>CWfR?Bmpea^B zviG9gZY;vIPMkPlSf~;vX7ed41Y$*%gmfD3362ThS;nHd?*=ohSTsCmjFJa^4d$Mt z?XiY^_u5S}au*wl5P*eEv|(Z^=tyB9v}L@p7r9Bp$eQua{8yY&G_TJ_gseQC?Cz8~ zi20sR050-6&HDTqnuO4HfgviPSSX^j%2sn62O*N>=Su{+UV?-4+GH2 zUI;BA^wmirvYhepv1V<#Y(0sxl90PDrG6~Df zHO-VcwbaPZSMGjZ>a_F)yY}VGAz9a{LBkgwN43!DVFJLO_YA(EFb&slB8nlG7<|Sv zF0?|`kmwiqC(ixoUrJW z($exzU>0r_K36w-slGyNcUXk4g?(CCs5T0sqQzkA>{i6*m|2&uh2(9Z`++?;aZLBa z73den#XH(fSGXTXoiKWI%9{1lkz;*pX}feO_*m<~^Dp9bnawFF>8ac;m;C(vvg!GK z@^bsQ5nh&F*sjY7{BeV7eRc8@m{jYK7dbydUdDVccaMBh3Ocwybq|65t?lYR#l?z> z8mD#?D?4}Dq=^;S#6bV)0S-KFJ#+lYCl2qGz~nzU{$ESzT$tg;z)2l4HB#&NFS*X@ zUT6}P?I=@q(p~|`$EhXO2fa7G>Pz?@e6dwl!i*aA)nuZCDgnujwz37-q%qAyWrg44 zn_QdjluwB%C8l=#NlZSPL=<=dqbzGcUWsGXf$gY$Lstt$V6!Sg1IN3If0pQz%_xYE zkH0aGSZBLK_QGjYiD)c&A*V|AQ*lr1^vx*R4%GP*R&+Zzecc8n1SHI;dA6tt4I`6Z zpR{?E(9L9`W7NCp5Rw3_BgJBvMH@r`EPYC5AyE=)T`9z9ErtQ$xt|)uotGMW2SZL= zBT^4@h~|&P6421;aRmg4#yrV(uPNXVVLrk`qV^HVQa(6A9xC;M1{w)1Cmzf|Krb^3 za4mGmA&%9pbGd6LNy7`n%VGwFmu};w)5Nv?!&2OC;N#lNvL1~;nq6+oO*`QS<$o23 zNzBz25bGmN3>v>NZ?QK$T)+I;OuVC(i0TPm05}FZ6NT&N(|#=aC!=Z3hDKz&r(8nB-Vz2F73{>3F>}W&IHf zPY&oGVSqNRCSK2}aH+BC$TVLt7R(HhFfctHFEsL9$m2`l>$l!t!69;nb=;MWqTmIkz&;+U3odrP~zHW$lWBDW%!E*N!~pU^EV@{L#nJJo^4hAUf9_g zr58xVt{SC1oa`ZN)Un1xmJ4GJcs`s@RLY+1k~_AAP8BIxdwHrL&#X$o9uaGt1FT&0 z!B#JF^qvK3i|MPI^3_-Q^Q-k_j)!P*?GZE)r-E;wLuk63_`xVpD?~GhP7)!rq2kT{ z_0Er6Ei1~K#W5Z75O1GWO^>`9#6^G|@c=OWEw;)VZ_*XEshJA~0*;eKmak?wUDC zw>g`{5_sRZyAp?(-Q58}!1NG(Xjs%c^H@aote^lO=Uwg1H|20NVv(m(%VO|#q{Wz1 z_A{aVHXSNN??(WW3LpM>VX2Xk-+1S)HMVgO!dMU1g@>w4`!LuM6c}Y~k>~B(WHx~v zQA4M!EW`Q)KS)I&=(7vrn1%|;_wTF0qiX`lp-%ozvm$&r0`>~p#~=#iAQE`l8$Qxn z;}b>oJEtBqnTLXp`6HufR}eI@ZyLe#?(&A;D$y{Xy9QQGWM)WWiAnFIWT=r_`%V^Z zRT-viny`7|!|~6zlJ14e^%09J?t8{NfI_v35(^@`OL6+f1z^1r{Z3;$M0N;oa5X;n z^o)(ISj?5(E4v@Yo%hZ|kKvDtRdHL3-xR-|Kpa^Y?e5WHeRN;XFpaxm|E$oB9v(e~ zK8sWPICD=fEo8k@9J}9cBx|$HH`eVT}hr zZPP+Pnk$3P#Y{BiF0etDx5#`1FPOXR-!3xkfG-|>{>!XB42Q()txI;IVN@hD1`T+G zKP?%?+0g+>G=Kk^Yc0Z3acjAf7XlCQ2nb&jt5&oTIq^Ut4b1DXXqRokiYEdp?LDx> zLEW=4%Q6VoeUiE*2P4k~HBQNz@bKki`zF@fRRY(7H^P4i>c#+6$%aauXJ}Y}axSlv zbO}V>SPF`o2O}>p?E`^rXO%+~d}Gb8FY5S_*E0RXa(BfH%ztt4b3sm0TytKG&b`_1D?@x`P@lidNj z;;2(0k5VwQE2b9czCB8A6k#lUs7KUToC;e<;G1znOCt#xdU1@g$WS|J_K z|I{7Id3WdCSBv&H72Ssqe=u@pwcLHHepuhDeN&spM+Lz6GzDS=`UB$>MBM5(-B)R- zKPM131Rk5;8UCA_1|`l}RvhOlLIFSRP78h>MS0$iBWiv#m|`&1)02h3py(0;QdM9i z3JU1_wyb$}y;=XFIv=EB?)d8)S;T8nU7I}kL?;$>+s@gCPas>E?sz!@36o0QX#pJg zgZvDmtcz<0;z;;cShY~@?4@%;k2|RBh-NZ>7-@m-`rIe-0Z?r&)%C+i$FoaUTK?>K5Y0+p4&=+4IDy$@a4vek7NS~YU`?Vun+?v{sHoV`TN$nOaxjC9>LqD{_`Xp-&sv+Y zD|ov88e7ilX%t!<-_3Kp*Y#X?S%a5ZxuBds+_Q-y$RR?87O$*YEUhBH!hlz(gJ)`Z zr7Eqx(O|(#01+)=PDtB`(6!^fd2%aAM8eZ5PNws6&Q&=&@J()Wk;dc=;Z%h#~nq@bGk@>4&YL6ww;ABUod0vg4Q^G|7PO7pgAouP_> z5pVX4)bgkFiPUjQj$9MU88fo<ev@qA1lni@8AQ6m~-f2LscV93|Jym9H9rC5rcVQx4f0}c#lu`Jj zZip{sZMJ^odaYV~-vCVc%z`;)c8=Ks7e}U5DD1j#-KJ2fH|1;uP3cW9YQuI>!2WwT zptq%*9m8~I7bYOb2OcVxHx6$oj3zL#Psal_wK*FaaBXS3VPcG<(=UO&QYKveeg3lq zY+z)TGy0py6QJe$;SVRxye^@8>FVxNZx7db-SO3#+TBSI2OhIy1uzp2e27Gb@OvyJ zck^oE6xPtsTtTuO9wZ07+uGiJ$^s9Tk`_7#XQ<9nQ}~Mr$?B0_jp`}FRUfJ(z;=~- zTJW3>3_+q00hiun|CPoo$kC}1{vYAVox)R|`+xT_+%7mdQx{=J)+YIuYu0RYilef^ z{eNsJ(DvTgbhQp0#CEw?Sc08Bxtd`4zRyaR3E+Vs{Z$N|@BKT!SsvL|5@ zeU1dL_vc=ES*BxCKG`WTL}7&H*d5q+6;5!6NHS+u#O3!T&$#7SnBM&DvB+T_hwHYB zO)-6h`@}V(xckSFc!=igo%1|buE!W%QF98tRdxwQWpBOR zE>E$stlUjcWl)FK+FVZh&d}ct;u5lieCJe#-u^H%)hZ28p~C zybpf|H2rJw8K#O?K{dbOMW3k^(mjYGVJp;NhB*b=g6>ALlB#r>ggVbZsaU4uv3fXB32|r2cl>q z+aA+tpkRgyYhYfpEI0sI1-l(~@a99NN@YJ0d-u8Be(m{UYMiE6iBd`N5hHb5bLGQN z(sd61S?Lx(U@fDOUoEaGwJ_f+^X~jhqeoknjpqQXK%yQ*!-dN+XoIdDwvsPiF_tt6NVbJYO@UgoLx_j7@@U% zmsgw8^-t${j_`tHyzG!m0Kf=fmAk2CO9R&!@KnQv(Cd zBIgUiEtH$_qn06hFKM3*Kg;g6Ae{4VUdp-m;I;9+S?sn@cRrwTHom{c51bpK=c<+#I_H24`XUlNP>yaglUD1{nBe_Rp^}H-_&B zg?1LNv?4D|e$O;P0NSU67+bZcu~bP4&3myzCOenLR9ApKz>r$c_)Y^%-Z1P?vJH&P zzl8?!@@6N}JK6^;u2rak%6;c!(B~1}@>H?HMZjGj#;~(I zSYlhC5Ws?5(5H%#xZB9tg5-)Pb<;_A+JA*q`5C`uF;IG|f&RUcUoG#pXXhSHi4~K{ z*0mlhG|5o(jY@KHSmtT2Qv-Po=sLBz0)TUjR6IkQ_JKN!?DM?d{TR5gBbkEtNtceEI+i@@KH z2(1X9#D8QBwY~>Kp86xQ&~AVvj!S2>OyHm;#~r zwGFT0Vh~>7j`b4vNW#O1X>V6+YPj5*>IN=97tiHJM8>bwaX0wq7r0ywr$48J=cHk6 z^|95h*}1a2_d_Q)-O0*%F=~Y%U|j=U{eNssmXwr$J)X5YYYX=HFyUcZp;(tqmrWJr z6j)PyJ}RiV{7<+2huYTf6W<0v`1Ys={b7F{9HtIr2gLQ+(1KunJ8FET%_?kSfepRU9SEG8I!(tj=cB65Gpz`pzTo_zXtX%Y=-(7Te@e@paSz36GMJ$Ra2sI~S zIpVt3Jbg@A(a4DbQaK24CNdhE27e$yKg{Gyx;FnaSO7RoFE?am>}QfN*;uSd;d~y8 z<^_6`+BS-Nvy?$k7xrAmvTR}f5bvx=$=fkcK<)d}o{_nRPSA#d)D?=I+l)AN@3rq9 zzZp^css`ose-E1L;Tt9M3ke9%fy~c5p2p^L=kVI3;AKq(;gp?#^s(0Cm-zS;1@8%V zwAI3oq!0Pf#^OG{cd4(hZ(~~|3l}Et-5bGWJqS)3nkbyr3`FNpuhIgBLLkT4s$tQw z7shs_;lihrY!BHkm{o3`{VK&7y_b}dw8(1>eC`5N4~N8z4Lrp1;7dp`Iv&&JWm;O1 z4na}@%a3Np-V--)II~)#%dCCF?sD@sVeuQ0zwsNlM= z$3QUMso8scT7GxS1dHP?#`wzPa6v~u{*o653|#IFxt9gqdSO`u#@#Qj5h}%Thk|a@ zl>+XhgBFyB6-c_i=q|A;J(`U>e@kbZXvPx|PbW`m>kn;ATq?fgg#U}s748ubu5TMw zyTDpnwQlQ^C&fjxTah!mGiK8-qrokLn<*?TEU~`88IYF7_rFH3YPdC4Ew0V^4P<7P z^y4QD#5&orfhvjfrB6#rK_LhXbiL5OF?nfX!m(z|%F5ytsAC@%hoq$|bbYh2sbsaj zseMz`C$#&~)bA^aNA>=U{$9KRKTXqrb@j>*~S z8$G(Y8EETenYl|+3%UVDAx)3Tkt-*j=*)en8{0!p9XY<6wpYFBj)n#vE-$7)2Wmkg zGm0R#71XMrv{v}c>2$%*yqC}I8t`dcc@^&cvd@74ksqu!nNwjjb?!24@O`9M^Hzae z6eDa&pTnO9ax0{vaZ5U#MxJac6A^twTy*rz&JT(RAhgTDZbR$7ju3FrvS@1dGYza1 z&@Q7~>+;6Ff`uYUvi6zk%_+6Gz9{;*0D8yo6_-yC`W&}7t|K4a>vVwA%wjL7YFR>z zK2HZG=^B`I@9UO*e59d;a_FGKH_cxb(~;c9YuB6y>)O~yRSp9$>OL;0MnsJ#np}H|*O(tbJ@~_~U^H%RvVM1V+B}@6 zL6AIu`@4VVK3&@mHdOd<E#!T`T1+_QnXrezjZZz5%l0ORA_b2@-%Q zn}7TyFCWD8v6BbXCbzY&;x?x3EUZCHzXy%_UrgKR=oZj#ROe4mGqDRH{2xKndUv5R zlH*RxK_*6+F9*9dZ{U!Mg@($7c;!Mcku~?Kjs9plyaxTK3v?#s9NVO>Ht0|Gi^1QW zG@w(~@dJv9506Tib}`*)KcBPLmg^M)&Y|<_i;)eR4cc(YCHXs7&Bp^(!l>}$iKyXf ztm#HKgBNMi2keZ2gxcR@9+nktTZ@K69aA@pFzoyu7H zk{SAL+-f=l5v_Pd9QC#=%w&i27@4Z4kmk=WXgiFCpB-h_~WarM1FsgiDQF?|)t*y!(mg;sVPxCj( zCVy@Gkwq|m^&>oh>H136u7FNiVhA87GjGK!7&m3q|QLA&^ey)KXO&YjYnx z=Blq*(7oEmK6R=__oG3`osg*2t$@x2>$0}_g2E?HA|gT8=orY-`PVht5Ul!T@ne91 zL+m(UPSo{Nim}WEa0pPP+O%v+!4t9Cx5CG-o#8bpx?zNdp@@*C3T^h?&)|{?vY;I> zX5>g%V-T?;^-T-XqB{@KA)STd@_RYdBSVnn`h8~*(EVX2swgx8y!I;`Mw(miKFR?p z+}iG>;OkR-pf*y@JNTJOm8=EyQTkPukW&E>D3VZL>IxyPc~fT!QGvf408hFtu~AFtNM-#6Ga8X~g4`I=|6y8p*r$xs-6M*dH3x$TEmXmHBnFR41=9 z_@P`q4h52oK({|h?rPjzinOT3P6aJ>`d%hg*7yvV9pbcCf6!ks%}v4F{B@K}+%fk? z>=g_mJs9L3v2}Dc-A8+q)W9Lzpr6qp!eU43ff~FZfVDdQu1?gVJ zVhY(7=wvgkx_|UEl{IBr^+RG`92`asaXydy5zUr5IDb2F*SjS_*JC_#7`D|u`F-*c zQP+A%7~WZHyG4=YQ|+^r<_?XL#@{;((QzsMJ+m@!&B>;L+Iz+(Y#O$Ma^y zJ56EkL!TP^@qE8P8@Us#eWs_UXKenhedbKh%k2YepOFtJ#uUT#jV2QlK0J5S($aie zEboD0$z8p_DbxkE0@-N_9Yl!NEN&SrL^w709yQP z@4*gJR#ZG9YEEhN>laqk4V69dt8YIW9+O>-=d~OA)!brwLbv9WU&tlj&9wmQk{(AACz+p+VXctNy=Y8-rMYLAx4#mP^HQ1n zV}vHq=wpZ!-tUA-4nv5N7j0*a6`>n!8aSe%H;95)6zlaq;ORgy8s_O?0M&aN?6tGX z67YKwC=N-<{!Rx#sGQ?bq0yd=;{=#gaaQ#D4f)r-(YR$R1XP7nK(}U7_Y?rX#rxS* zF$nF7EqdqAV|hI^DtrqvG5|5UuWRRtNL>Ane@ur6I-o_zlHL)6Wl6}*B8R2IFh}H+ zR3h_cABC2{ZCC@j2Be%;_Rr%?L7NaK>^m}+MH9H4#=PAc4SgN>_=4>O8t~kNnFU|} z)oF?V4#VIp)(5N*Fb)owHb2~B$wtG2{=oF$Unn#zR}+y)%rc1v)!B>DPU!1PAUA_8E}yjRhWrEcjdw%zVR>V@aNj&87VR2+W9b7N6BVz2cAp?%R4v=8gIxpWnGLG7B zw4#UavP)}I6S^(G&7}v@V$wlMRz+ZoInQU&G>`62@p|?*o?Xti;pO?bsVO?Ur+9VT z#%YD;u*8Gdz9w1Too&X}qwVtI$iN*l_r|cT$2G>Pfk#FTLtSLHju=Q@m=@jrVs3tv zEaVkFAtiH3EHg{8s!l{z*;mt^XJ>Wok-xDVXkEb#6k`Qxg?;NAjmC|}+URrHAXYF(BK)w9EH&pTIIMNCd{AO4LU$HJD|TS5y-> zTZA~Va)}Soy_jP)J-h@avUqhbAA<^iedc=PXR`os#oxfI#*&Z?x4ptvdDJ59&jT+>x2Cp2q^<6PSKv+(Nzb9{5{-cEkJ`GM5!*dptD`3DyFc4L&}+a4}I6;b&C&GknM+(ifN>=!}h`;Gs}fK;ij2U zB2p(2^Z~LsCayx~+J!`SxB~S01T9Q0GWFusw8r}vQN?YQY8cSWr`Leb+npw+Xhk_6?ByhGYsv-_7yu=@w2+sfldP%*@OMp~7>F$E<&&Qyf_@ z`Vct1+`A6<2bVY8f~h6BLrm+`E7V$rK>8=Z6}_|J`P!ZcdE2IT#8zkK;uMEJVTA;g zdDDlQVVuT&1HfHHOroY;Lt*GwkT;<1Cz06ud!^yT@81in6MM#vN8SCW&}Er_hgE!2 z0-o{Y)QMB4KpS-a{5GBL-o50Vy4>bW#$WLA{0m-%ZSX!YwlKEhf`*IF1TPbGv&Sej49Ludqb6$T08uu)#2KD>IZOJhgD4%)oS{bPM2guHVSsqi zjToC9=+Ox2kQ6KwpP{^l{2evoTVqF_yOHF9Bx^`3?PzF+Wt!D%{`lv%EgC3Ch~7wm z8o#D8F^PrZwg-K5cP&n4cP51QBLWjxGy=-!`157(hX}B!C%rU3TgF5|(8gBM6+UPo zh@iV>~c+ z6zxW6C*B$ny~8|ss7C-Wu18UlJ4G!(+N`Rgth%`XART612u9zJF$$^%%9})|J4a9# zW~kC#82>w=(c?6R?TIMp&MpEGy=AxhOCY^?_nKu;g>tX}T=TOu;<)}gf2xhk7hxR2 z+gk)J#aY8r7NX5B_7sC6QK^f7Ji~NhgeAOZ-xfOF$HLtTOa%DnsK|4RdrmFv{;Hnt zk;`B(wDme?8}@l=gwjX<9Pmwdu^sDCNEH@N`HQa1tbg&Y(!WBy_W7d26|rsg550NE z`NfzHx3qgqprH5s0_Mwv@51_ei(`0=(X)N z#Xbc$@i~W-QyRxttyEOPqwhShpjhaG(NAO3wwrb8#9y?6`3um^N=?0gzlPgfSXf#F z4&vCcV`kiWkmI7b4RMMw*rX|$Dy|_<*$-ytt6A@T@3#9U zPIuf%ynTlomKl>7lej)Sa#41qrhlLMQMJQc>zcn-{~25U#WrtitI;is=7r5rb9G2% z2*B*)1TlDpp*=&*BVYsgigm5ocL91L5!;Bd$C^~sq1!TeW2~Q}MiQBq6~B)-`%Vz+D1?*B)tOm`x!V&6_+*8f3WRv4*r= z%dnP)Q-`|o7?@f+=OVa=d6;uV3UP6$p^7;V8(AB&fj^L0~ zF<>c`TN?KC4__h3W#0(K!Zcj5R5AV;lZ5y|sa)OFfbI&-aU*{!T&s4GN?z?O29wm^ zm}&{VDUN8&fJCQql4KZ7OiC&wrs&J>|9W+g04PKPog4S1aTkh7H9AT>+d)&0)-n;saJ3sA~omdkq z6f~*TGf>8hZ>t9MU3~OZfR|l*2J>zw$+F!W>m0bgs;}?e%Q^iQE&p5Xf;gYKX()KMR?%T)ARBQ@(PiW zxi-EYgZJW=S6sn@ed^AgRhwHQ7p(`3y*I))xoNATQ4dlyTtKPp>8#~Vwn9!P#pxhW z*h&!3(%X2>2GyvefTZZkhCr-$xmTvOgO>jK@Q}>;^W6S@yYXTYTdSI4Myo2zjbBcf zm~yL6d0joft-fEr^iQ1rCBmXDqsULhl<1J(ve0ywUd~$hW?nf_>H^0Kof<`($HR^x z202R*m9hH;5SqU-xFD_wth(G}kjS3wAC?uaGwZ9z$khMC*n2=V88z*qp#_A{K?q%X zlP(4by-BYsB0`X^ARwspUZpqby#y2$1Q8S^6hRaSRZvk%fKa6On!EA)|NowK&t2=B zEL{s@cuQvX?3rigd0r$l_*^xNJSDs=((6GW0qHxl0sS1>hxA>DST4nP+#EepUO(BF z*)IqnT0RpHwZOANb$D-iabFL*wojMVs5Wk98hqRK&g1iOlt{9Jy*9x7=RbIMk$(LwVS^Rw4V-VNNiww!nB_%QDL~K70ZH1rvnN zB!555@Y@tmg@lM0(iC{f|C_Obuv}4nzUj}$NQy}X?w|Gdg$a)>*k|lq`1Z+l9Z%&} z9{qq2?9D*5J<882WYJ9v;a^aOoDM!fS6-DV9e?PIn3cr2`eDfj*#Ep&3??51q*492xl!b+bz&cV; zkd_5SGNs;E?(^*0*zi2N2J`;FqnR=?+6aHEyJSWE6Q)X@yP^)hw6FZVgcX*Oik=>7 zS53kEI{*3UmtupiCvEEQy#_bDUavRA#mB@Ff}e@XaB=J(FE}_}!tjcAnC$oV>g)D` z?84gC_$F{qS@SKhLfk#v?uUlt-@otRaJ>5~_ZKYx7DnXoNM~W;y~o?bqt$yn7-&lS zwY{bkF|H8hLqZOsribW))vl%g?c%m0fJI!QDhW{(mPL>QiU@ciAp!n<0)LRr{W9AU7kVmcid_-}LRgrkn!R1EcU-MCN>YSjOyg#?L`pt7m&L8@GsdLJ2slsPeQm-9{4T2YDKSv~R?O*7dw81?x5%c-W^e?TO zcK%<}y2DKH0`{qGt!+6bz zi*P|>P3h!z7)u>clw#hP)Y;ejm;omNZ2=R)7W1=b$d80GK9=0vd{wn=h3zWl?(j4- z{31LXP>)qZzgXJb*k)Nj&VJU6smD$MPY@9Vo&bnVvS1$vW7fq}3&y6#rstk;H{$00 zVFp8bdK+ObGp8)Z3B^Dlz}*7BCD=`GpiuMk3$eu|hv#(S8)@rKvr7H$B*narP-5BT zGq)ouFDapC%p?%8kRM%BB#_H|o`jI~!4JE!%_(3QgF8DeMadFWy@zHIhf8d}RJ+Wi zfCYLoK~@5Q)XVqnxOvlQwtj+;-&?{2NYyypUD%x5vCU3s)up>evsv~5Tw5+X+w-~E&aV-$wU`SR`b%zYJ>IJMs32Go&4 zLy~F=`(f+rW6mcs!=37-5w0O29}HZ{8n3*NJ2@RW7Y^vseWp;$!xBDooM`X~J+zKJ z5SIc&mZqslNeecAYgQ@hGBs|7*NXV5qiz+AOEx_{Dxm{98XC$g1Zl5L<7l7plNp|p zP%uA4I6FJrC3&(3#z{`gY$~vSK@+O|ci<=s0+t45w{C`0T^LA6s)>a3pK$q!`$x7? zZI!r&w*C25I$mu&N@M`&1#%GcW;sZT)Nh!+r2YJw?uMf?HH2?ckjm?DGoX@IRO05m z1ZeAgjg(nehW7b4AIOG;pXX)<|I#ddyZ=tJWYW{mA+W4$=8GT_VZO9}J|+N1kd^TE zBWr7;&*M1l?jAIu={+L)?Y*>k)u_1KcAT3_-IAJihrQH-eg|Q04QC>Jg8GPviHe63 zYJB<9L{Pgb+e7n1xwc!Qm#Ur&x%>XhDnW9)=U+O2k#tGMMTS z#R@I1VerbCzUF!i(kVN0y0Ns@_SM5iT3Y6SNbQqD_9%B^8#211=oG1sIcyMZ6r~fS zQjO9-W)a2YUb6@$)Y*HKJ1k!zD_TBF)>+ANKNnPqL}%ulfF8>tTlRDGSEG-X$Qr=l z6cG5ALJ9vTg;ED!_Q}_$fUr5WU~Ow9OaNKspY{JkRsqnB0IyQ{~|?HX0>VKZTB9JKViLaFZTJ1B8Z$mNr&B}Wi<#0 zYS0Vk{PMV0Pa}dv@NI{k9U5vMG1$}H)6F%gXG)5vr8}RY%y6KZZJBCjb4)e^-ZcEMj=puV1(#?4(O3Uj6 zh_#KS;WpJE02|~ULdf6>TMWG8%omwe)y`3{QUU==IR=-o+=_%_`hmI0$j%`#;r~Jv z^!^ufTiICIoDv>x^{_lsI6hfW&)xnODf@nrCEM^|<6!N=UUf&w~)yA==YrXCtP8Sk7FDdVTUGBmD`Z4<#-xmWima{JF z0OVj`08s|aSET(1od-)DG|m1QTLBpR>?>tv^Yc6%$u^6C{q<9(`|-m)m1is*r;nkbxwP&YSD#x_4BB}6$FNtaUya+-XZ9H zb9K$>*=yokUK?#|1RE$(?IqzG%04UWCsR{XTz?3-K!4=M-+jW>Z1hc+wzEmP(y>c? zZ9dmB=LTULoIazRW`Npo6c){~RR$x`sAnZE{8O^FHBDqfjbYlpFaZ$}Zn+iRffp3@ z=@T8e&L#a2hH!?fsL(h$X-9){8tmPm8fsAwXu@VPpNtSr^(W1(X0zA-lTw8KH#Vy6 zr0ofq+Y;iJLkKPY4hi2lPR~&F3s_OPe_vtHco5^dP9{s7gK6pi3!du!P9@IX7HfeZD_}VG!BM^4c?b0~m=$WXuh??Uy z099#dXy^ibiy=J&7$qmC1QbM$T@_ugf$703G_+k?E~Hl1U;XvW`1)ClKOHfR30F}t zVX-hKiTvw+iV8BoZU0Q;O*xsJiX}K)Sy|b+jhVBU!CD3Z;M~UNSi<^$umlhQZke42 z04gd25CE)gY;1sI%mU$u{ll8))irHxMt7X9-#R_IFDAN-T_3l)j;t=i*+eD~9 z`WKzUs3Fp~i;EZCh>3iqylm+{+Lyg~hd+Bm*Hw!9$$XtVMGN##WL$3G@ke>2#2YGi zxXgTgf89t;*k?n z{m6F0X@T)2i5g{M_3(roB<^04vc?a{X0;q7W&(G0LV@zB0f*^7c<>xk%*bTSXv6f? z{tqBdJ9S=!o&zpsVD+5S^$n=(+7@iAtgQ%VHs@smEvPigQ~ORPi3hofH*iGjXlg(-jpSz1~FLzJbz$p#r@24e=W9_Z5Lo}S4(#5SM9uvKrn7gW6)c3^07=LLLm z=#JNO+}D8@3Ez@bLjh=XzOMd1h6Y2Q|FdD;u)1-6{NdqYJc#rx*(|DUbB%R#t$Le} zI`Ke}=DAQvXx0_w%W~VtdzO|XCPG}HA$fV}0fEQ+rVp(gb2*an`zt)p<=v+HiFzd0 zcf~UgZ>7Jsa7tM}nbWhZQg*XC-f4fpEmQdixa`XO$gFw8{H#X(l5YS447I}{tdKE3 zY6|x4(_UV%B+OLA#7?w)kyj5F;Rk^jmcF2aD%xWE0F)GTj#-s%1X@Wq*KO( zApikv2BQ@8-j!_}`rJ@Yuhy|{nyauxn`3hGai(X@prCY|n?K*)g}@6~LtRhd9AX0~ z@_FuO{%qaG0G9X9Z`ftEl~Vd0lho@&8{C_>U8vC1}cOWalaq&YWYaoL^6E=EDzuw0zh< z0X1rooaI0NDFgoVuRv=1AEyA(Y<*h{yg-C^bF+6iK7KQTi4cfjOp2j{QN#Zm7z4@;}qlf2m2?2T6@M1?ZVikF+Wp9eQckM-23@>4b!oX+7k4$VRfg zi|zkbGqSC|L8huYS@Lpjfoy)6k2Ih}&DXe|n;ZVIw3}CXbr-U^!6gZZ*Dw1$UK$65=W8k{ zDUGt+rm!8ePp6Zj-c{2`HitqKT~B*a82R9m-ens3g)hJI+5VIq9%Kztnn8y4O`elN zBFZ?m51!c&d76GenE)RAHCn$8=_hraladOMav}CZi*I+!v2{M;qM)u12ctC7=WFyF zl?Bxtc!BRSBI3NR&tw8YqHVBd{(E9B4;dN`--gmmC*1ZAJB=sfd^x48BC1-c7}pNurtif&8@HR3txuyej~Yho~Y-- zL8E4La&+t%9D>Qx3Fid1E>Vz!oL?;Hj2s``+CZ_Z0)eMV7)cUg9q1>P(*AmooJD(9 zW4Xe$Q?%nStk-kP^!)#6{iJ9h?T2B0Qf)jej<@;K_4v~rGt#e(rsm~61}TJg<~EqY zeIt%81ZyJA3HcZ7F9{;Q4I?4qFxrkf)XXQCU9Wkq;KQXPT1%WWP+ z?e_2;hW02@=tU;tHqcv!Liw9nbqDQ3H5KSmu~;5e)p=^Vlg&dse&01NmQEbeO&3H& zkR-cU6qFp^xIH*}0BeEKJ|~g7HwhyJP5eiB^lyP~M~*unDm)1`y%D zJb^?dq?dOT!Kk$^Zo`!at7_RiO)`_Qdk0oD9nhReP4Xk{37EAtr3m>NbiyMx*t-T@ zaB(2qPwa2If~`~Ld7lCiue@$P*R~-m4>)zeyR+!PxEvpfH2vAXbhfy7&ix*WLAUes zqkh^{nT7^gS%qb)N)ia)>fx>$ihV6oZ6^!{iTZ38FhRa!0Q*z2Fg!dkxO?FzGrQGx zP8LgWE24b5cbT!`xp&9zVE; zQ=^awV>%_F_lf_iH#P07udjdY{Ns1cZ=P>g=?raclLd9MLg%rsFR{27#=qZM8lr=#jrP<&FSA!rjWNKWp{5#U#0DaBAiI zFQonLJ9a}&U+igLCAS@;4B_=RnzJ~`Yd^XrU;ELM?+Rn;WA6R2(B-Ue>qk?eQ@MnY zhsRrcxBQ*1I5`=hG!CHI)fUrg5!P+VnPXl&M4O{qxkt*MOlz)lZ_pAjA-%6JzY}=z zB>m@8qqqDkO9ek}nTGi?#Nsw$sk&;4A%HqEmV(a8KJHNWJGdrEaj%X1$ud4{W6SU3 zoiU~3W14Y4KXS`&t{Y4Sv>q9uKOTy5O`)Vr(#&(Oi+Bg5an_IHvmXS+<$KZW8avw! zBB-f$CFF|Std}U+5er|xR_c~$a7AQUWe3lrW4~73_>!RY<}at0f578Po3Ii~yRb)A z>HJu{U|>7dmWlfKn->R3e14o{xa&&u*3$tBX(wXP!iL;I~&@x7w?ohF}=<%H4X{Xfdqwn%fzOKhKSDk`2{Uw%Dg zV(D*P9Qb%HvMp|1vbY!{*>q!mr}cU8C(gfw5AXVX@HL(d7LK)dZcEr+IdiPt;|{6@ z1WL@Y7?g&4y5kI_W?zUHL3ntrPR7tkWGG%?-_Vdq zNU}qNXF+FjqOdqieMK0le%a0SvqW1s-v#|qsG}TEkrNG1tC5mo;8kN`YYSa0pBiVR zKDZ>h^CifUE>eha%0~j379h^*>wMlp>=AdUn=`or)rQ>Z3S39Oi~XMW3VCKYw5^U`}dsv0H2*;A8DYE0N27PdsxY7Z=NBwR3Hb*8qoN#A0t2UphqldSf?p*{J-@U4lXM0cF`c6Xg?jceLC`<6 zQ##Dl9~XwvCQ-XUAT-F5(~uA`+2|u+q-Ne?Cp7wBb%6Yega8|$iJ#w|J|z?kDqHHy zz(^I#Zh|{xIKOZ3r7?q``R_cG@j686vp2zs(i8u4qKspLkpF$~wZN%CyR$m$lpqM@ zLxGMcL(;kb>k|kWn(F6w8?SqA6M@k1AN5|2!1c_$g$JeRDNB`3Xub}R)nL=$KR7r-^AyyB4MO;Qq-t+J>cjtev~FOj}AXWN~bD2Lwd>f zcp7u^+~ekK8%1r1zI17H=K-a*JLbx*Tr0sRPIjTaOaYS4>%%qg82q(r2Q)`87z5C$ zf-$9nT%|*YRLZSXC_L;LKoVF*0JDH7Dv<&;qQNm3L2(frIPikzOAPAHsgN4B>@Bxp zmCXaLQj$*4zg7kExs*QkB+F5+PlDBHwC!g6A8ob0n>l>ME%ubRjV12udQjB7>)G?e zfcG}lv@EV1mP#!PS4_r!yWm=X_vI{2qXfdk?n5cB0g*;~K4Mn6!Hoa?%4m^b3_YI^ z=Bn|wy2PMpV>8K;lKVLjclXR)agk9B^RvsL&YyvF=BIxH zxhr{7Z8>ep@9Yeqb*Jk!46Ooz$Ir(e-FSZUFYHCui|3m)%Hr1-$3I>_wT}OA%=F?Q zC3Nf7|J`-zc3APyq9I8AUsI99>u(6}_W#^ay@9ki_ULlK6J`kQ5u`^bvnQ;-l&^9e z

    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 z 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%0D?APKzDpDs;KJx_Yo7 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

    *55^Fg%qi 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

    S_+t+CSIEBugJ0re?Uz=8)< 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

    FR-G9zZ_X`C?P7F${ zOjCdQZj&a=E@2oIm9@@R2O>W%fkbA4j>nbD{kb`cgehfU=z=JW9KsX5GB8qkQ5bo$ z!#7|a`63PUiJSRHyI-qGCOtqSC;?lm<4apy{*iFe^cUT$0bjM=4_2%Hy8kk6^!>$` zgaY1UV%EPIGPN0wN<}A59?FzEOJ8D9>y7!j4o4Fx<54GI4eRpAq#qnGZ^AJW?S1*3 z_ef|W!H7%xw@w!k2A$oSz|j}jY#5h+kLH9Bv2A|$K|wY2+}e;q5>N?Em2X=cTkK{M z{Ytmq!l0y1&)n}+0Kb>%?l%`XmGjf;r|Ni{nz1$8F8|2GFgf)Z(BLPXNOxMASbckX z%Lmc4{PPyQ$aPRL{EuH`G@I5!lTFWAEV$F4@J~gg+kp-h7UCVOtd93YrkAe(j;jrz z#Enm~%#Cck=A{8eB?IXS`%5HKhX(8=o>xKn7J%N%X}627ogTECvu4YD5*Yiqa6)P* z%dkv&>G=MJe&>YCTSE6rrMJ5nk-WXT#+ff?2v=)r=;~UleSVNyaw5iMeJ^B(I7C*d zo6I81rmyE6y4*L&?HbwG5YSJhNJ|qxG~{3aOCvA0%o;&1?hfDHdy*e7>>emo96>D~8dw~M zWR;fw6??)`cJKd}3yk4{1NJ|P!5M{gSqZe=*B@S_H$9LGBzsCYf>l`5S2RbNcDQcc zvNb@@r-Iu(1Kr@)A-xWA8SJ3jQ7nnLr@t&fu2K5&V z^3$+-8gQtN5yOO7wb_X=ypiQz5-OD7mT+}^v?Uf@h%rGj7oL7)jsjwIj(YU3O+ZqX z-Qe}OXK%W~C|&?L$c)1`Xp(d$x{r^}eZ1 zDLswiMl}Us_QfumewJ4EP0NJJsELkZ} zwK`HY*H@S{oXp#t3acyxmTso3ieC>m!fqS7hZ)!VJvY#l_NOfqt9Z`VaRrs`K#vtZ z6Fr$t5-2zj9Z=B$LHandx?4qbjBe|TE~ow#Vf$6)jd}#@S--JsV3^FN^e!9v#w< zPfOQ*&P4_wJId0}uA{q7N@lYcLD{+4A4WQ}^Jfb}#|^I7$G_{W7IqAXx+WQT4!yKh z$E2;`e}~2ce!t)Pqt9(gs62aG8e3olhFZ5hXt|jk0yecCW`~}c9rMA$DG14z^yIO_ z@qb_&SXlu9`s5tqlg57cGdZs1uityq1%^r3QW8eMh!((sQ~aWYtv!FB82;JV)YPY^ zr$-d&RqS4CbIYr8<5+RfWn0na=(iV+ynEmEFY+%U{qgsYzyJATZ`}!~-EJ zi8H87LV*^;AC3v0Vo3D|KMuMBtl7l}VA08uc=a!ugyKS55{BHIoi`Wh#sz4Zf?2?% z&yiJV2|X^oZEenA1gY*5$)C}W!rT)LYCR)i83Zh<jj{Q-kMDkNTB#VS*~A z8egLw_08?QaRFyQsv|HDqmnQDz*PJRZeu8cS!TU^&~~M@DqD|GfnayOF zu86>6mar^>+XaH?a@aF42pJLf6?x|^C;Eqer=kb27o1nyoh0851RNz{SDwfvyJev)Pw0a=9I_2$y3m#1;V;tQ9Er+G>CtDf zH3=;^zWS3Vz*Q!t9rw=}b}JA*yz;OFT7)C;?q=qdTO87#cFhTxMczOJpuMK+G?*VT z3NZ80&Vw8mT$SHWMRUm7Gf}m((!NrjY@fWIt(Za6KDStZxs1;gp_8nCpbV<}Xt$fG z3|MH7en&?|J@CGE#cHzM?B7)uAPLJJH|B-L7w|3t)p6VL8%VjoKin?2BEX@Tv|Z7& zo?~Fjq7eFr)3w1u-#`XPIE$j}@pp>zbfP`Jw4fD*T7gE<1(^*iysIB;T_DOmy+~;A zk?zhESYmS;$@{t&g`(e}wuJqGq_i$%04z&3 z%OGm!R2k)W!n-H2GT$ite*vQFHz`CaJ^BWAfSkpe3qom%UDBDKe+C@_d;7wqHGayM zaIkU&=~BvGgx^D6PU`C7wrU6H8(RlN+^D~Z%&i}7f^}&!_woNQVk0A6NdNNk|A)Lc zkEiN;`^NWi%rhlZ8H$t&Wz2Ml%223CB~u6$M~2Lt5J{qu%9I9ENM*<@MJPiuWH?AA z#BqpYI%hxEuFvOtf1dAiKlkf?{un##-Sj z=qU2lD{E^y@Zd)t(9pSiq2CKsuH?NJ;xG@pSkQ6a=gO5TzP0-adb5|m_`GS1HHR;5 z2M(B+1kzENH*d0Hp*c8^3{_XAcdeVm(9neQoU-s;(6C+K+f>woX{b6Zv{)=`h#&Rb zZt1=RDpnSz@JvAM(v_5}aIbLg&FL$3*uoi|BaY0lP0DE7bhbX}5G$L72n)%9h7Di| zmx-|j%PTnu#jV0r4hIpIy5+pwxH{OX2bWRP6%N}$)Jiif`7&9NNBo8)2iOqG*in14_B77;GCoh9iDMqN6!tJrFvaFTG6 zeG;q72y-}fi;-kft|hw*W1a=MZ92TTcBAbEjy-zPXvj%U0lKBF(5l}gJ!`9Jl~5in z|IpsX!kTkHr8O?UO_S;=G#zi zTx0$0H}7pQ_rAb>o7ED5(z2c4;$mVCGuL1~jVJ<3a!p~Hx+L_}aNMSeM$Cj*+1gsJ zTE0bTzNo@j`KX%OXgit1!z7rK!Yu(qes;2W+(iE2T)X_Yxu}r*a(R|e5F%df6sy*7YG1xi!Ak9kwB*4p_iZe`IKbBn`aRxW%cwH^(2f}wviJ5mpvH{ES3CWPonsv zx$!|oQYORe6<|g`4?D}-5tf7a(VAF!sI-u8{QRV^>?U>l*>WWh%j8FqHp5H8 z6Lqi$ELDbI$Mt!DDfCT;V$UC&-+O3+o$0uDx_Qp>C9zysEN8^cygQ7KBDIA%b3|^% zMnN)9urg0MSf8}0z&P1du0`Vi-rQV#Oi7wk2&N#KGT35X!m>H8)?WUZ0}6sIulbjb=?mUw z64_G6ZUjfd#TrZ$enTHOSGld4X4F=Zjt6?(99gvrB}Agzj@m9=X}O&wk5+wIlugJ9 zxE*1BJ6AGRFzNNY)8xY@(-;PlYvnYNWA;6_dbVuSw%MBHzHC0>w|kd$tCzeOZw=bE zC1>f{8mKo%B4N<$f-lbpOj(6{#gK+`k2)P{#bBM0fCDUelU*u@SCW31KN|N*%t21i zVfU7;(WbSv^6mejaBJO|q+#GhunQKbTJYY9WSQkwEK}h#RfhAI*j=y0M%R(VMQ( zxW$JBgm_?`I~?v*jT1ORMOQkBYRrnb7%2RM*N?Iqz(Pvjelv2XwHilciXfVZg`u&31A7@1FTQ!7ZGhu3~)i#NDgh>Zq%SG7J z?hZ^H)4TP^=;d7*5hk46#yDekwqfif+Kq&yp~%&Y93ept1pAi0gaZsvenEDePy z1?F-b6Tz)tRFc&7kshh#frksotP`yJfiz2$}V!{{g2Ac|YAS7q2dvPYj}@Yy5Z zC{#}bzEQBmeEY@UGPccZD^zA)Ft1>-TDXmGisW45pz_QBSc7kbJd%1Exo=Koy;X=r zVv=DY1Fs~9#Q2vkX|DIt1}?*JqBqmRc#!O=On!&0&+m{^Gd-aWF=)wVjkR-W zSS!LN_+7$~n?*?pH~HK3@^wmYwGaLyl=3~R=+uw=svDdfUW)>4ogu%Z=*y`Vw zm4%`oxhlki$0^{h=ghbh(p$r4lX1?}QK?$vD3)qf5mqKcX*sbP^lM6rg9tlytHvkH zpl(AM#!U@4Qlen&KGl=1vIYF_pg=HP9m!osx(L|7~y)|oo+3zZ686gaYk z&fkNL^?BAdCcsMtv!p|PdExzOyGUBgF5wo$BS%|8S8v{oi^NIslgd7w6yd;0am9zD zvu0+Hv@Rww@=1!6O1mVy+*cH2j8bmi8A8JcVHn+|z7 zYND1VIGjgq;eU*rT&1CJ@}~R?3;*2K0As?9qo1QJGk{sHjnE7spOSOwb{n~VcdB5npE>kQ84NijznSSUkfMA zTFS)QZ{SecCz&MAQ1u}w=KJxH-~*hjbqGHbcdpQ)h=?~;)IPVcR;8`R@lekND^xMv z>YIg$r10sj)+19#?VUf+6_3KWI5DO+(0Xdaa<&3%1n+-FNg6BDun2RlLtY)}7^`3i zEGux&Yz3O&T;m}{NxmO2wph!)RWK%34(9zz$}41qZOMq1m1ozL7uMQ%Vp&9NlIDRc9@YJ1}f>2+H#2;v!Lde3 z&pzW3H2ozNv7TK@49+2WQg z3exr3$l$01{l{EpG>D+%mQ^OCUh+34!4S#&h( zBB_iOrz9djdY-@+kBU)jbeA2ot;G&%NJI8>9*JBz8t#+yAt0F zVrMc7zVZyOOtqG)ns<2(-HnH2+T)euO?=glEtGioSXxnpp|XLcM>h(|S1#^(3Wxd3 z7W;JUzm>}jor^ulo+COkxx=@G5`Hr8R7i?F)6!C_@YXgRMTG*&!xvtEGqIGvbFmPI z<{f?bL4Tq+yiO9$a{ceJ_@fL;w*yWZBy}xHaF~3!Q=n~ zFgOis;|khQRt0Dl1|Xpc?^gaUuDoP)VjsClziVoGnCm9%;dmYGAh_ zZe}G%-HTaF@Qus?7FqB@ZPEa5RzRX`62~SA4AN$V$q464Ce)Bf{Esd2t*T!wg?i7; zHVleD*DMiwk+6P#+ibBtDLiy3bP<;LmwapPXh)DoiR=jS5s?r>;8H|a4m&@-O!XG{ zWc*$9ousrTzf6M+%R6&JwnvSK6Kgifi94D6J>Xgb$18=i_KfZ$du#Ky#55(ls{}tG z4X%|+V!bgT?1+ExrgRTq;r?ZIZYG=jmQ4ujgHL|z4(6+hU)yl6jo0YRamQWW@#3oQ z{Oz^`jh@mQJ$5_eP*{Fnjse>pEiV4J1UdPE^QU*8(N$p6_44X`r@bw->P)4ugDRKz zu)|^J4FyxXcY5=AN zIS^I>1SY1#wGlyLQZD8pGdnl5U!l>-WL0$e%By*~!!@4-BMn)8s!Vjgif^TSp>Yk; zPTDQM`W#(q-)}rEp(980mqSm*eR6&2OtTq}zvM&yx$O%rxWB(*s7P-|=LJ#9K*9aH z6;4yF{nx{3W%nw>(t~IY=n8pZHYkXkdQy}A(Yx|eXR6{#Q0}7@u?#o+LgG%V6rbS6 z=>e4!Ysl&xjT9~lfg=7Pui!%Jwzi;wpN7k1AZaz2=qOjdrs?Bqm?&TT==kJ$(>ueG zL7`gSH|1F)p?vds?@Z9pg~MqMEc3NR@7eXL(X1-8(eQ50Yp?fqw4y1Uk=MUymuA}P zlIi_bxmrQK^og0)gR#}!qN>?HpKg~oCRwm(+fjq7K9_Ik45r%$B)%;*Vm+J4w15A# z)PR=AJuHn!DCWM}`_W`q8PQ!&3OVlXUb^P)UtqF*<6G8~%`^8nJ__}QZ(-iFLp%S# z=9ohTDN!NXJ5MV{`7?>@oVD{+tZePPcWNl1UeP9au!7*XYKK;)s_zP{(zfejC zn)Rt35AN@2q)65meKFNDX%;%4^YhS$PM-~h z%__aiT9Rd9BNHPlg|?JMdi_kxmz3EmpNbp4>inwxK@@Y#)MTDD)C(8e-D(pG#O3?At*usOQ1D{quA&<1O2kSEL2Mys>ceR3w>KNQC}iTc!m}DXLlepZ zDI#dVyQK^_Nx9V>Bh*yH!kJTbN5ZpTM{o}#q@Bihm2J?3y@N#C&W4S|eo(nhKtH#J zqH!<{S2*SESZFynJw|=1qU$dBD;mA+IbjR{)WzR_3V^w3r`VJKmU zzRnb_Xth4SX*wm?T>RKg%9#u|g89`NJ6}_ud*|N0s`RK%52IGd1*g_)<$b90p{~%Y zT0GG%l+S>$K>Uv1G1Wfh%2Xw9h4%7rQ5(w?qdl$cM#N~XMK+Z)oEi#)z7?rm9fKTo zE+~rjH-vghR@mv1weB;*1ziWm&c7I0LyMrW40J}_hkXUY(X-(wJ-^v1#z6gkPmu4O zyDPy%VN{JsPYQENfjIptN>80eyWbi>?)KRDgo##FkrjhO2d956Oi(q6X8kd85#)yH z5=e?@;p1Hv+Z1d}s4zE+AKV)}DE?vab)9SBS?;^vRKCv=Q8eDCI=@lFKh3{t<&C00 z*{rEu`K}g^S8YWMgkQ02sEWT?wz})Wp!A6QG;c~l|H$$CZI!kaG(KO?`^l;!3XY0q zNsJ!80QwN+WY`!>0nzKi&#isl?BNN6RoX)X;y!VuT$3o8Fi0PdpMQR^Hzhdgq{&Dj zQT$2allfA&Ia_nGvuUK&A zz&iERPWm?=_6wpd8&qfs)@2Pd)3H)+&9piLh9Cw(T^*;`$+RNotp~Q2NnJW1vhn5C??x4~CmJ}rqO)-t8j5VB zltWcewRKdWP6|4JhDV%*l-5BZd& z%>Tr=f_RdM{$v><=7yn7cG{zxB6zNN1L*3X=SpM4jXD{W9kg!%%eGXWHuvy~<*3wPHY}ve4$y zFEqva`N?++H|#vurH7*{$LCQ!ah_1SEm<{LIvyjT^Yt|9qBFrq^P;4PoGf)E`m+|J z$GqTXYk9@7Unx^ipkXTk$rQW4vo8Gih-_p*?=SjZa2a%INTt{<0y@m!cD6 z2^;5nvbdJE&MwQge&Q8Hn-8Af(k>>P;bu4T>C>vt4}#o`q_<1V#Rp6ZtdX;bsma(t zsStGv1n2Q4dk zyP4Uq?Ycm!f1LJ$Pc6&F=W6!5FZ&mn?`9pU61zLvIT5iby77YFd#BQbHU=5B;jWmS2bnZ*N&d>WoY3hCN7Ae7)&PLx(pY^_v?H`u%ecPCE|l$arT*$+?9UUAk&J{sV&9k z;}Zu6inNxD1*`3ow;Hd~1-2IZSL3HPY3f=QqKY;w43tqg^D0Zi+#*DbUojgk-#fe3 zK;F0G)0Ywn?|WWzxQMiIb@4v(kU13NMhe~bmm8Tu@H;6oM6)=|I(<+_c;vZ%dAEN< z(Dy2mpYfKYarwdm*tf8;{hNr~V$H<(jnNX^WRGx)i5wzbD>%Mg(r)c#qHf^GjituY zY684%!S@CmryEC-S5XEbfc_(W_z};5Hf!w4PnPW}!5>ZEGH7r7g@sjor6Mj`DGbK) zaQ84fMnvqCYah#bF_l|*Uwl(w&)^fW3j}U-adj7HF_eA~b!lo>Q5L|`s#olCqaE6r0!HdHXFd#}bdR5) zcNgi?YntrD)T&@gv-=>g*A7!42KCyz$1O8{v#@6rIev{vuK#=I?Wm-{X*vLwWH~!t- zUVonMv=1{h)%T;Vyq6sf=)*lOaVoT;eKhbn748$f64>Bhr9%nsANuLZ7}@z_FpfM` zwcKCbFx_p6G8Db?f|G`9^Im=MJP|(UY~)eH=FnafHq!LE;Etm9n``QWBNG+l3pBKG ztZ~jBMTN^uE0w+1(I&nYoJz@SceogKS;W5Q2-hboUZu0s>7~`=6`OuCd4U#=&a}Uy zULRc}Ok2N)D{2B@7jO{^-xCNDL=xl~$n8BqGa^Y06d8 zUpzXR{CC&SLGzYO2&FI}b5Jz;G%L$D3I$zx(mm1ZoMpb-wsfS89-Q98z3izsp(k20YOP53Kqn|#Q2W~B z<&c&)Pv=y7tnHF?;Ai4%+Oh-`y=4!soytflw#c~LxKi!2wV_^Ru zUFr5OUHJ~VZqI+1V_dXWvTj0^yJ0iSOLg}LSDk14W8Cy^awlg#I!k@D#i5#Cf8QI0 z-LI}XJ~)jt%SfKjU$i{)!P~@f=C4Xtt+#C>q_0}{t9&Y^Tv?gJ)Xv$!@`*8+v6Qa3yYP}sjq1S zf6OAmtM%uOcN$eI0cwTlkCWPljXZnYt>imRdJHjY_%8gY?$~LWKx+F7-by=& zdAdrc+^%zZroB=*VQ9)TXeGe4(N=e)l~#c=3e3!Io>x^OABfdIYp&9rdT@195=uEY zol+g-XFC?aK@=F1J*t|lUo|X zbfHhndh(Ghx@sqiQdeR|5*eC`I?zoCs+sZCdnzWivs+8si%8IG);gFlkfUzlrdQ}W z{qgA#U%oTN)TaO7bmvfhwW22cg`-57l|XnUJ#0VrY#dvf5 zva%v0=Vs!!PW%RxW1ORYs&l%vPcCc+nc%+~M*02zPK=osma7 zJ*jEVm$pbBr7b>*eN=b%ZRaf@4b zQZKB042>7kjQe~I6a{#t_XUy+}a{(oMdC{d&9oiVn6%Tu6K0(#6Qt{+xsv>Gzy8gnY zrlCdby`MJzTvn4XK=5~Z^?I|qT{sq#yE-bF(%qJySc z`ovSU=&>}JfwAD4Nml|Epl@Jkl>8w)AV}1=27CTLmvOGPwkL{5w5)_lIcT*&J^W=WE)9&@`DXDEOC#0#j`K&(x1|R>x7{9P%sR_5ZqU{oFzGJ%?eN7U78zup=h=nbsoYvt>ZuX~AMdQ~ zu)HJ`#9Q`io<-G^p7sFYRb}SaHGcNpsO79wsX-jKK#`05dZQSJ%^UZh?!#*7KMbb+ zi^2ZOxCa79nm`SSjfm}IH(1LWa_E2@FnFHZ{j0#`uS;AWVyQc+>u=_aZGRq%W`#~H zymBh$=(1t>&mL8wS5e0L{pjee-os4ZwDV2e`Z7pV<|d8r6MK^{Y&T$zaHbS@%bGCb z)V`ARSb9{-xk?V1%x@k|ZP>eYH09oRdd8>tq0Qf;lT|t59$$PSU5k_dS|9nEC*~A$ zT81{v%J}Hg#<19@Awu%Jc<#pTqYtA*9Fk6S>*{z`2iP2aO_vm@UwouFm@&yxD!(N@ z7GsbDVXiUDFeKdwYdIyq)c`dQJ{dioZKY<@n}1Zr!xId>K<8o4 zkX`j~)45$vI^M4&GY1%s5G7;tfGA67YcRT)Sv?k;n{5U|d3E9@w^j6na>vT^AG{A( zT)Xp1ud4m0*`N%<_xZQ&;oIb5;JeAl*f|^uXHIc+23DVR&@zJo__amN+|0&Xu8xI; zREn^N_~#ZjRvy(NM+pb_Z(yuTVUnB}+u;163{thxZtQtG#uA*47Mlnq3)p`DFxvj2 zhx>|hf=TtAo0oV!>=J(k&2ZJn<`c}T(;V%Rdc?d9>f5PI(;oI5i78E8Ds}q`);+dP zui3Ee(E8#d*Umyi=*8<4IBp5+y`mFOXt^)jRiumtl&j=&w-sOU$gE<2VqW9@GV7zJ zL+>%Bw$g+k!XgWZW)u@J-J@?MatnQGp!O}7(n%AIAX;Hsy-{D_*yHD}lj-Hw?yWCU zuaxkV6TIj{lF{KX^oFjqf5?kZBo&6!++0FzP3s;+1T^1xc37`zWs5WQl3}A+k?ZKm z{`$@86%54?sODp)VYm`{Q-hxOHhecAJfMU#e&y#GeXbDR%o#9m-!&hxeWT!lp6cZR znOM8!@_cidh{n{tcO~7npldoCopx;NsZNW@op19uizQQ1gw;`NZ66>XZ7|j4Su0p< z;rA;c;N9mhnn9JWj(AO+^mYH+ni9HN@3vBx`X*-DHgxoWXB+=T*CSR|mQX^9t8%Md z>a~h*sOK$S+rw7(fUzM>H2mQB%m<1i3@mJGm@bt99mYdgf( z$?6RU-<7$VxX7Llk-SWPY>?Q7RtZG2MT_4Pk#v9mtbbs~)c1`vsOlgv{oGb692jr> zjPi1_^GD+?F}a`nI3Kvq1a%k{`EC9glyZOk6s8^<$b` z-#qKJoZv^>3y-Gw#Fx2@(!yX3AZ&wD1I_Ikv^0-3iVt1L(+fC$;gf{mt>mncZ@i;T zS=UJGMCoN_8*?8{l$4G34x-U6ut-{w0wkem#kJG3{;?^s?>y3#XotxQ>c4G?g=j!b zMSoTS~)Pl}`Sv?`Aw z=yIUeKGD;(8pZ?_B16$$r-0X4k{FY)&=F<4cs2f;=z0I$ab7Req}9zsnjq^}Y-)rn z?HJwA&p7`5XR^NK`LQcv0j}szSLpgw+CkrLf*4jJT2!-QAI~*}{s?f!B3}s&p9~91 zb{6GO-wkSN2&~Y-*PSWBZ(@S$3D{FD=%R){Rdp#=lRTC`q0;>8s80=1%I{a+N`JH8`B%y9b!Us_G|*#5;^Ztg3$Y zcU8UoS#YK0M||hyR-#$euIuYvVB%q<(4Qz#J_X+NJAZHCi7UAf zJz}06y#Bmef_N}ZpfcUh|5O?k^N2Q{UtRjH{6WtAnm9LkifqkM6W}V6ViOFVjsb!; zfqTUUKB7ogjLuE8Gv_T0XHx>lVxMv8_Pq@JV4Ho~87?~GySemzt|!tel==hSy&Q!OP_fB}9WA1wZb@%#ZzmJ_47V)1oSO+NHSG2Ugz8`JL(bzwU)4L=Z7hLJIva<_&6m>TsDjHI~IRR z{_!GJ!0-v{!8Plb79^^YLN!`pBNIA5Z!p)q_IUBD!o8LL2ZrCArnoIihXiFWiPz*L z$Mlo2>J)7p=2!Hp8ls<@`LG-?DYviC{~+~^P~H8h+rMNrjlC8&eBkX+KJ(~D^S9U5 zu zIHS{r%>`RO>3s}GPTVKQzev}>@^;F3$jN^txY$pkW9lPrIj0(VmN&*bX?ewWX-g_0 zuzWGsy9)D%=2W4jX^U?+)urFQm{qxdZilq_6XKZH?SmGw1Z7i=&&98dVJEc1-zR)hbnDm@iGg}X@ zdc1o0dwnCp%W(e4re4h4d@WrSrKi~Qf=cx%S3=L; zZRaR|X&RHNRwMm70WlX&7BVe_U8}35Gp6I|HluvJ%M3wbHh`dx~Kee?n*N_VNA#^OzC& zT%T5=Wmv(O`bZn5V^P#B#$sunsM}BkCAld`Nhs}R(?N<4_cT@0vuEVbIy?wC z?jKDghP!HuhA%uZ(J3v+Y8x!YzOA9fH$MG5zo69Qf#z3K5Iuh@-d`tf;HUlFml=h8 zzvYXf9j|DW##Pe`C%Dt5!t;|Chk`L`P?`sqHZ6Q~d1PfZY@)vg`>4ZQ^ru$tz$&fZ zwemL-wNvhBhqTx+5$SstB2JsxQw|wr70Iy&aJbd(ygKZFAY#v2I7kRT!p1$vmwSRY z-sp8p!%wxfjUBCiA=c!6YS!0`%D6#lvtRd3*L~&YAhRMpHslEU+9)FG`o7ctr=4R3 zWz3l#WJd{Es4zGqS~N4y%gWrf`u3cKKVqW|IorvB<7O#X|(5oUn}@vhy`&_mEa;ljO1W`FMy z6O}oH-6e8j^HnA0zoYx_rt!D`{}B^o5Y)~uL}CVG5K}uZ|EL{kQjJRftd8;g>B?5o zrFb}A(@>H7Ed@SQgeSBmjMhMTplfLcjij%{?0b=_B>GWJd0T($v+E1*_>4xJTrW{R zlfCQ@go8K9$}mRh&3#urf8ALQE}q&;JM@xP6%(4B4sPh^+{3x*AwjV(v^SqzMmJSQ zn`yibI7@Btn{a(OwA@b(90E^*u0aQ=0jH(CKOUYP?-#r+m85lon@M0uU#%)VAU;W)ecJ5+&bJ9 zsVHEq_NJA?pvE zz35!{!iqcgD#IAQWaD0naCA7Mrz2v}A@=G*w@;PE^zHQ1Z+SHNG9((jQmaJU=I1DH zp>f6N4xjgS(Aah8+j4@($rJ< zB>LLLsphShn3Al#I%yjtSN-03gDA8ra<9on6BE&dA%Cb|ccxDILS-dcvuu_e+*7Z< z8a65ZkY-qhzW+#UxYF=!rjUC!jq`jiEq;a1s7aBplTw@($~7|9H$a~57G)5!YOoQG zzQMCTHl-O^4uS{l3S8@V+6*L6b8Zdj&b!^edwMSOLrBbq9+fP+7Cp#n@wb4)v$Sf#R=32igz~X(6 zKX!le$GMciUZXi?ViC~~(+iMgw!uX!HOsvmt_0kJFv)0xJhhSFk0**v*ZfeC3Rj#T z{Ww2a-W@5sv)5UR`_{-@*JV+fIokI+eZCYLQe+i0KYjFRCEv5!oTsv))NakRp^<_R zw@t<$Y7{T;XJ}FnzkD|kpr|uDR6`lkfZofSW=U1D{w2UsqH=I+s54ELladHQ@7p-@8*erE!o3y5QC1 z)Knqke3kPm+Gs|5);UdtZx|>M#^Q2g!pSE?Yrs=~YfuHbfo>n*VZ7_k%&u=g=}*u} zH9FQW=>8DiHx+#N25yMeW1$4<+z!_iXk&KGbgv1gSXQJ^=;vOq)azm`G8Fx39D`1} z?)T6^=~b&(+XF?b(2o9u{T0P#;s+_1-mid^QFB__%8uR5Mg!i$@9R_h>4YMXLT)Qcdjy|M&tM+C7WZB8QnM;-q^QfL3a zCW_VZe;Abf7lUcN*&I>brL-^KcpvJ$+p~eRmkT`*;z3+YB*gSl_ z9nXT@N#C=-3BmmbAs7kRC7Aoi{PX+U^4}8w+vnf@^!~p2ZL)EAIJ-N-t(1rJzcc&P z5MeoqSiSk}agUqxIq$!N`Vjp*|Gvk}Ee2bqb}1>TOYJ8TUC+5l8GAY@NL^6UP}r%g zfY~d6AJ%jachA#s!|&tqCnYQ-Tr$po?AJScyI}6vh4H}c=Y3A<&poS?kMF5-aBt(| z>+?HH{@5d?kYyP4*!3TLGeNT!E}$Q~(LI`dV!Ois|xU6IrIKF}v z#{>={KEA%ca{%rkDx5X=gX2I0NDUc9-aVo02W5( zFJSay=|c61+XldR#KK~9`vEZjm|QXe@Ff9v3vdIF07wFu0kCwiFc=S809c&ZGvw88 zznCns^osz=fKvcN047I_KP-KW$9n*%4Sv%b04ByWCT}d>0|0kGAOH)8$!rGzqfZ)u z$y*qJ@rB)Eb{Gwqi2m8h_biGRNY>@*6X;ya5>^7CydCL@=?7A3+2f5hSG> zfoWt2E!p-?Ng?krkC;dgqKjZvug&PJwq3rwyX7hje`0eeV zKO!g!kBShh0d7yN5Pbv@aRswNZ)X2I=`w=gv9>WD_cfr%4~H@5_ zWCmF<69G}+4n>^>UTc;HfIk4@{p~&vCR7_Ba|Hhd?x9Fx&n!X!po0ZoZ5DWCnIiyO z0hfz2%2+ko0)DpxBmj58z7Vhg0NLX~miUbTHE@HfkSPyP0neB$ zG5#SB@tEv@UzQ6X1E7%&@_-Fw%LZ~_odi4rH>eVs?}6X9U;>{zAs?AA`W*lsfX4ug zm$hJmZ19i{CTILGU<5#h=OchYh!4xRI{+;1`+!ye$cWV$>@a_yz(4TLEC)CQ_wNDI z;0C-XZGn4`D>L|K0hzL>!2JT4z!Mt_US8NFYWtVLo zgxL#7h46|1;F(z*@EPoYZr0P_2g(aO@Xi?m>Ea;1oA3|7p33y<74tNYm2blf=J`_xl0h0>=cw&OMnY;j&0H71M z0w&0p3EoSlQvi??lQ%H*Z>mc%3PH*Rpk+rxaOD=@oflzB6Nlovg5X^npr{KY%nms) zKCFPSBwRvR_sk=#Ezc1)iya8tWod|W*3a435zGk>7tH*9N&mCI25QIK(aY=HUv8Me zRONoo#}{ryU44F=0$3*-o^hC~5@5Znk1t3RS^G~14Hb1&u+xA*n48i+-S(*Hs~Z|B zDJdHn?cAlVq@lD^ZMUkbnyR`QWd5Hk+11Aj-ZCWdpW*&?{2w$iy5KGQ{~BF55mz5K zDE&D8f6D8EvVxPNlbg#<1t*0-qMxtdDHjDNB1ZoIPcF7N4-XKCG-8~{B#LYz{Z}_q zfBQKI6aD2|?kaSPuI=jEp$hd0)Lb6HcW$n1?2(&2#(HSkK9E6(83~rc$JQ>j*?wHK z;O;B8YkNvrPUKelYK?!`xS|JZYr8#4`Rrr57wp9iULZ)7Vok+(P$+@ezfvthLRdU) zQx<&}$eOy>5?mc1<5a4vuUxa9T}iu^_2OqiAJmSBo=U#qisptCxjf-EL1fL<8y5!g zG0QyFKMmZG0*o->^UXh3`0@7fjGE8}GIYd!e{E=p8(-BKxTZay zCW5d$Z`c}>(G)t;MMAjrqfF_6?{GO?{iTidC(|!4imlfw>{vC#tub(VT7UByH3%hc zPi02p+JYJL1C2d)_LmVR8<*z(F$MLM5EUTwKJ&M@+35~S97!5B97SdKaar!$r*Y@i z*=kLmG@AY|l$P_d*nn+Cta_Vn?e2_Khn^!Z9GCC^?7yB&S+g+rI=Y4u=}Ao{9xpbR zDLwyAIX$xHq`BpM*e=^3H}Ng6D9`WKaeCNt9dt0h7*%NS@)7OWNd4^_4VniBKEHm# z@lo))LDA>;5xXx6j=s)bIH72zv#-v?{-#4j%0kBH=I`R?B7FlIr3x&kK6|A5?6x&~ zEG@Ei`-Xd$&k!fCOdQHO-)-G;llRniJr>j6&Lh|KmB|_rCx)4C8Q%3`7DSR|iY zGfCW9r<9z#M=8lVFZO$Os20IBD=}YNUG`{M>YJ(wT^AG5De32{KmB1p&$FSq-r~JU zMOu&6u#tIE8B2&-!=rwPV5=5;Q&$Q-A>uclbZv@p=5rxkKN=(EPKgQN)wFKV%*71WvCJ7=p z1Ol_46vo*NCG6*mE)UYuDvT?cew}ucNX!?~uFPCoeqCJZ#jC*~dYv9jXq!5*c$QIf z{gVUiF?4L-wq7}reO-wWW8BgkDbhBV#cvvANF7+?b)%&5Fxn@`{&pdM^ZEB*o*x%{J|%B-(Be*aew!$3;qA$HyFhy%zcE(0w-Xkw~@Vhk1XjN6Db2{aconf zlA1Ql)r(FW**7jsOkJ2zsSQF!z>GNtbeyShmCAiPDF?*vz zqL}d;Lo17;85|aCr8YSr`?4R`N^`^5F2Qtj+=d1aSl)XoFUt9>+Q&fieb6jH=YP!ROpHO(!d!`kYZJi&V zMtAOT%u+iOcw_k6_6<6w*_%Z8YR}M_B@8vxkAzzA#2@jO=Lj9#YhtT)OpqA2+NsuY z;7)qc8=o`Q{*QTe_6$9em$Mg}H9kCPtFAHVBFihFg!vO_X@%h9m{Gb-0D++O=d|N#CcvqP}=x z(dpsKxMf0AcP61^oPlPC?eEy#Ow^TK6JMps+toVn)4Vs(U-+%cT^`1?eWoc&gVn;R zl@Hs$MTq!1kaF&R7>ijW6PD@rQnxlRHX^KX(%rvRZmy&gZT~e%}%=y}kZS zy@~U+QDJj$>yNMQnZzqS$ejCH{4na&n)!0H{T0UpbxN~d@(R(bXYis zo1b?7*WQPsKeTVv+x+BDGdeAt;{VBm^XrxPQ(0!GWQ#Jk+3mGlCtkZpO8-^<5;z-Han;tHHkWON@1g zdgSt&ELZ%dXC?1#U!eSQvMyot)l~IFH5C?|ST)vEaCbp_lbI``*i;N zq`k~#{|m-IIlr|bEmU_f%)o<7L-1og;{Su#H~8WqdK6DF#6W(iq8wpg4!Y%-xtJ#T zUnE^JLo}HqLZb-c=}Mr8rb+XgR1x?mIPO`_b*?zwHs5T;>rdz)gTsgcq^L-ci~uDt zP6-0mw2Oclg5-oiTofQlz#$Az@B97#|NbTeL4hz#C>B~FLV_@mMo;f~IOD`rms2eX zbdoDdw1nf^nUbKo@;!8hH_i8}e}(-=`n#;VS6l0v-W_XRLF~e`Pb}Wa(&5xI(PoOH zZJ{%KXZxkVi~M_g&*>jG(cQo{{;sn}mL>3omEP;{)}w)?{J5Yj@54>jCYrM6QhyeO z+taAX#vA2RmeP9=19=wTS;LjGV;EnKg1t~lUBi6o*{Ce-DiB!Y5P*$~D|7-hm}USg zkO5M{;@|+N5(||80F;agi2-83SZEds1%iQKp%^G72@qa2&*Sr{eWYJHlBHc$%b5~Y z-m>J&RRkYTuP^x5@@^ll-_DY9|6TY?&R;ejPY$0t=k6K?|6cvQpSnj47B}>d=_Tl* zx;W_{tMOktpL$FzKmHb0zxp1pVh+iisnn*@sTm9bx2wzU1@&VSCWO+&xe`u@+IrTdTigPWZP)NMqWdk z%PCDRU*=wPXYsy{D?)!~_`Nsqw?Iut^x=HF?0Qp64CkzMnxaenw$=0ZyUx@HEPjkz zxuT1gD(h*>e+9gla+|)sxjd2w^Y))v&JoXM%xOQw(^)oa(mp58I{6c2RnW;D@&RV z(oM(iT_OE&C-VRt0i9SI{+qPWM!!7{F{uCO{F9Zh3Tj-DX7*X6xSVK^{VJ*HuHRx* zn4gL0!^4PIzg8aI>;|$Dn#S$KXQ7Oyq zzy%|%EMg;Pouk!Bum^g4qe0+Iy4Py!;rpb!LwzyiRK zfUsapSPKdQ$8fNa#1s((V5_B@vTou^l{JOlN?M}j@lvYt1$aOA(P!~_?0s(4Zme|u zzqydl>1JQFzWVyeB2PwtFZJ!!U%pDa2G2(Uyz^P=?QRcDd8ID^xo$oEH*i}*YVb3c z2pwXgc#l2qF6*y%$A|Ym2z6kO?TDB7`!|Pg*9-rrW6{VE+ijmKuF^ac<$gANyW_Ui zjzzxBWbfIsXBd-`x$#pA0J}l6#CQLSFvQF6iU#9~)H$hZ&MVHq}OKz#t(2 zBpN_ioq-g~1Qh@;BI4+RMMDAP=pi_1j0fXJ=WuG zc-FG7Ra)JxMWUr@RJq4dm2+Ypf0N(Sd7hNMV*XveUV0_?=(pT>4<3}Ay*_+X zBSiLw+Bo*wTqUJmkH-0EG|9^?L!fCk)SQ^;Irg=2O*80wPG`hUb@Dkng!#HFmw08f z{I)VVRJP?x|A>nbG+NRfQecl?E^ZIn%#h}#JukC>9PZ>rh{5=+bgv?|=V6&|lqogo z2}uft_Hh&=fop^q?gNkmk+=X60En0XfB-07U`N21kR}WTg#uupSm+fB5ki3=s7N9b z2!w(wWz}_D>zk=kMBkmHq_`^S7t*8@H~Rh3`iDf>c3r01SEgf+@tlXJf3oj(%zG{m z;%=WOZXxmbYWipNdMegZSabGj`$Y90Oee;kS!$JP*40Rr&K}{)N{58DuG%;Je_QKg zw~s!DBai7qJHCJE=#9h+K}OE=mm}3dXb0g>mw~y*>o}%5khMX*mgW#z7RDpbXGN?x z?+97hc%7(*3|W@t%jmRwbl8Q?bSVJ~;LC2J6qn_JLT&9+k~g-3Bf=~d6e=P}5<^%d z3W3~I6}12ff})NgEKmRc|NsB~RtCXG%~D-O{Yki>iR5~mY;(UqJ!&5k<%#)MrQy1)Ux^?4ChoFE4*vse71x9G>jrPx z?Y$rGoP%`ywIY1q=QCslZmVxXPGL1VZxIkHe@ahgxaaO~JeWnK^7qdUu6CWApBDIf z^6fL%Li1mz+FAQZdj5H8V1}P1w$cY@2%)y`N$Y5IL=w%$h=O!yj^m6}{mZ}pPw|a~ zG@}v3N+wX;q-?Av5fu{xL0|%)m<0l00HPq65)2p%g@XZOK-g#&3I&9LV4#>NQW%uN zC}q-XeS7MrT$Qcrq^qeBQlv@LRHzT0{hB?+@cQ)u-yGb2{u@5q`m6ibkD;m$i&nxF zk~VwvYVt`W&9W!lAJcq)<7@|(+&(kKKm1X;E(*8by4o01^^N~UWKNQ4Ny29M;fmb1 zReBdV-drBY;Q9zLxK#nakJ6yP0R+{W!pq)82@R3QubPGSm!8ALoo{+8vu)HYx3F(s zsfYf_Q#d&2m@w&N-Y?E(_$<)0xag!~I;kdvQM6Z1(V+Rcqy#DpSXQ7GC<_XLR!9ho zQ4&%T1;-&y{{R0YO{;qAt!6>uK94)$NajZJb%tIOtrqh!xlXqsby%ri?l^f zj{j-`knp>Umwf#TbypB0x*0IA*)UC2BiY}L)*A)UK%hB^04azQyb2_1;f$B$^e8;Y z0$I(mU}XZyPM@HS4LHM3*?eiNb@)9_F(B5YCgRf&T~K>JE{dr4Yd165tIXH{005Fd zpPw1Wukm!URO6(E&;SZZ|9SoT52XF)19U(N-~vJ+F(T>`1po_K1_4Aw8cbm^Qsq&R zN@;hl<$fS@VtAnO%k6f${`TzN1Rw5W1yZ7-xXU~S}?>-*I0>J@W1x||R_xcY{ z?bpEg{lE7nnD}AGZw3JOX>BvR@D>=cBF46V`-DUWr6WnzE3R$nC-cnI1;%gdlL2zp7MulrDp9 zdGW1oTgyy$l4y-N|23W?hjwU@Z4#Q_96UF`SNZ~eUXSh=AM4YrsqB?ie5~I;I?deT zc+RFHM?a2Wzm#0v@npSCZuMcfEADBoCM3zsC?HF3|Ha|ha@{AA`hC;XYFWX^PAl?0 zd<}Ao(?~T$t&Bh>uuKSvBq@3T01;RMXw8s`g=P~(E=-D5aJhKT#~3;^maiM%7G_CY zdix1;YW}@EZqw1aLyq^>S8}a|(Qi(EOi2e{w3eX>qgMiG)=|Z;eJwV}BaN2bYB+;cdbS4JlC&wzC+=FC=PfO~YF78C+Pq5rl+;Ee}o}2=58NECFdF z8-iC2V1gVbEO8=;AQM19vDv^OY)}9H|NsB~P71+5u~0A+BLxycK#))*F$n}%^__Fa zUNXGxn$}%Q%c_~IwMvq%193+U6$38JH(E3jU;kvg>WyL#~^>RFg>4V#F&SV4Rlk_xoE`(OL z(Aq$>tb7=KqBAVc$cfTc(i#f1d>_AV*L%T^yn7wWn^tpk7PF#UO5`|#{PBuSNWrUH=TF=Neis-PdfBmP| ze@_DF+}AEzl+d5UCe_~Nx!CYatibuCdAmKc{a*0>NO&K)+lh`OR}pFRJo+Q__K2)$ zm6_N8NeE)SM=YEV0-TB1shzbXi_@!pc`83dfGkDQu;JV4jUNvLE#P=pi_3|9RqIIQc% z)#SNa+US)fQb|cJdFc}X+U;Zbeor@-=c~N^^HtSG>wQD#m$Ry`jeBbAl|8-Hbh{PN z>m~oEUD2zJb|`VFXfE6Dzrp)Ya2PZ1h7hm+at;4CDJAQKazf+r@n17s@k@*4G2J~} zeEvI#Hz+NzbD1Sj(DC#1z_fxLI>~R0fCfDju6np(3OhgnqkfJJ7_ZMyix>ZukTLIE zD(kqURU+)W*eJvJiBcrfcZ(#MPXPNXxX7xwhaE011VF2~3a*0I&r? z07o#OY-k%10>MDA&@2=Zg#=5#vVmqPOGv-OQ^O12j5R_d?^ZFtvXzw6~~6m?a^Yhxct(>E;-&Rz@9 z|A#FVo{EaxCb@uh+Plf9yd|{2dh6V~*aCqPdc-3MfwjUdvh7ZnQ*JFWG)}wZY&xe# zfDCxKx2262miu&%b240SWvc04Gg@yjN*}?LB%}Aju6t@VI<4|PnRqAC zF@AT4a^ER@@m^6%Kga+{09`O#pp<~3;u8YM|Ns6<2FFmK zSZFp98A5|0ph!a3&2`TTs^XN@N|P;hF;JIDYvbUpZUlZV$?jFIpVnWtTy|M^h2H!& ze0sibw14kc(n{-J6q-pkS^Uy(n*Mw7m$e-uK>6T6bbf{Q5B^5t{0I8%Um^ zzNP1ADMM8@-K*mRQ`*~_E}~SQ6Q^Pa!~YHAx2-LJh_i^)hH6~?XW=;VhM++n^LQv3 zTdw7sD-Y2y|BAf}QR@ScF7RG#+7FjLri8ebjzeX=?Y&2@>{~=`pW0iyjTJmZ{@HN!7Tj*N34)P*UnwuXF#tG4Fbpdf3;-7(oXf;5U_=P01d_DC2O&=W z|Nk{g3$$iND~5ILl{G)mB68))hb{|_$}PFl-Imwshz0@Y9~4~w8(%p2TId?W+-D6# zH#y>>T8CINqHR2{#ID}8Iz9j{olo)g{Z@V##P@&+1%94Ksw+ux@-C*@yQM&-5*x{P zXrE1oVIC1|Sqvnjz zk^xhTv1P{pTj>nI77Ca)z=jdQrgi|iF%`hD0Dve0a!3G2(t^edlx9S!6s=6-S5>b( z0|3p20iysId1bl-e|`T#0XkfYC7qS!aP*a4t)y_Y-y#@XasDq%p=%9fFK`1|RqWU7 z+kfS%Gv;s>WwTCybPaXJve%8x)#Z>^UszA)MbA82_BL2>@Fske$}zw=D{6u&U6Nd9O#2lU*+{W zV0!T1AC!m(na(Hx0U!VX1;8F)5*4jL2}BbBU@;)EW2gWqh~Obk{{R0!MhiD2P^mI8 zJl1*o=QVTu(0Sj%q`_wKYmareixmSrSZ`yM6G;y5nn3wr&L@gC}_@-bR?st-00+!;a(tydh5;ruSo46N{fWBuur}Klx$X_!pS%;L-r-ZA+G4PE1;wBW|LdQDdIkCn=%IB(r-Q zZaUgEtkbJqBX&nG37!@=m)+Vhq_}nr^qJ}F7Ut!FybV}mz0SjzYFsH%65Y^JCI?0$ z;oqWbj&TailCnibGg39PZVl`j6sLx2!R8?YB6v@7F|tqyTw^DQoCk1_00jU9k|QXp zM34o*3V|UwoHDm%h=Bkf@wko1f5ZUd1QYP>^bKOrhb#oVDP<1P+4%qeS$w z<4n49wbv2EKrS;mq1RT8QsZ70X<=~B*)~W;pQ|PsT)P>@ZJH4rMe$dozv@U9x#G(b z2+OB$M>Y6uxwq)54)WN75)w4ciNEIXo&gk4?i81XEca}>*zeuTmoMp5M-eOF0@zzt zMZmSHcP{1ih~hIgfPTS^c~0d(24L9wCm$d5%;mlPjAP9|@i!5nxFSr}VnMvO4%oP0 zCt#D80e}QgzEk5nPK}Fk17fecPWqL>L0$;9{sst(yO0b`@rptJQUeM#6gZS{e#b~Y zOevW1h4BNNePaaz!2G)1;vfPf_Eh!M@_7z5aA_>R;_4d)+Lm%7{GPLt&W2AVHY=15-BMCUWQXqA;8NDMYW$_uKy8m5yH)#X4kAs&lQ2rDKwsne^b42o4Zb4g>(!MZ)1}ImQG*V{pZY1JrsAHt>kzKMVl}b?yjLEFiH@P9rGO z{}IG|K7@Dszj$4JKmQ*DGwb)KScnLSYx==2@#XLdntib{{YfK-_+(77k4R}O=qZBHeQ){M zLcL?+L8R0F#BmWEd{A<0ZYQtpF5eM=j1b{db)sd4sUvCmZ-8L+HZ9+W)yaU1c*j;K zn}|Rx@iXhM2dJ_CStd)NB!dVetmM-dKZTiM0f1cvyF_spy1@rr-#0L5@lD3VckKl| zP<;=#>qm^j%03}a&hmq>FZRV=qbFmHzOE|5RTxx(cppGx*M{^dY})Ph#Q}pc00;Ab zm(tMCMJvpQIz{h>7#<*r6IrplZJ+r6`vUiVT)W3<9URKzF1K2%nz=N>xTN{$_}$}_ z#v%UA=ZI1EBQgl^NcrXf*3iKboM__T-e7`C4avGhH?_Z0VVJjdto>X28h-zVTmw(R zMEigJYB99a|IF+6GG-Ngrtk!b=ztI&+-w0%@f)CePqA^9cQIca>uU~?>is2dY|WjV z5wcZV*@ByAf{~0@1ET>!CI{I{FHlG6|GIavbL*|EU;xWRnR9zo+F{2bzp|f3jKO-n z^ScYF6aQTDb-C;3nMOk{*>bI#umC>>ub+-A-}vAF&P`K%rW(UTSGA!-lFLfLj{W^u zl+|T|nyyn457{q2z)!+_tMsc@i8f#R@y(BwTQW1NsUXU&UZQW%-~*~x!QNB=P_8{7 zD_Ydq4qCFKs^9;1)>ZB+b@^}~2201Ke{M6-r1#r6tco7b!v-$>zXkED12j96sgo_r zF>SlGG~JI$!ZckHd}PBe2%F)*f)-3N^pM>ZJ|0OJnkoRybg(=}>Qz#VP;9b8cftEe z+Sf7yGCxSi>8U}NrUCcr0-7<} z`wODg*oLedOjC@cj%Bd{^VJhceR`@3p8(SZP+ z!jElKjE8l>Q5C7ShN8a>YvdVi$#vBp+{KHh2;4<8w+v~)*Nq0ZD||Aof%oU!vfFM8 zF?s9eu0B}&Nnf?Osc1m;4>j`QUt0M473rHAJY8?5T>5ZPX{~V-3X=Ba?91m5O-y?` zz&I2YKLSDw8;P5Vg=Ar@3z?{jzI9ygckwor+%iu^UW`(3mXJgxK5RBGh6joAMkf;U zcu0`wr2qeWpBqd4>YhJmBP3uMlRd+LrexH}uUJ$u_pN(mTYm8hma%cFe5^T#ver$P zGRSE{b^7&Y@H+hvd1&y`m>ji7DhwzqJ2wz2u0I;hO7zo@|MI1CCsQtAh!DNcfxhb z;Hxld+dzx^TV@I#bPrt&kBR*UzevM{FSNb68E#527+}&cAOMsOV<$b)e0MW5NVqG& z!@;HZK%LuC9C;sOckpKUmYdoUc1IKwT+u@#!OLmWQ1RG9LC8ktMbuh-WzhYD-p(|_ z1j{|XF&fBhVwZe4_>{lrkAOIneCD!hJ+o#pS0sgm~ z^s`*ZH8^iBr;e2Z6tTGYooTRzT4|)01&kHe2UjjP=iz=#`L*J#HQ=`PQ<%0=AHg8; zgd z_Hjf8zV+eXHZFiy&s~3GMM7gyb$704_q#XME@Ty$WZxF^?7~c_zRB-C$yL zMnG`Mw7eL!k9|jeXoO@OhcOnNqy*m z5YL=P?cJAXeIIx+kUPHdnDk6r2C=tMspimYFJrd_(8c=y|H{vUk7Iv#r~$oCA*`&m zMQnJ}W{-UWZKSIhI#>n}l0mlIZwbo)l$WI>PXE3n&6>6aUbBv;rQbSl8;Q(&2u(G1 zbRd&gEMj^*j*})~<6IAoOBut1;mx!EgK>>(za9LLpkh|YUshi!=2q zR6YdZ^29fC@2x1^Gejqt3v`2hAsaodvPDV`Ify%W(h$c+TF4`19$BUtN2GE3Y0$&@ zF+JrsqX+!s6k`YTEMnirzuNF(zSN?lwybxEd??U+>|Bvqk~A8$MoJAVM!x_5|6#g! zM)rU8{eS=L!xc_uU?$q?`6eao1wog_m`T`-RF<}sYmmT|A_n9DNq?;gT-IQS{ouyx zt%PD^4}^WeOQxduDl@FuAm^+EH-bUh z?a{9pVbEb1KUqW^{$jtVI8Pt}v>0Dl)*^wvf<+tnBeKWP-;ve%Z@p49NI5dp4c1{GP{KaXy4KNvuwc*1yYDXR~my zu!b?s9YkOTgKLf1{qi$v)U!bGF-DCXSRs+@aGr2R0BY|t3UCj$u+FMowpc#KvG3($ z3eB1lvxB0O1|ocT+>#s2I{_s%TRS2(h`u-0aDW%=Hv>_40I7$>JubxG3d#E9iObjW z0XPwjYn8D^Fr{2odXOtWs+&zZwUFyk$ZU!?X*Xj0lC#?&V!scPTn89ZIH?+o)0J0% z0$sbY`#uibP>emAuSYfY%FOCpZnZU~`X{SFwf6PE2 z;HvH;Sv{1;I4rW7Gl7qDDGlD2AVXLckZ!MSVzQN+ieHiVs0{mEB)74fYSu9hOiuWy*ACS8=HR++}+d)f;WRVgM*tmmAZb>Zt-P$Vn<5^J+0*=Us-OHBVg- z<9S=ilz8Wl@{RWF3|fd3dHZdsKI8A2@UrH9Q>B{Qel66iWEUokUqu|qJ233|dU&f9 zf8nQ#_3y*K{b`<`H~7!9U_`Ap_5yD~lpr4m%x%M958#N^CAc*G;Q$MpLGgS; z0E?6$0dremF!CDDCR2C;{J8iafe7M~ZfY#nH|}N}_kh8ue>jFV3;pixnIE_OF&6OA z+Vyw8Z?62ZMB_-K&bl*Wm}98G^|vure=PPwB^V0yR9R{JDSE){6C5yy{w5WZou=)>(DiauyVrtSO51{Ql;1UZ^ejHt6=&c zfdbk=-n{_%BnZLv5QtFu#mWfsSJ7;ro%^6?#=J^K2~cX1ju>vU_e`4~^8H9knK9WE ztcOo9vQy{KtNX^5#d9RJin?ylzFk#+fBN(zm&@80vckyc8MfMQIR|+cwf@7@Km6Gm zAQ%Hn3~oU@!ETQL`WV;%5T5c0tAZG3jH`Gm7+Ow-Q05uH9k$bn4w9e${&&R52?c9$ZN@?TW6Bg% zX*H=qCdjaphn007^*%O#OhOih3H>d)ePI8rUuuS7!RO5!!Gkxoql0sBR5*;Z=;m2GBR(J)8b< z;g&!h05s@l!Q*g4RpH=%frOToY)L_s?v&;riAV@^{fVAdDR>ZvW;(5-c%LB$Q}#l& zc>?_fe`M{o1EQ%g_EJ|vey^Yo@>5^=*ZnFVGm|Y{s&W~ zye!c1P_~14sROg6jC7vUJKku2gnkfg*kDv2r*XKIjr{_cZ09?;QLC^t=&=?uJ3{Ug z8XlcwL)|x_^5d_pa33)n<=PPO4{o=$=P}m3R+Xxy#`6j*E$wOKxn`KI)SXO*~z0T@w?ds+QnsA zZTX_5J5sWb;s}>#3vjC|2~;jc#cwON$wz&Y{M03pVo57|N#s5L?&eBl;lxX&a;~*Z za>U?iOzuya$spG0dv30IbrCA^E}8-)M8r{H*X`;Sfy@ohd)Fo?oxVleeT3pfUNnHFE`U%&5g z%Ys}QrRb=?`_WN+D&e!R%h_3fWY}rx3~Is}T4k)E%iAt@KR@69{^nAo$8w&Prz;7A z^(h8*o7jQ>C^5y~-~L1Gv|JHcIba=ZApsd|iJ^UsQq~@&0H&n7%L|-7q;>ruiA4C! zH*=;r1F$Vm^0+?M%pqF?Bxf;DbDpMPTdIYtsiv*$smZ7LufZ_@U|GrUvt4?dJ8cDEKl9PWYX`O63zVeaIv1Bq*T{*j$ax z5MbcwbS>;F1@5@SGFS@j`9L|ma;rn62cC#A3_cj3mPDK-M76!2P|E(+Lb+{GKp9;< z#kxA2-*Sa3zeeylGT+u*qizWt7*I}}_U{qoSG)i`axvNF`cAis%5L{o*P&k#jIH6#5fnBR?WS)4KjRB7Ther!3#1RS~r*d zHpW!6&6fY^>3MxCw)B2*; zIa=Hs|NrXt3duf;sC5aomaz5sGB8ChX8Qlf`kiezQ)GizM;O{+%da>wleB-l5A+*v zd7)qEzkQ-VxlLudI&lspRC5yM^&cvjydWePd`siLyg0QI0p>O=P_CBqj`})87g`5zW4x3-E_wD>EfE(@N%iJtJpJZ+Ecr`(s0>>~a zXpN@NO=&bdX$w+WtgEzQfF-*5f3MCy(4b-IL=NSoYH0@FYY=4=aoxfH9ekMlA<~!S zZZVu?Ri+ITC+yYM^v54FQk$KEkJMMLv~7Pb(@q_cABgCTccARc)*y;y^Ezg>F%q9- zxW>dP6c0$&5*FwxMTYoBS#}PC!{ohjq6AKCH)Qa6dCb&mbTw z^qV$8(#nWUOg(q@EcKz-A9rl=xKL-r2@qmVqjiIeTFYZuv!f>Y%*7+d;g9e;8m?mM zAXbz$ay~L1cH7VDaF2n~Qhc_)w{y~+<>I=uN&D3^L-mE5%##YjijzzP(&x9>DS=0l z8@Dl%Z1w8Q#OCF*}GdEuRggM zs!YO9B{w(CgMQyZNV$}oU#XR1-Mh6z{UWm3J~UrTitruR^JQ_w!Bi|&L(V*58l-iC zh2U&5cWbs&stn8y8q)4Ng;MzRhmHP7iNKJVe9JWrswxXOY|*oC z>EHI-|NqoW*7@ucDNSI%m@OK!;Y9#H>~#6EZNg1bAmF;Pd zNtXuw4FgVp=1*-#OK{ofeFRu7`5_O?V&rvfh`sk9#(rus!Z19DcY-@X#&a`_sq+Ttj!1-a$C%MC&Yneyd6C zU8H8fj*m~m$N#)AMnzg)7Zd#`4RHtl!=saPV<;LYODhwRr1H1VSIaF8x6d;2}lC-sGDA@O}?4gt_BYBMfwft>1|MiR39B57L-7eB5Inx2nxr8^r z)-}Cy+G;jlc=|9^RlarB;004kTaB1DCr>rCS2LGUbu*Ok}F1XkDek!q5 z6@Bf%;IUtuT=g3p91ge?MhQTp=?~rg_!;U1Vd=+}_0#=NRo7a>H~Cx=+P%5^LUl#j zZL%vgCBr4?RZ^;gh4r-6Mj4k*Xu(V&*?x$MRqy*Sgg?vCL&g>z*VN4$AqEy1$bQWVnlHzzkKaX~P%mOZS57Z>%H_jU-N5LMi zdcKmM)>R_)xRH=8I1T8u@DAqm+5iMVYjhF|j}8VO-Knz1i(I_J@)$Bod=9rq(@l`>0%g!+}LjQY=us<%RIt2kmZCfs^p#^c!a`CvgrB*{E}dr_ApV;X8Qw zAJg)1+T#WQsYz8eGDVFbt16Byx}<`&^RpenW-xa4+wa%_lmgui?%}|Ath1Kxq}i}Y zV*$EvTL0z8uwR``ZRCzR*Zzu_(I9xjs1=%HdCMR>&}rJ=QokHr968b`d9K)p=tkg` zMn9DAn}ldN?4X~)s>O!^^jx%CEt#s95>w>7ay>2aS>fFKQ<-0fhnthg8qu?K)W$RH z=dP400tTgR{+;Q%b3ZHG?@=U5%-hL^ru?`RRBkboI7mEI^6KwyIAG50^rgb@a%(%0 z0Hv~$GM*g68J0Lc={pSs`iHK{&VlIx*umfUH%T9bzSH{+%q|O=Dp5m-{SS} z|3~+nIL4(hZBa&DhE&Ue*<6-8Vzc$H|NSoZoWZ%&b~Znwzowr($#p4l;4~E z_(cl>JlGs({XfFEAvms&|MZ;TaQVK1W3C+cUQ=uTj{rD0Lm7Z$sPGTID{?XWpXVE7 z9VH+D5CaX(FgYV-qMoqI#Yf=aPJx6-E0*m)>TJ4tN6Y+c``>sD13HO({A{16=lGmI zT7imk#}7+C*vAKKdw25Qi`>;MHK7Ry8v+Su@bdL%t%S0I2E#DXgC)3;YTh`1Me+oTN76l1V z@i&_MHO*}qpXcHjE~Y9hcoHhA5$GDQ19GO`vyQ6)HfDjN4DsiS115)o$bjRJ7|pZj zhLxDgMyJ2xBLAG`COg4G;O?R-S0P<POtKLxc?<%9;D1=V`+of`;iT(R z+8HW~xlHztW-0dgH#rFfMt!6jO}GF5*P%VulSlAcbdQgqUmo8pR7|kk#!|<3nchv? zw@p8GhcEY0_irI8IWWEPmO+O!%1Dt@Z*vg)o|yG?u$qX$g|i{mSve0F6o89Ar`q34 z4pkq;)>NGpJa3zh&?CCq<1LYWNWCUCoLHBHN1Qk_oyBj}jh+-51s^vw(Z}E9&6d#5 zeEq%r9pAXx93Hp768;J3Ew3v19^*Uch7|i)Hyz2bB?=Q_ma$>WD&{51$~ptqRwh8E z2MX73jXt7c>L(OcQ^i*gk#xVZM{9WDrB3v#2t=8-vtWFI1Yism%h7ABsDBtMPq)J4 zG{h(IDMF!PueMWKocLPygUk$aNM5@66`Zo;!i|8Ny0L*hV!E7h0&+|{JkX83dVR8t zHK-I^u(n7mJYuk&RRFAU`tzs~dx_yy0B-Xjo^SWR-Xk_V*%Z9{C)28l#^rNM6yu&8 z>5s7Aorb3n^mj$@o+wi$bIEuKRGX-g$_O8F%RTHd$0E4IcV%yt&QT*?o6F;jZTI_b z<>g^JW8GTD6i}ljX^Q55r}z)~y9zu)uYdkcPs0YR7rQTcG|8m2Cku}Y=`on}Fl za6py$%F6glkE8PZnl1gS#0iz4j2mlfEpM}B{wxmb!zc{L5}sH{=Yr4gcErHc^gWp=+Dk z%q#%#iFMQ$WSD)AA|cpXtO*uf%g;U7fuWu}#DK@7MW52qLW0~Gu(*`FOR%Duro#XR zi{(sVplpeP62bK);$Z7UWQ?>)7s07Aq+uu@VqWn0x1v4CbCPngpnA}Sg{^}D6b27$ z02l}Zhr>Y~=t%e0CYM^wYL^?V=cE=O7WKKsZ62k{^NTkG#T9X@}@AHN>-zxA*5&*RqK z^0MrXQpwK5`vuIXf9vO}trCMHQaOy+u1bFqoJAKxEsMp*y(OFjAtXRMZ&SK1i`5Js z>+`Kw75^Jfl7Q_^AW?FxYaY7FJ8bvAqQ*KzGHg}1Kd#*=-q4JP`VR{l=`_Ec$@fj| zgJcdnJ$&x=_=o;G440~#7k~1IR9ev$N>*u`DuoS+Yfhjo&@up)qs#lT-SrohhvT*$ zGul0u)oW3GIx>!?7=)BCt^fV>ssI9@;g?&_*ua8#DQxSppMy2`zA%|^UA#NzxsrKVR2V}$CAPa?{dZt!RDO}S)qEAX|k7r=n%Rh#LhR4jSE{Wbrs@yRF^8mc!`^%r)5;FE+ zeZai6e5^McmoF9XaoQzC5N6YG{?Pgvl}kurJ-yp;32LNNs4lOo# z+CkbBd#(kIdu~)*D2$C1_Ay48+CfZ8=q<8Cpi}QD+5uC8*KPn07&?6?*ldsviE1+T zrU2Wr@CjjB9S5_iY>d`_*cLQN6?lD*Z}V8QoHf|Mi%klG#+~G?`?O9rNYo17Z-g}e z|60z+o{#(yx7y0nLyF_K(KOKxNKBn>Iqoh+FYn;rMaY3Q?3)%g##kUgzrL?z*!s*# zAN8%x1qt&0x%sSXc}fUyFbt%8nwpX_V(b`tE+U^slSW&R-h^s zge=?_Q0c+dLuUvbHLAL4XBSoDyY2p80`a$@xUaW1?y)E1%b%C3ns1=a1Y(~nBzMh=Xhzco8xQmct^nSy1jPJ!=IKnGb||* zD@PJhFC1WSH{Xhnd*E#!3-82Ew7b&5R8i;_oiFIG>+6kNUH%BXLx2=mvdnoPuu*(M z3qa-tPML7$Sn;Tr^gHkv7%}!mINx!ZS2w@D-`D>i70H-_vuMYt$_iIx+OgS%0CTCrGBn zVy+Y#cy_KiMN)G-nU_q)Dqv`V6QiYNRjwuf7IUP}&$aD5HU z6ELSSsy3M9+AaH48ai~14QqY#QGiWGHZXld)*7yHy6HOmyyhb`XFPxH)0+qF`;hX- z2-xXG*21PpH2J)M$K72+ETBvBoj-rsU?3w;ufjIO8RX$;nwgq!3msK&zdm$>6GgnS zkx!f6-%jk&c7rxO>8jsOe($-Z3yNVKj>I{qz5e;|_A1y4Y(!#mmad0LRvr~(J~FRf z7q2=V!{v{)D{oU`uif>?jKnSPlc0)#hws+?z5j@D;5_Ij@7@{)ALvfrpYQ#1^E!xf zE!`@L;>Ds$gJ|~-E)r&>B;fC{|$V6{9*s)N>g=~ zK`|Dx!1<)wf2r{n@EgU&PUnpj*l$blOniD@s&Saa`~B4J!&>OZ+dyp9U6r(J%#eJO z&1Ul71LOnCoo=_0oP~L-rHv-W9-Y0i#g1rXP1_>A~sn9fB%B~ zs#NUw5D}M#%T45@Ch4}!LWOM2!nF#szIB_yyU&;$%XRtORiBp~be-LR-01m&?4fi!LqJ+{QZR3b5Tr^Zq6&iY- zX5e+bOzg4updlA~3v1Jv()tSejI-6K(vNQjq@64*trqw%&8%x`3xo*0_=4|md$`Hq z;=&78*T3&usJB%*rB`)!^Pb%~?|i9e#P@Sa$osdpnm6b8L|#0}e0RsOJ$rt$tIM2N zeEg$%^Ej{MDm2EaD>yD%6d~vF-=2W|G1vwdHLm4-@{J_d8f=EZ;;OWZbNy(rcy( zEeB57`i1{?d3ZN`Gb_EbrFjc8Ji<8$rqDm5L2P`?ZD`^_=rxu4*{ymdm+qA__ajf1 z1|%smk6mYXNF85@9sswKS@ADd+|6lYB&RoPe}$cOKxODT{JA$p`ES>o~vlk5*5pE+*|q5I*|MzPcL+6fw{$ts|CfPw60Eg znB=G1r?c~A!#o~?KA8P9>%RA`P~0nXr}o{ezr;;yjlL(hc^|1*Vv`L$Vp|R~Fd7fk zz2qtEPDb^QGRStb(apv(>4(+Ft54{!Po3&)LgyGI1LBXC*e}h zgT1DU)*5qfjy@G5-rQo~@zm~n`Zu$){3hHR__7#ypFyjro@_;>j7i>M!V{UJU+ibY z8TC8&8UZ&C1pHp;$z(1QH3lqQ7NX)V=UV)!zjrB$13@tonIYl5w$e2ofM40J8#=)G zY{rXJYaK3XzsG^Kas2NuMo+uAMFGd2Bez3O$|6E8Z`nLE%4QFsHLXJ;SGFja`Sf70QW>siy7-#-5 zq%HLJbEmb6sl%uKO+hA%Z+{OQw(PpkEL5y-$Wf{NxKmZesIRkbVN|guei|)_vtd6}^tcBmo`%jIS0-E0ZdAp_1<4LW1`!DLt z|8`;-0hzlTwp;J7UyAuQ|J*Hq^pm35?esPA&-AIqK}`VZ<^P0UItZ&es!S68D&s-~ zkqPKigy3-zieEMZVCO~pX?8x z*qf@^RpM;>9qmtWZ2$b$UJAePv4tS2e)_L*+o2px_1L`>-Rpm+N{@4+jcHq)#sBF! zJU?GqFI)Ius<)kdzlPcWW_xFpkFPA;bjrp~TAr#o{(RfFo=p7(O{691mOp)V0N9G8FN%6FQsOt^htoH`PN&&eO|$zD)6y@ty9 z`>Z;lC*msU*piK2Y=3Ckx9|EnP3^u`)}!V3=W07U@nVse*GKG}KlF3&Z4@p4m8@UF zqpp?=7Z{bSz@!UXVR%mkS*#{BUB~x|6)d&5Ch$icd&soY36`TR!ihLf)M`!Bpz#%} zgepyHAePm?=hJMH9%;g8p=J`~KH}~TVYAQefAm^>CGb|He;wL8Np!Eog~ROAnq%XquVC3eGg!#M2VtbRaCRdyVC)6qae^tYxQ^KxR0 z*i(i;S6_M+_ESHBvm;roX&FFnf`WeBD$Z&`T=v_Vsk%HGn+WX{cu4Cz6u*Ib zZnV$iL@=;dcyA7#KWrA5te8%@h3!~Q9YVXxW@{@u5JJ(B0xbJ9$JISZCa$`HM|Mi8a(_?$tmlvplMsKdAl9-!LOC=P(J}%#gO6hQTWg9O^979LDyXvy9dM{S1wJ z>x_u+<0lw%Ci5#5g%A)&dncM~0~*!8zGQX#wR^=yg!wJ6j0- zln69LZHA;TE5FHRPKp&a57u#&T?n@>A=WmHM>dhR#`Z|%WoFR}M?AjqJzu910fpsl z;)y?P5_mS+9+%O2FHiRQ@FX&J3Gf-N0*?x=$XpyQG5M9R7lYBUl(ONw(cSd1sWsb? zXjTL=c&9t!bf8Jz_jQTK%!fsu-kHv`?2b^H^PQEs)T+6;xRW%g)*Ut7ru42c$Pt87 zB2Hany(c0$$jF21<*DLfEfTc+^W}})??xH}+ydx93FnM0jWAP_#G7STAU0H4J z83xQ6%ld0nyFe5P=je=iU9pwCC?HCK23nA;qYSTol!Ue4dorqlQs70nCP||94xTuG zhZ+FXLK!#o1sl5%_XFS1B>8L9q5D{sh)9CIa3G0eU$ZTcQ9-~YYprBL#?L$p*!Ah3 znnTMcy?~@em>n{5e^j9H_3H>|5NR?}E)y`*(6%*k@4-hZXlsw9_gMk^I3u3CLNnM} z&Id5M^|l_TO+nKc3QkV<@#nlrllD8}!GBC#LlcW`{+8rBl*BKcw>Kl>*7OtuSR%+k z+K&uo6EaCanGLT`YD&6b6p#sF`gbS1MR;7%+$(k^8}(k<(Q4_G)FpFHBFPYb28el` zgRsA0Eh>shbp|;l6v_h(NS@3NvcZ=#P!W#pU?#8wI-MD;_dfRm7P6GN9Tv>9L@|5-GCyS-+lIgka`u#m>;v%TQg(2 z;896%e1Yl@oOSh#JC*|SJbKl%^*$wTIc4)9F}|)?xUE-wQzg6`z&fQhei}uh^@dCu zwIlsNe2E9Qio((uw$JPz=M~^*T5^eAUCPSf((a{pw0l1SbhC1E9wGwQ$dAP0aC*+Ev67>bRd>4F`J#Ls}LY+z%jhbo`7@lw5v8El5 z1)fa>K0&MkrMk74M&YP=WC_DIZ9W9D>d!HSeK-ptvSI~nwKiYFYw1d0$UM*N@VEZ^ zvJmR4j^}0`OOE9Srcs{-DIPp=lUg9IRPe%jx8GO63BhRh{WMi`;Z zHiVBihvJ_ON(9g4kK*^(a~<{-3c5T-FccGugvM7&gfp9(e1le6zw7%I=QtU6;jBKB z9=BCT07e7UXGAQmUuK^|a1)Et2bDtKzBN*Ll*vi}nd9v+BjknX-FNppW^)5=3MmI| z9yeHHV9d;1da0+i2f@QGQG}W}GN_55JIgd&B1o@uk_<-svlvD^a^g>%TJk7F8keMN z?Y4;V7Ac#-^@vTc_N&`CTG0}aC(uIR7t449Lvqt02t|;}Q%nZyBqH10fFDnl=!SFL zs=&QbXzgJ|9UlK5)1^gV9jhIErKyC4r`FVnmkl$a$Z!FPaeAHkzStzlwS_IhdNw<} z6RGUjOjVJf`SZWHK!H{~$aH2wV;H2LAoi=Xie`m#Aec-k2FHH&I=DTJr@qUDNy6bM zNT^`Vn?dw~2UOq&)b+@^8>0^f)2vX=bOodeE%ZUEtF>YQrrs_N{l`L1jeO9gA59F4 zn+DM-Pm9fCr59F>6Sk&A*xegtR3H<5Y~0-|AgqG+cP^Qk^ZXoTn$Vs2LDQ<)y$(-g zaMs9&ITP1OJPbIXYCI-m!(04p)o0Si{PN#s`X#cRYS|&x{1oyq69og4LZIoZ0+7%o z{<7?&0Cz!G{CJXJ2+Wtkik(~)7_inAY!--qUkmwXS5yA|@PSy@?eZ>^-}e{B6az&Y zbXgPDfH4QA4NZUrCi0N3hY~`N9QgZ}g1$#N-4Lk$6-q!(gRfgv_L4CLet=36wf}rV zOlEck*EjLj7*UPrfFAsXOwxKQpuOw9e^ZwkCBK>Ld$;^nNwEXnlMN?iihu*wG@MLS zNZo>ErIp2IxZY5h^oP^U-HHt}y*J-=7C?n_nm~|f0&m9Jw|h4&x)R`4LdB`q)G4W9 zkOy_|m71%znWHeIzRsNP#{?duT6)>Ga3r2ElJ2`O<6#T3LZKjt8OtRk^!gCh1i$aw zXrMLSD}7KyDx5QL=*yU5^K2t`7LtCEcU{fz%X6N)I#=|^N^G9RMLT?HER*w<&A~>taNO@&<8*X zR$?&`MM%%2Bu_dx>>sEyecgOG*wtNN3db@7FE0vmqx?Yp<%*RXFuuH_k*6Dt?oNSNQrliV`GN9q7v~3FrLkH^GEsp4V zo$L%!>b^Sru4@B^odA*8I5xt=6D7IH_~aohLCmkrp@qUq*lkd^NkvRH!4s2SSUObY zXX!q$_C#c1wFcQ>WWy7=G~GFWl2(odO-R49f|hf-nQ3}Bc%=tvC2l)ume6Q_C|-?0 zgeS=n8ErJka>g{8Y6Gh}qRmW*`CD#xMKryTqS`cud|&{kC?1!tcnDN)eB{8xhj8Y- zV)URnt0U$Ha@W&r#O;bEDU-pXAuUP)hZQtr&_$3Vcx&>xA!K$oOUNth*Pb!t_ifr; zd-zWw;{<2bKn)zhSsp%A6Plz8$IFdyCM7I9sx-S5>=Ho=rNl{1BeOSowD|*GDR$uM z5}~nr!w?9RV6?dxG=kilXpug@|0e5~+?`chtrRe+2{J{vr-Iob=~I(UyvgfyaLEYG z0uC~+@4iSW^^P#?6Ty~_r@}gA@MYvu;cA(#>3Z-?@1-pg2{-6>Vw2@b=)G`)*p}e5 zgP_^zH@;ma=bo^gO6G_U6R`^Yajl4r~(QhfDwJ*cz9(&;#Xdq zGAaX_zgj{$;0ZWi4CaHsns6iD&#ms1y&buv?96czk6jMYKP^$Q{FYuhZ|gMdnMk6w z<<$%ZUZeK%42aE!|4#HCro`D$Fuy~gj!JeL`Mg1lW$Tg>dHQ2 zudM!1VKTwWEc5zkfEIQlXtn#snm{)c0Wu7#qnWa<6!byy+tS~s(eeC5d-uuB4I^** z?*Uy9%ivVky*4p(gxfPB7Xzj6Rh@b3%U8Z)TGI@^fSto|+F@*XV=`ubRP1SJq?mx7 zzCRY&thPI+UGsb6@|^O@f(F_5I?kTggL#4mtf{T~I78o{*ZqDoj}goUO9?KGsPy|g ztq)D?Awa^60mC!-ey$v^w|5pIvMQEaoag{!&&!#;+VJGPz?f+>-vh-Z+9vl~cvV1F z4RcUEY)T?m!u@B7RsUDB&;m)c33(!>1Or-QtX@W?#U*4&Wz7!QXs1zVB`tVkijHJ)lfdn)N3hFXl*umzqR`Urpq*m z4O2-TdxBaM)lc)2lRYyy#oJ`9zIT@8YGDZo-?WD3xukjOG z8%SN_xbH|9#~&Evwlx(Mnq*D>J?f)1*=XHTO~yZ!!lUrvZZ=g{0K~kHEtnb(Fh5CO zq;-Z6d0g7u+ND66vRP9Oe`-S7`;V(kzeN2|Eep`eD7Ui(tR<7_=zWXm88BBz7t=Zx z7xl5++ea|KT-KOOD-XT0nZP-etm^@}W1d*Ow4Zp)`#e?C+0@~^K$3N{y78?pQZeES1E{NN&b3Ew;fokG8}5OBkg4^v@BR|To-kKeD4 zojFz0y+(z%}zAQ7>1 ziI4;k+~|{ew2IN#l-G*gUlt`c-zb2BNOS+giucxr)>^0vEpXE3&dst6$Lc)zllnX>ytdm>G2#sW)9y$0-M^!Jo?BoM2Ti13>EyI~Zm!z`D@sJ6DnP>cT?@?HiV8dqb<|9`ihL;L% zGas8wT5u~U)Ye(-jGyAHDdsmJ*BE)si-|;5q}Qc)+mZa2_uGr-OD9(uYFu?tr2=&* z_L_gesjk~-c#0ggpXE4l|EppmY$=WJ!W4A?MiH)~3My7pE?yhia;+5GIVIZBwjfR& zKmLjX3bbx@`!om=+@SVq6Aj&3PzNmVs2xUVIg9Y+PylaW&ruzhA7&h$7irb{Wbm&B^lN z3$Is>AnY=R03y9@wJCG*xvi7MQmIq#l^|DyJSIYVry?H2>p^dW{amLdc<~8qOUj({ z^ti{W8@~T(y)<-EuM~fXx)!E!KtS`wJXovI)RIiJKu&NuW8_D1tPh<2m}JwD4byt{ z&5Foh7ou;@e1+a=j^o1EME&09uJ&9UZVV@GiwEY$Sh@Y!S-@noZrW&?UwHgqF!q)o zNVk>M$PU(o)eyOT6QBwQW7$7fO0}so#*{G8P#W@1KkJ~ln6lDpIe~JV2u=Jjy>P_R zH8>UKSRX>(JY|UAj_0RGi)Cc9KqMM(0&)X|oY16Dfl`q9=}yUuFNaY*|Smegd2(FSQb$eXIVOqL8bO@32bJ}qs za)#hcM#P$2t``s!Y2T31R?5FFr=>-JWJ*)ih_6$#Sy+W||Erol``H+@FWH>E0Mq(OCi(5H|KUkt>bAY)i_W*Hs z*z_t&qO_l;cO`i_6@rc0k;_iUl~=cfy%PA5R}-mR1K0wEr$gh66BX7(oG6e^V7M^# zp($jkm`}0;(GBl3#5SRC%{SBnf$>RVdwarLYx!?Fut|bCa5dwWrK7KI7u^NMOaThb z8$aQFx;HDFHIqae%2ThQ@OFUs&QduL(dflw8z!#X8HIa1$Z*oLfV`ME|l{ zQ?hnX%c=7&*8q%2`N#M3VxhZu)uZZnSmU=2tEqPVt-pdjP~#_YaxM|%nhzfu_5W=9 zMSJw(NIVL(Es>ov6sfMqjUM(OWHgWc0A{`Uv!iahi}&_c-baskfrG(e z%0HnDQ-k6V@>LCXvtugN-~;UsOnR3vC2sYyQZ6e<-rMx(Ra|79 z>|Po~xq~md+}+aZPJ+N{`?KcmBO2C95=VkV=2E)6+6m=3Y=6WBsgrdO?~4He<{WMj z?3o@MU0F2J^H35Im!ElAgDl7^#tsZ^3ba3cx~n;NW-`#L+;$^_W1KLEoDx%_xA9Qh zBCAsYung&oWcQlT6(;^DyRp81k6GO;dP{+gHfFJ#FHC`&ugo?LZ*EmBb)U=^q?c?S zDT7wB`%dz8(aWEU-x$6&zB=!O#3%uIwoV9(DM?E8t${V(M+2}{wH7Kmn1+v-H z)6PddYdac8D%c_+CnhZppq_0Q#v3&9C|a%u<{*<-FF({Ps>3?bBpxNweX>2a%vNnM z$^fSA+(-!11Zzp)br`|n;cxVh{mVcXH&kXY2mlCZM5AStdG=Jt#+MqntayG^O#-*l zy%(aj0O%2VVo-ng49u7|li#3a%t>HiM<6qoZ2ZYifGTXS6qT^y4>E*&)o`I8=I_21 z32%l?S;Br<>lw#!mQ(c-d)|Kf6kU}1)|k@Jied;7+@;pmeDL8s3r;^^yTBQYeDtQq ze$7Y-hpPjPij1!3YIBQjjWLsOo3}j&*}Lf!1)qwfCv53NIEDW)g^r!%mpCT3;M9Ee zq>rgt>+P=e*u)kz^Kjnp!s8~zI0aP3A`n~=SwlwcUdOI&Aq8X%%EdvXBMVA?J|y>? zMBctvBtIWn9#hMED7DY-viy-9#qF>2MidyyLD|-PJB6NtP4yowszhD*eu;ADnDLo!HOEbLqV%AMVco>Q7$1@vW>&- z52I9+3obDk+VG?b$;obK^#$7V;(FA4a3;Q;V-)xMz|ulVh4<;0wRr$jLb=p?#(+uQ z+`t0%qHnwWAhJD8?9=#6W&Rg6q4Mp=aJ#YN7%&*c8{!_iPF=bnj-+wknL@}dl^@0Ph~|Kuc$mPQg1&`C_r;k9pXJXF-20nRdTft?a6>ok#x zSq3^76i3{Xs^G556RnC)*@$T?JEuC|{cmk(IQOGL=;@SgbMG71j;stDmPCTTg}4c4 z{9JdMc(U`^X_AK!(X#%skPPt^Gy@)0)IN!bEhhgIS4}A{~nqP~)uCUqY zyk-A=J16*@^7%{h!YItvqlBjB=KoC`x>bb+f3wk*;mbZ7|LGy!SVwa+Nng%mtD1KR zb^T1NoZl08-<3HiE6}7JnR%ymzMUD^4`X*!_GdjeaHchURG6xz&3E^nhyXa;R-jRn zpnzyqBm~{2ep|J^uFo(A@3ZfBmTI$kTxp54nhW)%Em^Wjs`3{vzaLLU&y9%5j$F&A zH`~$jLj3w{Q`nbkJ)}tbJ~^RP!JVrRe98g!$$wx0YuL+MPTz|cyhNsbzbhV97ioPv zSS${vn}ns{tI1tyDZa9h4Qn7UYN6{Dul0U7#lvWy9B+C)aAZ}*QvLITGzyY4`T9wh zx!6Swm&T)Np6mbAk<3AK-K&PjFO5DXbxz3Ti=JlZ`JuoJy<;bhv+B9=>%ljangLBb zbXXVk2Bym>{2T;;*;%S;)l4mr39SZCeT(NWpu}UbaMH$0sg_T2P{FKkf#~lLYDpwe zF+5%F>4Lp)=N@ax`;=kE0%71Dk?lkQWKsrSTv7wY#;x!2A@8-~ugce_%@r|~+>eg3 z=}m|=qX8ceu#Mz0K1%d3SVayW^=qZpMImZ#NLw)`8z zsV1J}hLaN2{}x!ogK5t+GS=ns`gpWX<^6ET&a++7wre?{oa5?^Mvy7EcTK0%`d-W>-dIC{xgCE|KFh2q+(WCT3h?0a{Za%e16q*9r<2O&fPjj-}V6AZh z!>ciieoZS_U=v7~LGKlTxq6~K1nG_rQa}4dqTcWqsMY3sX5jR4x#BU!tf_G36tBA| zs_Dx}Y~rr>9_t{lc||qm;pGgep#IqGj45KxJlZWE!A4rEaQ8`@889XVb={SuY1uYg0tNy*wj?ILlSbpWa-p$cu|x|~8k zAZtY(mbgpoF`{KvdCw#_(Z^D~&j*~lDRKHGCE_ltKXGP{D)~?4ohWTqw$NtjLQh3G<_V5HIEV=l`z=>A@?pe zxdt_8N#B==f@6V)^Jb(#+aFJv6>7T)GFj1dlem=tUoZFLQu}G{H~J-ZE_zuT_P(a? zzLNJiqd{_;h4Y+!BTB5x*Qkt;S8WSTLRTJpzp{0e2s19o(PVBw)yNcsD-&0zmwuV0 z?%+8>gPn*wZ^%QXf;KDsJv|Syf}-|=KQxSDZf(4dpA#7cofH<`@*{&1FS_#X)N142 zZwcN_nBDe?KGK51V?Lj{#_X*;-{(7$1D^QU(+rkTrMLZP8F*f{&k;m6Xs5I(F76lp zBy8+Y!&(?4py9weJ=ccm+@Osy_pciDlb;e08<#G=cwqy67t8F^Id=aXaj~SMb@XAD z7VJ7uF0HZ5VM=&_#V2LARUt&^U!s7apPZvmm~#1F9|~?7Lpvr~b|2c+U0EKd=EN$&9Ww&|H>PeKNpI6Sl8vkD<-$?lPCO6`_N7Os&9vIf5o*fC~9fY z*XDFi&xJ%ikX(4e`{d2D<83k{s}XD4C(gAd>(R$8A_2N}8#HPlV+NP5*-QoN$e+|{ z93ZF2?(Jyv9{Xc+RnvxVicZH>Y@XE-A#-|OfQxuR{rW$zI|BbfZ9n=bcjq))R;z11 zO6EO%Bjsb%rFpaM!k+Vuj-6e`r|s42{DEcfh)d~GKonsj&Jt0 zTuyC8+Cn{fz9$-X47y^SEb*YQG_ze8^po)+5;ipYr$*q{Qhn3T4)Kz^zdW8|b_;?+ zVL*3}9VQ@KitqYoPEf@q;A78^9SIs46@fly|3NLqUz}Hc5mM~puc&owRo`&@#?*DGg#jE{ z_B0nA*x%Hex(vXBLhCG%DcyyW!$UuG_#-k%W9T6R@T^vq%F6$ zK=Iv?A0MI@yB8=XwS3?(Ps);JvtES5VfwGBjyrA81EdAwY)1Pl>bt%&&Sj6u@$5dB z*#0`q;RqC99D{vzAqC;Y#N)p`0sIuY8vLao)CP%2H>Ct2vd$Z)FOkZ&O%)DW|4$=x z?G_cL>ea&^!$xLD$HZ_yUU~;VwG^?nsJ`znYRS;L&UUSB?xK(+Q!=8Dx)PUk`{fJ9BKMEPe z=3Ob)D+v=%AL-LSQ!83s8S*nky64*4)cw79czkPzaYWKhd$;*tl*bi-BfVz=p{A4j zJjHH*d+YLiC2yZl(qxWFBZf{YQ;nkdic7Ns&b4TBrs7A@RLZeg7YD*9S$kY^dsz6j z#5Xs-s~{qoR&d+qg`V=r@>}g2SMP`Oax1wz(;fS-cgl{lo~l*tf?n~WFm|hWC;)@F zjJ&&%JOJD1TlJadQR%%2Q!2~I`PnZNqPotW24vuj!(AmEHiWcg@YNN)|HEAQ`hXjv zU-BqMuVH*t=|X-2B2>Er0~+fdVLNS12YYixOn|m7g5)&(Hzda4aa?g|W|N&JPX@km zChK-kbLSSJvq>#$*BzS!sMOOgy9O9TB}I5d&YxJZj!d#Uqcf#{$1y5rhNg~djqt2M zPlx-?b}L$0-#NWv**;~)917Swv+L`b8#R@e7J;3actX^l7hte1df96lX5bLdF+;Bd zclgsYm?)qaPv)&>*V!2sH8j#M&Fx4{h9t5IxcGJW=BFDQRv^_l(%v7Fn@{5tNC~{d z%V1JY&v@y6?5S|Ve(*x(l8NoY*ZUvl&kBX{34}bdH{U2D4?LBdH1}8lgCVe+^|QIs zf;P&#QvfJ6?B&h(uq=z|guT_9E;ZiddDmc)Y zB`jyCm;Oy?la~MXLnqGu@jH{1&b5G!t_~}Sn@i^mq;|XgP8!dmjBYMne}3__%ei^F z-^5@1KduG3Xp82Sbdb{(hkkAl{-rH4gwdtY^pQeK1OX9e?_)qV*6kS&-y<%l$lMAj zEB%o7Nt*hii@4Kg!mo{tp^u;D{g1jdUL>b2=B6G0_$xFilXCK(^gYhHy+(We`TcI8 z1|z*j%qos#`p>aT`xLmnLiu7~Fa4#et_AJDG4xOzO$PeFe!!e{lXEZ>Bmy3EEevpA z3dBo7j6(x+si@)H>a*t%S~q&_RChPr_*1xkca|!}7+uoO%3lUc{&yTySqHqw8hvtB zm3`!+)8>%$Tv&&aPqO$stZ{x@@Wq!aw@(bV&*i!5FHlNU4PL)ePU%LPUx^Bk2omcx z!?>gOX^Cc|^gj>X2;hVtO`C=x4s;^fZRowBw_$;Uc_fgjro;W*azI>*GCwIzmS5$P z;>NSE>l&~@iF*)k?@Di%%Bc1OIT)&oUrIBsUO=2I%lFmec&n@DHy5kUr#iQYY<{M^ zts$IwEU>i4w}IU-epa{>FDO8H0wCa@8@GP#ZpzStx~w);X&9T>KLUTe4ZAa*{Jq%t zd6ZJ{oiBW4aTp&BO*&qqYhUsEr`4$P*reyppv3ZtXCuD>q)r7L za%s8C+ad^SRVwbp}b6M${S7@i4y2@@joBT5; z6qzKrM2S6ZHMFm{S+_(BNEgVvI=e=%)HK8kAG1V-*}Q6DZc8s@vP&zL+ozd2b=y%+ zr}+0Q5v{L;rDl-Au|I za1R(*3nXW9C~-HgK|MXuk4VL@?4gHAy>t7$g#7by&Vkz(#Y*towi8@M>vO_@fpZWu zHva9>b7L?b8%?J{wg}D@NT9*>BO}s@2)Ot5!u+`?02WBNxwk~#4hi0A$|&%jZZ;K) zX_AMGus(lu0Q3ZSdXncUf6USB{d)c1e+kHY{)`umF{WZjG~B>3 zKfWIv`Pi_F^An^K$5pmKs78|?VWjAQNw*T48n492dZ2qMSJjnRoT{`=_CC? zrCnzXO$GBCC9c(5<(}&5GEQ0Q%QR z@8SgE;-h#Er6`6F00|Yysao>j&-L~)jQ@tF=~%b3>!EyJo_1CtFN8wThbBdHsS9_+ z=-|)ArLohy8!jD7={2y)aY5=HG8}i5ClxTo=lOka_{;7c&2+`>O%N=B_x{M6at42% zQ+q}-L7GuRM{gi{KD{*OB zDt({oLtY=|RSaJcl=6M8@2AZui!&I{3(^k%oj#jeZ$@ie0b)Av=cY~saV4#MOR zMsTh8fNmoUkfC-}DhqqVT|6b1A{7y>H5Yb&+U1_H?bAD)XTt&0Pq%i)j&H`-Cg{y} zgw`ityi`klgbMVh87zWDvFD}3)~ox1$B!VzEm z5*=FPzx6{>3cpYb5+)?+%q?|F2slyk=M$5ZL&))~?hHaHy#9WTWbe;!ABV(R*v8$& z26JAhq}5$Enn=@lgEU_M?rNytEK1Vfyb?~h)hFY=eS6E=oSS|(Vu zncRS5QxV|DoEZ#AwJ?xAWN0YKpTHByLBbIl5=J_xYgcB8v=R1jU`LcAP%}0${Q8!C z2~S(J+DWs;ASFz%N@j%f2$}e_O~zS@#Ca6Yk3TXO#B|gIKKaMfB!e_K0wI&>BPxVl zFbZ=JhuRuMz_xxZ8}}H}8z-fDmD<&mg9UcrJTc)m*%Q}qiWBMH(?!Sv;R<625lu+r z0%F?_C8Wrs*ovb>VefR7*Qf`+W}P(PwB+d>fZl)e?o+oJy0tyYAOr_zHr3<4;C;En zKXr?J3{BWO=xIA!jGLY{wHQZ269Fa->&Q~jAL9uv^ZsiQvHMjjat4i9sy$3|tyc6# zn1GU}yEu1se54e3ylk;piR1iF&!ce#llQvnf{eC zGZE)Pp&&y4{@wjA2Sz|fi%lj7T%jGRpDA355yd%gC;VqO0MABYSN!@ zGt!LGE49GiH%Mkrr@b&DfU`p7Uud_z%ku# zJA(CirWVGGK89|3c79MZ2-$0~dEE~l3*Q#V>;|7Gb!?t3tn)+*8?-uqS>hWgcOo|@ zzX#nsmsM4LQL*G+rO~q4a;_N9zt8-P;_~B%Kt9AwoiEeZ99;-66VI|9y}F)!{-0B( zUqpY*2Kfxq*AMJj8w)Kl0D}uslnTwaA9w;nK;B^J7u>7wOqR$#H5yiFr9*<*t*foG z+o+EQENx+5$7pdRTK`pG#2Ad=v3%w1)o8Nuo=!<`zIC0~^X40Im4l|j+XW4CO z>P?)gZM6)1hcdPTa;cK>af~*Rr8c9c68Y!?c=>@n2LX|7Yzzzqzfx$$_0<2J`N*)W zF_z?_`T!rr7Tzh#^5_6Lo7n<(r0&|Q=?7Kv%UfK&n)<&VZ@Iq2poZ1O{A9BE>F)|7 zx+e8(6cSObJM2HPRXAnKz$K)ZBa zr6Z(vWTqvx^+Rx+h-m(cy$vo;3zoM*s{-Wi1Bbnox;eiPd00YM_F>1WU7?R?r zFBbRH&xB-D6A%C)m+@|=g_v7{w0FWY-BD~?A-27Y>z32R!byi8CMB}x7TA9>;98#S zyCU2CQu0|FCKw!X12xhiFl9?o}MjxKF#$lFpvh|clm*^Zw~ zRiKSxlTX=lHzC+-UK-BKi_SNw3ioIfxKQ|O9Qf!K=Xq|#ade)qQnfTCa(G}l+49;4 zY#Yfp@wvNsI0Jq?3y&R{x7JhgOh2qRLgl3x{%sA5bB8xNDR{yXZ#GUey*j9`NreAQ zr$a!% zZX`6sat4mXq^Q{UynkKk#2xC@K9eNa)`YC;>eFpt{K;A>oy3$?#ha}-B?_Go64y|> zk}q^O@w-m=P`eLX4Mw{YqCs16K8|0-wEw{0TS2DQzFA}{_@3M_78qx~m=k7X`kI(H zJ~8h!D~*U5JdCd5tj0p|u%onnP8HhdC;`^qewNo2Xh@gq<@Mw|iwUqKZdt5nVt5e> zb(TkZj_Hy9QgN;(@6GR*H^vJJ)8o>A_GO``eDBtf4OvUnFG7b_k8SWFEWa7x2}1pS z6e7f>TNA1T@66Xhq)KFEhfr5+T4^b zjIbX{(0TYh9i(ntY5}WBoE8umz3nnmCgR96Y|6IgIUwpNKNs8!27UUo>$vU*i@m5bv8-P3i-auKYSXoCv2BEA&(`%@? z>uGA8S<3~fdwL;mZu**l%g*KQ-_}=9Co}mfOjNHkzN3;_Cb0+%po9)Pd=Ys+cSEDI zI6;{{<52cNlv5WR*xlpL1%0!f;Dlqz&)7>nxA7lexD|lad?LW(XVFK4bnU|^KV@Ae zG@eVkH1U?sc*^U%oahj}VZ;15;zC#GM2sZ0d^6Math*oxujbqAW)KVG0|4>&KfgJ8 zIs=jDy>Do_IjOTaSGkBF$N)W}+y$<8#XAyAyvdg2k}e*2EmN1&QUnJj=>+aQi%r>N z*p)aIS&tsRaHh)zd{!83aM~15Qp5lRNgFacV8Z?<^gk zqYA>=^=g<6X-Ie0AMR5Z2c3Vl+|@SgH+XR7lL?OVY5jNlX4d(YW!pJz9JR;RckIX)szUaTC z-2@|0GV^aFs>XjCF>iQ93XyeiX4ZDMQ+s`ihJ+PkZqgpl45I+~q>Sj*s^8mqCq|Kv z*ZOFhT|FPicb)a4qzOIVvs^ycHq_>Jplkm~-nd(f<*|RRdu%wK${>DzZerER9-+zt zzVqv7s3!QMis7u`z*n|Bt7)j%zw<|NjRLB@7x-k?t5FA|NT< z>F6mE0@5k%1f&s=kOt||T?0{20g)V|#-w2rMvWM;@9z8l{C@wje|Vhtb*^*Hb*^(= zujk@1i_UtUM4R}se|XolU3E)3(AiCmD+ccC z+bW;~&j{Xzv@RS}KG>(O(UCYevx(Sl?dc0ZCSytUpIVb#@geKyom=!wT$dMr6MJS) zqMC@hu=R7B)}5xAuJQ4Gqq6a8E2bwJ)bdW3^XgSq(*ITvcl4$jq#S@#c{QhD(30`B4h7qJcbM()|o z-@d2ac5pr5(Ah?^u zR&r?jtG8Y9x-+nB^A6a-60-kp790)UwO;D%?xTg1I?_)<7SsFe>gv47SOtYs73kuE zxVZDPLPQs{LUyBi29NvfmOw*9P{uw1LxgNoAy#Fh#bdaMFiB#B&V5UHvF$Ul%fI4J zhTa4MGwtCi(EMtfS?)D{(zD3Qno_|;u&Gi^zxWXzv z_-rN?q);fOzl3Blev)`p`|YCR({P!Hwuz3wt@i^PjK5Bqo0TUScn4)ZTu0q`1*>5C zQz+yzjWX!>a{ZxI^7F|M;bm)f1Z`Or@Oeejy(zQX;Tg8gi5h(Gp83J^eWwp0WxHLA zoOLehow66F7k`A#i~#DvTN58Bxs52q9Rqxa|1}JRIel z&$m9SpwDSMGj)0U(pP`Jn0X$p@?uHrNt{|5KudtUfw?i7$3@67Cakk7Zp<&s556v? zGo+2M4a(^6XnoVRVNw2iZ_n;L;z0%DS+M-n;{pAlfA-r1PrkZ*)LZJdD9coC^#*Zu z>Us-38h{?pfcaej%`HEwcm8A?0IftFfYARSg3=l^JVHjPlG0(qwLI{!EgPyT=Y(Pz zpF%U&NL2ePH$zV1{1xLK=rejP_|&Z1wVtL*Dnk_xHX*FQoIhL!$W3blz*wZnHhR{9Ix z9B|$i=m^-IvHN9w$1-e)Y3ioK4ux5wX;PG{P$cy`L8?^B*E~k#$_+xm>#hKjek1*( z7tJQIaj757R(AQ9B3*u8H{N=zFSU^EyZS3V;JF=Ne7Px!e|MU?V={L8`!A~Ix*&!( z4E)*TYGV%xVqau1@yY$!%NMUd^Hlo=2RLDyyn{#W18=98yN{U*e3*vFz7f?xj|Fd4 z)Cr{i^_`Q_=3@;^cha}`t3cRcKc1%b%9`{__WLf{FI_+NM8uh}ykwkCkShd;n?a<@oti`N~OUz1zMtX%&(MYb3a{c6Ux_yyf>7#C9qR+I_t z&6?E1VtZdhLK@|$KUQ7W?QAOlDyVw$2SbXmR4o6uK0OMmZT+8qWjY`Nx?$)VE`Ao& z_L5lwHhFw?Yc(kQG4xX(6kT`A>Y-gES-JKfJJugcGcN!XTqxrPF?}tTeugWtfO;#h5_h-qss!Lo zB^R*_2fY44d}3{jwsuaHAanLz-oNJtWKV1p&%)p50T$JsZxAGmON__)+1mP3gQ_WX zG=eK6y(zS+W2wvl4CGQp4MG5#ci#7bfV7MM+WN_l`#eIw6NKsrOS`AU4y$mhQzx`V zR>dK*jP2R?>Pb_sr*1fE#M<*sOT@*KF31_5s?R6%udw zpL(V$3IG6lhnTggjd1_o&vA&qFy)ugfz2;1#L$Q-toXLuzuxt)xy$j$3QTu3mrzC^ zt1ck4*A}9VEi9anH7(c`Hmm-zV-TbPvIz+hA@@Dj?R&Cb<4m;^Q^gpmKf_(_ZGF48 z^~A8cY0Q!0_@3h%YP0^8oM%T>vY(>A0(gKbWaP>g>Hq*4&oBc&>8qY=Kixn@l+xgL z4y9kH{Hu_cmtNyO+^#_K`zzfUSiBx+-OxVbY>M%m&3#S7yeI2k-|*^#wfOt2mtkCy z6=Tg&_~(tzfP?W!GFIP7(9?6P$Y#aAJ5qu2Mc&T=Hd#dp6Y4G{-A;4kOu{Mf2sy1?A>6##>YV4q|31+4 zbJ9rJ6YH16md)%G#=#p9>96E}A_Y1c08l7ZB!DI|dJ9l=E%N^de|xKbQxi9O^B+v~ z@=JkOC;EGoQDUJ>-80Xu;j*cohBk4Vr)A@-Syg6 zm69y3`4`^*mgHGBylxXWDyL=QXHvdD`(XF

    f0h0-IBRd=fsEEzm9YB^$kUlhIWR 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

    eSA&^# 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 z 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ꪊZXMa=WQ@=sXxk8 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

    f?oJ=7P4vWJfYH=_px?rQWT)!@Dj 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

    *$6! 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 +uZiwqR03 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≥Ow@oYktQ%;lNN{$*b<48SRqsZm1VW6i{6;o-)*vW@(O-vQNm5c`?3 zH3}wGYgS0_Yqv=!h#Sl)i9ItG+`s?=Bdt!+GN41eHIx@XB6_^hi@!M&ZB>%O_f$Hx z_urrOF#%m3;bWxL{jVT2>Zf8Pw=lT7l#EJwU`xd%!cTCK00;jO4YWWFoU>7THHOzt zlO$ER9;`qOKRU6Ii(Mb4Jd$el9)C#bifGAT=^|C!b9sB1p(!K#R-CC*X5Q*g(Jbs6$odB)r^c{>(q`Hg{?< zKYwFZ3mC*&cLsm3G9HFU22eB9qj;G;K>!ghpi+^?CssWo^db;J9Yc|?{2Dz|zit}> z2oUtk><@4ze@#~-et9C+s)_G~46Y-ozkHCzjyVnysYz>bdnE7C7sgPwBAcchOPq92 zq%q-lDKl-(%GAl$9%lCL6ByWwj03qygVPKBRu1OIChU6fb;elSULk5pwJPhVjg4ct z`FbkE({K~ZQ3|(xmuz_Y934T=^hX3|hzs0;^s6)&Xrbv{X}QPL+*K}=kl-*BP{XOT zM`;#b|SF zpI10ndvnKUrazoMh*Z2SddvzSm3k#K%I;}k=}}FXCZ=txL=LkAYlz@c0NnVv_Z@jn z=c7X*_=KH%_eT2{YHH#Bp@PGiok)SJz9dmEXPFiBD4ScrnP*?UOjp2{n(}RNZWd9I zc%wTVVs%ykl@b$cxoz9PvP3MaDwHBoBQ~zMlet))0{3E~IN%)>jc5MwYp=Ua0T>^B ziimvt3{GRVFJ7n@pKQO$K~eOtb%NLBkXGws@vHCSS-$X`2AvW#{auX@CM)<(yjT_3 zYq^z}B`~zjxWPfz3!*08g}(Jw#s2dsB-xX{=wWN~#IOH{FSpbz3Sitw`HV)xath`& zAa_`HbY+SWPoxn|ZGpQT5SS}FQxJ647;064@2A-~(GxEMyAMKf0d@Bz4_oM2$uI;3 z9!!7loY0XnO(>gTOiMQO&YeA7W1ziAEDc!-sy}u$`W~TdVyP%Z-X zf%x;oGwX{kT7lP}Eyswt!KzzuqLm){^n6}i3w>%zIk(1ZfGT3VzZ9r^a9H0XVzPUA z(kt>?<^{;544vaeyUK2ss@L4B*^cG`sJt4ZbJq#c57S>c?F>f>r;Gv|v|w_J!mAr8 zaqu7&$O|jgPo%q6f0t!urfIb&- zIsSK>kk~W@K+Bv+Mhu*Yhp*KRT1R3Bb?VZWqNacbD-xf3iiC$aWArQM$Q@$5yGPW6 z2?f#fajt76KQ2g&?m@<#colAY8AGoY&?mKIuh|#;$cNsaQvcW8B#xjEZM%brK6`f2 zQ;TvR6ZKV`)zVs489(78S+_-}N!d-m;-~b7A_pUp`;0Q{aF~??=)%$+1VOlCWT643 zjf7ovjXx2A73~X5@W2v@wl4@|7N?#J!M&Gw_UC1l9j{5NBghD;r!J5^a*rb&{80bfULp_EyMC;FLzxw~rlTro??IwG z6}$Cr^{E~E2WRvF+2!pte%fg{E#j--Vmz~znwiN^L8^eo=wLSrLR)h|Wa2td{rPi< zSC?L5>a^gp*v(@49iN+cw>$nFe16i1(}Z_?VHxQug5nTlLpZ!hKz!=xVTe20cv?H; z*nVnBfZh03s~5s}jl&yuZ7a=E`EI9pE}?S=_9itIK0v14F<0v_D`a)tqT|$cVJw&HJBwh(TUDnL%lhcVzT&?A{tJ}`SWNq%$1~$6| zTu}>%F#>x7_$^{=qK+5)8F{Feu+!i0k&Y9=3GrGPF=ipT+?4fTR#GQlMQ1mEeR$%vGe z!J|N=A@Ln4In{U)97r5qaxkQ1ojLXV_sLZ#!Vt)O+Uimms_ibeR;LLw7kg;Jz3wK1 zP{GqKi!*s^xVTNp^#AuVKVp95D8%CUar5IAkUuSs{0aFJc=sm+0 %s', req.method, req.url, socket.filename); + + req.on('end', function() { + if (req.url !== '/') { + res.end(JSON.stringify({ + method: req.method, + url: req.url, + filename: socket.filename, + })); + return; + } + + res.writeHead(200, {'content-type': 'text/html'}); + res.end( + '

    '+ + '
    '+ + '
    '+ + ''+ + '' + ); + }); +}); + +server.on('connection', function(socket) { + connections++; + + socket.id = connections; + socket.filename = 'connection-' + socket.id + '.http'; + socket.file = fs.createWriteStream(socket.filename); + socket.pipe(socket.file); + + console.log('--> %s', socket.filename); + socket.on('close', function() { + console.log('<-- %s', socket.filename); + }); +}); + +var port = process.env.PORT || 8080; +server.listen(port, function() { + console.log('Recording connections on port %s', port); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-connection-aborted.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-connection-aborted.js new file mode 100644 index 00000000..bd83e1d6 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-connection-aborted.js @@ -0,0 +1,27 @@ +var assert = require('assert'); +var http = require('http'); +var net = require('net'); +var multiparty = require('../../'); + +var server = http.createServer(function (req, res) { + var form = new multiparty.Form(); + var aborted_received = false; + form.on('aborted', function () { + aborted_received = true; + }); + form.on('error', function () { + assert(aborted_received, 'Error event should follow aborted'); + server.close(); + }); + form.on('end', function () { + throw new Error('Unexpected "end" event'); + }); + form.parse(req); +}).listen(0, 'localhost', function () { + var client = net.connect(server.address().port); + client.write( + "POST / HTTP/1.1\r\n" + + "Content-Length: 70\r\n" + + "Content-Type: multipart/form-data; boundary=foo\r\n\r\n"); + client.end(); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-content-transfer-encoding.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-content-transfer-encoding.js new file mode 100644 index 00000000..35e5a1f8 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-content-transfer-encoding.js @@ -0,0 +1,52 @@ +var assert = require('assert') + , multiparty = require('../../') + , http = require('http') + , path = require('path') + , TMP_PATH = path.join(__dirname, '..', 'tmp') + +var server = http.createServer(function(req, res) { + var form = new multiparty.Form(); + form.uploadDir = TMP_PATH; + form.on('close', function () { + throw new Error('Unexpected "close" event'); + }); + form.on('end', function () { + throw new Error('Unexpected "end" event'); + }); + form.on('error', function (e) { + res.writeHead(500); + res.end(e.message); + }); + form.parse(req); +}); + +server.listen(0, function() { + var body = + '--foo\r\n' + + 'Content-Disposition: form-data; name="file1"; filename="file1"\r\n' + + 'Content-Type: application/octet-stream\r\n' + + '\r\nThis is the first file\r\n' + + '--foo\r\n' + + 'Content-Type: application/octet-stream\r\n' + + 'Content-Disposition: form-data; name="file2"; filename="file2"\r\n' + + 'Content-Transfer-Encoding: unknown\r\n' + + '\r\nThis is the second file\r\n' + + '--foo--\r\n'; + + var req = http.request({ + method: 'POST', + port: server.address().port, + headers: { + 'Content-Length': body.length, + 'Content-Type': 'multipart/form-data; boundary=foo' + } + }); + req.on('response', function (res) { + assert.equal(res.statusCode, 500); + res.on('data', function () {}); + res.on('end', function () { + server.close(); + }); + }); + req.end(body); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-invalid.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-invalid.js new file mode 100644 index 00000000..ede541da --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-invalid.js @@ -0,0 +1,35 @@ +var superagent = require('superagent') + , multiparty = require('../../') + , http = require('http') + +var server = http.createServer(function(req, resp) { + var form = new multiparty.Form(); + + var errCount = 0; + form.on('error', function(err) { + errCount += 1; + resp.end(); + }); + form.on('file', function(name, file) { + }); + form.on('field', function(name, file) { + }); + + form.parse(req); +}); +server.listen(function() { + var url = 'http://localhost:' + server.address().port + '/' + var req = superagent.post(url) + req.set('Content-Type', 'multipart/form-data; boundary=foo') + req.write('--foo\r\n') + req.write('Content-filename="foo.txt"\r\n') + req.write('\r\n') + req.write('some text here') + req.write('Content-Disposition: form-data; name="text"; filename="bar.txt"\r\n') + req.write('\r\n') + req.write('some more text stuff') + req.write('\r\n--foo--') + req.end(function(err, resp) { + server.close(); + }); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-15.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-15.js new file mode 100644 index 00000000..43982fa7 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-15.js @@ -0,0 +1,88 @@ +var http = require('http') + , multiparty = require('../../') + , assert = require('assert') + , superagent = require('superagent') + , path = require('path') + +var server = http.createServer(function(req, res) { + assert.strictEqual(req.url, '/upload'); + assert.strictEqual(req.method, 'POST'); + + var form = new multiparty.Form({autoFields:true,autoFiles:true}); + + form.on('error', function(err) { + console.log(err); + }); + + form.on('close', function() { + }); + + var fileCount = 0; + form.on('file', function(name, file) { + fileCount += 1; + }); + + form.parse(req, function(err, fields, files) { + var objFileCount = 0; + for (var file in files) { + objFileCount += 1; + } + // multiparty does NOT try to do intelligent things based on + // the part name. + assert.strictEqual(fileCount, 2); + assert.strictEqual(objFileCount, 1); + res.end(); + }); +}); +server.listen(function() { + var url = 'http://localhost:' + server.address().port + '/upload'; + var req = superagent.post(url); + req.attach('files[]', fixture('pf1y5.png'), 'SOG2.JPG'); + req.attach('files[]', fixture('binaryfile.tar.gz'), 'BenF364_LIB353.zip'); + + // Get the existing boundary. + var contentType = req.get('content-type'); + var split = contentType.split(' '); + + // Set the content-type. + req.set('content-type', split.join('')); + + req.end(function(err, resp) { + assert.ifError(err); + resp.on('end', function() { + server.close(); + }); + }); + + // No space. + createRequest(''); + + // Single space. + createRequest(' '); + + // Multiple spaces. + createRequest(' '); +}); + +function createRequest(separator) { + var url = 'http://localhost:' + server.address().port + '/upload'; + var req = superagent.post(url); + req.attach('files[]', fixture('pf1y5.png'), 'SOG2.JPG'); + req.attach('files[]', fixture('binaryfile.tar.gz'), 'BenF364_LIB353.zip'); + + // Get the existing boundary. + var contentType = req.get('content-type'); + var split = contentType.split(' '); + + // Set the content-type. + req.set('content-type', split.join(separator)); + + req.end(function(err, resp) { + assert.ifError(err); + // We don't close the server, to allow other requests to pass. + }); +} + +function fixture(name) { + return path.join(__dirname, '..', 'fixture', 'file', name) +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-19.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-19.js new file mode 100644 index 00000000..d7da0cfb --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-19.js @@ -0,0 +1,44 @@ +var assert = require('assert'); +var http = require('http'); +var net = require('net'); +var multiparty = require('../../'); + +var client; +var server = http.createServer(function (req, res) { + var form = new multiparty.Form({maxFields: 1}); + form.on('aborted', function () { + throw new Error("did not expect aborted"); + }); + var first = true; + form.on('error', function (err) { + assert.ok(first); + first = false; + client.end(); + assert.ok(/maxFields/.test(err.message)); + server.close(); + }); + form.on('end', function () { + throw new Error('Unexpected "end" event'); + }); + form.parse(req); +}); +server.listen(function() { + client = net.connect(server.address().port); + + client.write("POST /upload HTTP/1.1\r\n" + + "Content-Length: 728\r\n" + + "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"title\"\r\n" + + "\r\n" + + "foofoo" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah1.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi1\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n"); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-21.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-21.js new file mode 100644 index 00000000..155fba05 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-21.js @@ -0,0 +1,66 @@ +var assert = require('assert'); +var http = require('http'); +var net = require('net'); +var multiparty = require('../../'); + +var client; +var server = http.createServer(function(req, res) { + var form = new multiparty.Form(); + + form.parse(req, function(err, fieldsTable, filesTable, fieldsList, filesList) { + if (err) { + console.error(err.stack); + return; + } + assert.strictEqual(fieldsList.length, 1); + assert.strictEqual(fieldsList[0].name, "title"); + assert.strictEqual(fieldsList[0].value, "foofoo"); + assert.strictEqual(filesList.length, 4); + assert.strictEqual(filesList[0].fieldName, "upload"); + assert.strictEqual(filesList[1].fieldName, "upload"); + assert.strictEqual(filesList[2].fieldName, "upload"); + assert.strictEqual(filesList[3].fieldName, "upload"); + res.end(); + client.end(); + server.close(); + }); +}); +server.listen(function() { + client = net.connect(server.address().port); + + client.write("POST /upload HTTP/1.1\r\n" + + "Content-Length: 728\r\n" + + "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"title\"\r\n" + + "\r\n" + + "foofoo" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah1.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi1\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah2.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi2\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah3.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi3\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah4.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi4\r\n" + + "\r\n" + + "------WebKitFormBoundaryvfUZhxgsZDO7FXLF--\r\n" + ); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-4.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-4.js new file mode 100644 index 00000000..66b2a690 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-4.js @@ -0,0 +1,51 @@ +var http = require('http') + , multiparty = require('../../') + , assert = require('assert') + , superagent = require('superagent') + , path = require('path') + +var server = http.createServer(function(req, res) { + assert.strictEqual(req.url, '/upload'); + assert.strictEqual(req.method, 'POST'); + + var form = new multiparty.Form({autoFields:true,autoFiles:true}); + + form.on('error', function(err) { + console.log(err); + }); + + form.on('close', function() { + }); + + var fileCount = 0; + form.on('file', function(name, file) { + fileCount += 1; + }); + + form.parse(req, function(err, fields, files) { + var objFileCount = 0; + for (var file in files) { + objFileCount += 1; + } + // multiparty does NOT try to do intelligent things based on + // the part name. + assert.strictEqual(fileCount, 2); + assert.strictEqual(objFileCount, 1); + res.end(); + }); +}); +server.listen(function() { + var url = 'http://localhost:' + server.address().port + '/upload'; + var req = superagent.post(url); + req.attach('files[]', fixture('pf1y5.png'), 'SOG2.JPG'); + req.attach('files[]', fixture('binaryfile.tar.gz'), 'BenF364_LIB353.zip'); + req.end(function(err, resp) { + assert.ifError(err); + resp.on('end', function() { + server.close(); + }); + }); +}); +function fixture(name) { + return path.join(__dirname, '..', 'fixture', 'file', name) +} diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-46.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-46.js new file mode 100644 index 00000000..676b8709 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-46.js @@ -0,0 +1,49 @@ +var http = require('http'), + multiparty = require('../../'), + request = require('request'), + assert = require('assert'); + +var host = 'localhost'; + +var index = [ + '
    ', + ' ', + ' ', + '
    ' +].join("\n"); + +var server = http.createServer(function(req, res) { + + // Show a form for testing purposes. + if (req.method === 'GET') { + res.writeHead(200, {'content-type': 'text/html'}); + res.end(index); + return; + } + + // Parse form and write results to response. + var form = new multiparty.Form(); + form.parse(req, function(err, fields, files) { + res.writeHead(200, {'content-type': 'text/plain'}); + res.write(JSON.stringify({err: err, fields: fields, files: files})); + res.end(); + }); + +}).listen(0, host, function() { + + //console.log("Server up and running..."); + + var server = this, + url = 'http://' + host + ':' + server.address().port; + + var parts = [ + {'Content-Disposition': 'form-data; name="foo"', 'body': 'bar'} + ] + + var req = request({method: 'POST', url: url, multipart: parts}, function(e, res, body) { + var obj = JSON.parse(body); + assert.equal("bar", obj.fields.foo); + server.close(); + }); + +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-5.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-5.js new file mode 100644 index 00000000..80eadf20 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/standalone/test-issue-5.js @@ -0,0 +1,39 @@ +var assert = require('assert'); +var http = require('http'); +var net = require('net'); +var multiparty = require('../../'); + +var client; +var attachmentCount = 510; +var server = http.createServer(function(req, res) { + var form = new multiparty.Form({maxFields: 10000}); + + form.parse(req, function(err, fieldsTable, filesTable, fieldsList, filesList) { + assert.strictEqual(err.code, "EMFILE"); + res.end(); + client.end(); + server.close(); + }); +}); +server.listen(function() { + client = net.connect(server.address().port); + + var boundary = "------WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n"; + var oneAttachment = boundary + + "Content-Disposition: form-data; name=\"upload\"; filename=\"blah1.txt\"\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "hi1\r\n" + + "\r\n"; + var payloadSize = oneAttachment.length * attachmentCount + boundary.length; + + client.write("POST /upload HTTP/1.1\r\n" + + "Content-Length: " + payloadSize + "\r\n" + + "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvfUZhxgsZDO7FXLF\r\n" + + "\r\n"); + + for (var i = 0; i < attachmentCount; i += 1) { + client.write(oneAttachment); + } + client.write(boundary); +}); diff --git a/node_modules/express/node_modules/connect/node_modules/multiparty/test/test.js b/node_modules/express/node_modules/connect/node_modules/multiparty/test/test.js new file mode 100644 index 00000000..199d5cdd --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/multiparty/test/test.js @@ -0,0 +1,117 @@ +var spawn = require('child_process').spawn + , findit = require('findit') + , path = require('path') + , hashish = require('hashish') + , fs = require('fs') + , http = require('http') + , net = require('net') + , assert = require('assert') + , multiparty = require('../') + , mkdirp = require('mkdirp') + , STANDALONE_PATH = path.join(__dirname, 'standalone') + , server = http.createServer() + , PORT = 13532 + , FIXTURE_PATH = path.join(__dirname, 'fixture') + , TMP_PATH = path.join(__dirname, 'tmp') + +mkdirp.sync(TMP_PATH); + +describe("fixtures", function() { + before(function(done) { + server.listen(PORT, done); + }); + var fixtures = []; + findit + .sync(path.join(FIXTURE_PATH, 'js')) + .forEach(function(jsPath) { + if (!/\.js$/.test(jsPath)) return; + var group = path.basename(jsPath, '.js'); + hashish.forEach(require(jsPath), function(fixture, name) { + it(group + '/' + name, createTest({ + name : group + '/' + name, + fixture : fixture, + })); + }); + }); +}); + +describe("standalone", function() { + findit + .sync(STANDALONE_PATH) + .forEach(function(jsPath) { + if (!/\.js$/.test(jsPath)) return; + it(path.basename(jsPath, '.js'), function(done) { + var child = spawn(process.execPath, [jsPath], { stdio: 'inherit' }); + child.on('error', function(err) { + done(err); + }); + child.on('exit', function(code) { + if (code) return done(new Error("exited with code " + code)); + done(); + }); + }); + }); +}); + +function createTest(fixture) { + var name = fixture.name; + fixture = fixture.fixture; + return function(done) { + uploadFixture(name, function(err, parts) { + if (err) return done(err); + fixture.forEach(function(expectedPart, i) { + var parsedPart = parts[i]; + assert.equal(parsedPart.type, expectedPart.type); + assert.equal(parsedPart.name, expectedPart.name); + + if (parsedPart.type === 'file') { + var file = parsedPart.value; + assert.equal(file.originalFilename, expectedPart.filename); + if(expectedPart.sha1) assert.strictEqual(file.hash, expectedPart.sha1); + if(expectedPart.size) assert.strictEqual(file.size, expectedPart.size); + } + }); + done(); + }); + }; + +} + +function uploadFixture(name, cb) { + server.once('request', function(req, res) { + var parts = []; + var form = new multiparty.Form({ + autoFields: true, + autoFiles: true, + }); + form.uploadDir = TMP_PATH; + form.hash = "sha1"; + + form.on('error', callback); + form.on('file', function(name, value) { + parts.push({type: 'file', name: name, value: value}); + }); + form.on('field', function(name, value) { + parts.push({type: 'field', name: name, value: value}); + }); + form.on('close', function() { + res.end('OK'); + callback(null, parts); + }); + form.parse(req); + + function callback() { + var realCallback = cb; + cb = function() {}; + realCallback.apply(null, arguments); + } + }); + + var socket = net.createConnection(PORT); + var file = fs.createReadStream(FIXTURE_PATH + '/http/' + name); + + file.pipe(socket, {end: false}); + socket.on('data', function () { + socket.end(); + }); +} diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/LICENSE b/node_modules/express/node_modules/connect/node_modules/negotiator/LICENSE new file mode 100644 index 00000000..42ca2e7d --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/LICENSE @@ -0,0 +1,27 @@ +Original "Negotiator" program Copyright Federico Romero +Port to JavaScript Copyright Isaac Z. Schlueter + +All rights reserved. + +MIT License + +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/express/node_modules/connect/node_modules/negotiator/examples/accept.js b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/accept.js new file mode 100644 index 00000000..2a180391 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/accept.js @@ -0,0 +1,47 @@ +(function() { + var Negotiator, availableMediaTypes, http, key, representations, server, val; + + Negotiator = require('../lib/negotiator').Negotiator; + + http = require('http'); + + representations = { + 'text/html': '

    Hello world!

    ', + 'text/plain': 'Hello World!', + 'application/json': JSON.stringify({ + hello: 'world!' + }) + }; + + availableMediaTypes = (function() { + var _results; + _results = []; + for (key in representations) { + val = representations[key]; + _results.push(key); + } + return _results; + })(); + + server = http.createServer(function(req, res) { + var mediaType, negotiator; + negotiator = new Negotiator(req); + console.log("Accept: " + req.headers['accept']); + console.log("Preferred: " + (negotiator.preferredMediaTypes())); + console.log("Possible: " + (negotiator.preferredMediaTypes(availableMediaTypes))); + mediaType = negotiator.preferredMediaType(availableMediaTypes); + console.log("Selected: " + mediaType); + if (mediaType) { + res.writeHead(200, { + 'Content-Type': mediaType + }); + return res.end(representations[mediaType]); + } else { + res.writeHead(406); + return res.end(); + } + }); + + server.listen(8080); + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/examples/charset.js b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/charset.js new file mode 100644 index 00000000..6455effa --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/charset.js @@ -0,0 +1,52 @@ +(function() { + var Buffer, Iconv, Negotiator, availableCharsets, http, iconv, key, message, messages, server, val; + + Negotiator = require('../lib/negotiator').Negotiator; + + http = require('http'); + + Buffer = require('buffer').Buffer; + + Iconv = require('iconv').Iconv; + + iconv = new Iconv('UTF-8', 'ISO-8859-1'); + + message = "ë"; + + messages = { + 'utf-8': message, + 'iso-8859-1': iconv.convert(new Buffer(message)) + }; + + availableCharsets = (function() { + var _results; + _results = []; + for (key in messages) { + val = messages[key]; + _results.push(key); + } + return _results; + })(); + + server = http.createServer(function(req, res) { + var charset, negotiator; + negotiator = new Negotiator(req); + console.log("Accept-Charset: " + req.headers['accept-charset']); + console.log("Preferred: " + (negotiator.preferredCharsets())); + console.log("Possible: " + (negotiator.preferredCharsets(availableCharsets))); + charset = negotiator.preferredCharset(availableCharsets); + console.log("Selected: " + charset); + if (charset) { + res.writeHead(200, { + 'Content-Type': "text/html; charset=" + charset + }); + return res.end(messages[charset]); + } else { + res.writeHead(406); + return res.end(); + } + }); + + server.listen(8080); + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/examples/encoding.js b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/encoding.js new file mode 100644 index 00000000..a02d0f46 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/encoding.js @@ -0,0 +1,48 @@ +(function() { + var Negotiator, gbuf, http, messages; + + Negotiator = require('../lib/negotiator').Negotiator; + + http = require('http'); + + gbuf = require('gzip-buffer'); + + messages = { + identity: 'Hello World' + }; + + gbuf.gzip(messages.identity, function(zipped) { + var availableEncodings, key, server, val; + messages.gzip = zipped; + availableEncodings = (function() { + var _results; + _results = []; + for (key in messages) { + val = messages[key]; + _results.push(key); + } + return _results; + })(); + console.log(availableEncodings); + server = http.createServer(function(req, res) { + var encoding, negotiator; + negotiator = new Negotiator(req); + console.log("Accept-Encoding: " + req.headers['accept-encoding']); + console.log("Preferred: " + (negotiator.preferredEncodings())); + console.log("Possible: " + (negotiator.preferredEncodings(availableEncodings))); + encoding = negotiator.preferredEncoding(availableEncodings); + console.log("Selected: " + encoding); + if (encoding) { + res.writeHead(200, { + 'Content-Encoding': encoding + }); + return res.end(messages[encoding]); + } else { + res.writeHead(406); + return res.end(); + } + }); + return server.listen(8080); + }); + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/examples/language.js b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/language.js new file mode 100644 index 00000000..f161743f --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/examples/language.js @@ -0,0 +1,44 @@ +(function() { + var Negotiator, availableLanguages, http, key, messages, server, val; + + Negotiator = require('../lib/negotiator').Negotiator; + + http = require('http'); + + messages = { + es: "¡Hola Mundo!", + en: "Hello World!" + }; + + availableLanguages = (function() { + var _results; + _results = []; + for (key in messages) { + val = messages[key]; + _results.push(key); + } + return _results; + })(); + + server = http.createServer(function(req, res) { + var language, negotiator; + negotiator = new Negotiator(req); + console.log("Accept-Language: " + req.headers['accept-language']); + console.log("Preferred: " + (negotiator.preferredLanguages())); + console.log("Possible: " + (negotiator.preferredLanguages(availableLanguages))); + language = negotiator.preferredLanguage(availableLanguages); + console.log("Selected: " + language); + if (language) { + res.writeHead(200, { + 'Content-Language': language + }); + return res.end(messages[language]); + } else { + res.writeHead(406); + return res.end(); + } + }); + + server.listen(8080); + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/lib/charset.js b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/charset.js new file mode 100644 index 00000000..33004572 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/charset.js @@ -0,0 +1,71 @@ +module.exports = preferredCharsets; +preferredCharsets.preferredCharsets = preferredCharsets; + +function parseAcceptCharset(accept) { + return accept.split(',').map(function(e) { + return parseCharset(e.trim()); + }).filter(function(e) { + return e && e.q > 0; + }); +} + +function parseCharset(s) { + var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); + if (!match) return null; + + var charset = match[1]; + var q = 1; + if (match[2]) { + var params = match[2].split(';') + for (var i = 0; i < params.length; i ++) { + var p = params[i].trim().split('='); + if (p[0] === 'q') { + q = parseFloat(p[1]); + break; + } + } + } + + return { + charset: charset, + q: q + }; +} + +function getCharsetPriority(charset, accepted) { + return (accepted.filter(function(a) { + return specify(charset, a); + }).sort(function (a, b) { + // revsort + return a.q === b.q ? 0 : a.q > b.q ? -1 : 1; + })[0] || {q:0}).q; +} + +function specify(charset, spec) { + if (spec.charset === '*' || spec.charset === charset) { + return spec; + } +}; + +function preferredCharsets(accept, provided) { + accept = parseAcceptCharset(accept || ''); + if (provided) { + return provided.map(function(type) { + return [type, getCharsetPriority(type, accept)]; + }).filter(function(pair) { + return pair[1] > 0; + }).sort(function(a, b) { + // revsort + return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1; + }).map(function(pair) { + return pair[0]; + }); + } else { + return accept.sort(function (a, b) { + // revsort + return a.q < b.q ? 1 : -1; + }).map(function(type) { + return type.charset; + }); + } +} diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/lib/encoding.js b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/encoding.js new file mode 100644 index 00000000..b4fc889f --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/encoding.js @@ -0,0 +1,89 @@ +module.exports = preferredEncodings; +preferredEncodings.preferredEncodings = preferredEncodings; + +function parseAcceptEncoding(accept) { + var acceptableEncodings; + + if (accept) { + acceptableEncodings = accept.split(',').map(function(e) { + return parseEncoding(e.trim()); + }); + } else { + acceptableEncodings = []; + } + + if (!acceptableEncodings.some(function(e) { + return e && e.encoding === 'identity'; + })) { + acceptableEncodings.push({ + encoding: 'identity', + q: 0.1 + }); + } + + return acceptableEncodings.filter(function(e) { + return e && e.q > 0; + }); +} + +function parseEncoding(s) { + var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); + + if (!match) return null; + + var encoding = match[1]; + var q = 1; + if (match[2]) { + var params = match[2].split(';'); + for (var i = 0; i < params.length; i ++) { + var p = params[i].trim().split('='); + if (p[0] === 'q') { + q = parseFloat(p[1]); + break; + } + } + } + + return { + encoding: encoding, + q: q + }; +} + +function getEncodingPriority(encoding, accepted) { + return (accepted.filter(function(a) { + return specify(encoding, a); + }).sort(function (a, b) { + // revsort + return a.q === b.q ? 0 : a.q > b.q ? -1 : 1; + })[0] || {q:0}).q; +} + +function specify(encoding, spec) { + if (spec.encoding === '*' || spec.encoding === encoding) { + return spec; + } +} + +function preferredEncodings(accept, provided) { + accept = parseAcceptEncoding(accept || ''); + if (provided) { + return provided.map(function(type) { + return [type, getEncodingPriority(type, accept)]; + }).filter(function(pair) { + return pair[1] > 0; + }).sort(function(a, b) { + // revsort + return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1; + }).map(function(pair) { + return pair[0]; + }); + } else { + return accept.sort(function (a, b) { + // revsort + return a.q < b.q ? 1 : -1; + }).map(function(type) { + return type.encoding; + }); + } +} diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/lib/language.js b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/language.js new file mode 100644 index 00000000..432b7026 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/language.js @@ -0,0 +1,92 @@ +module.exports = preferredLanguages; +preferredLanguages.preferredLanguages = preferredLanguages; + +function parseAcceptLanguage(accept) { + return accept.split(',').map(function(e) { + return parseLanguage(e.trim()); + }).filter(function(e) { + return e && e.q > 0; + }); +} + +function parseLanguage(s) { + var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); + if (!match) return null; + + var prefix = match[1], + suffix = match[2], + full = prefix; + + if (suffix) full += "-" + suffix; + + var q = 1; + if (match[3]) { + var params = match[3].split(';') + for (var i = 0; i < params.length; i ++) { + var p = params[i].split('='); + if (p[0] === 'q') q = parseFloat(p[1]); + } + } + + return { + prefix: prefix, + suffix: suffix, + q: q, + full: full + }; +} + +function getLanguagePriority(language, accepted) { + var match = getClosestMatch(language, accepted); + return match ? match.q : 0; +} + +function getClosestMatch(language, accepted) { + var parsed = parseLanguage(language); + + var matches = accepted.filter(function(a) { + return a.full === parsed.full; + }); + if (matches.length) return matches[0]; + + matches = accepted.filter(function(a) { + return a.prefix === parsed.prefix && !a.suffix; + }); + if (matches.length) return matches[0]; + + matches = accepted.filter(function(a) { + return a.prefix === parsed.prefix; + }); + if (matches.length) return matches[0]; + + matches = accepted.filter(function(a) { + return a.prefix === '*'; + }); + return matches[0]; +} + +function preferredLanguages(accept, provided) { + accept = parseAcceptLanguage(accept || ''); + if (provided) { + + var ret = provided.map(function(type) { + return [type, getLanguagePriority(type, accept)]; + }).filter(function(pair) { + return pair[1] > 0; + }).sort(function(a, b) { + // revsort + return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1; + }).map(function(pair) { + return pair[0]; + }); + return ret; + + } else { + return accept.sort(function (a, b) { + // revsort + return a.q < b.q ? 1 : -1; + }).map(function(type) { + return type.full; + }); + } +} diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/lib/mediaType.js b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/mediaType.js new file mode 100644 index 00000000..3dc017fd --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/mediaType.js @@ -0,0 +1,101 @@ +module.exports = preferredMediaTypes; +preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; + +function parseAccept(accept) { + return accept.split(',').map(function(e) { + return parseMediaType(e.trim()); + }).filter(function(e) { + return e && e.q > 0; + }); +}; + +function parseMediaType(s) { + var match = s.match(/\s*(\S+)\/([^;\s]+)\s*(?:;(.*))?/); + if (!match) return null; + + var type = match[1], + subtype = match[2], + full = "" + type + "/" + subtype, + params = {}, + q = 1; + + if (match[3]) { + params = match[3].split(';').map(function(s) { + return s.trim().split('='); + }).reduce(function (set, p) { + set[p[0]] = p[1]; + return set + }, params); + + if (params.q != null) { + q = parseFloat(params.q); + delete params.q; + } + } + + return { + type: type, + subtype: subtype, + params: params, + q: q, + full: full + }; +} + +function getMediaTypePriority(type, accepted) { + return (accepted.filter(function(a) { + return specify(type, a); + }).sort(function (a, b) { + // revsort + return a.q > b.q ? -1 : 1; + })[0] || {q:0}).q; +} + +function specifies(spec, type) { + return spec === '*' || spec === type; +} + +function specify(type, spec) { + var p = parseMediaType(type); + + if (spec.params) { + var keys = Object.keys(spec.params); + if (keys.some(function (k) { + return !specifies(spec.params[k], p.params[k]); + })) { + // some didn't specify. + return null; + } + } + + if (specifies(spec.type, p.type) && + specifies(spec.subtype, p.subtype)) { + return spec; + } +} + +function preferredMediaTypes(accept, provided) { + accept = parseAccept(accept || ''); + if (provided) { + return provided.map(function(type) { + return [type, getMediaTypePriority(type, accept)]; + }).filter(function(pair) { + return pair[1] > 0; + }).sort(function(a, b) { + // revsort + return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1; + }).map(function(pair) { + return pair[0]; + }); + + } else { + return accept.sort(function (a, b) { + // revsort + return a.q < b.q ? 1 : -1; + }).map(function(type) { + return type.full; + }); + } +} + + diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/lib/negotiator.js b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/negotiator.js new file mode 100644 index 00000000..fe0e58a5 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/lib/negotiator.js @@ -0,0 +1,29 @@ +module.exports = Negotiator; +Negotiator.Negotiator = Negotiator; + +function Negotiator(request) { + if (!(this instanceof Negotiator)) return new Negotiator(request); + this.request = request; +} + +var set = { preferredCharset: [require('./charset.js'), 'accept-charset'], + preferredEncoding: [require('./encoding.js'), 'accept-encoding'], + preferredLanguage: [require('./language.js'), 'accept-language'], + preferredMediaType: [require('./mediaType.js'), 'accept'] }; + +Object.keys(set).forEach(function (k) { + var mh = set[k], + method = mh[0], + header = mh[1], + singular = k, + plural = k + 's'; + + Negotiator.prototype[plural] = function (available) { + return method(this.request.headers[header], available); + }; + + Negotiator.prototype[singular] = function(available) { + var set = this[plural](available); + if (set) return set[0]; + }; +}) diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/package.json b/node_modules/express/node_modules/connect/node_modules/negotiator/package.json new file mode 100644 index 00000000..62a98115 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/package.json @@ -0,0 +1,54 @@ +{ + "name": "negotiator", + "description": "HTTP content negotiation", + "version": "0.3.0", + "author": { + "name": "Federico Romero", + "email": "federico.romero@outboxlabs.com" + }, + "contributors": [ + { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/federomero/negotiator.git" + }, + "keywords": [ + "http", + "content negotiation", + "accept", + "accept-language", + "accept-encoding", + "accept-charset" + ], + "engine": "node >= 0.6", + "license": "MIT", + "devDependencies": { + "nodeunit": "0.6.x" + }, + "scripts": { + "test": "nodeunit test" + }, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "main": "lib/negotiator.js", + "readme": "# Negotiator\n\nAn HTTP content negotiator for node.js written in javascript.\n\n# Accept Negotiation\n\n Negotiator = require('negotiator')\n\n availableMediaTypes = ['text/html', 'text/plain', 'application/json']\n\n // The negotiator constructor receives a request object\n negotiator = new Negotiator(request)\n\n // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8'\n\n negotiator.preferredMediaTypes()\n // -> ['text/html', 'image/jpeg', 'application/*']\n\n negotiator.preferredMediaTypes(availableMediaTypes)\n // -> ['text/html', 'application/json']\n\n negotiator.preferredMediaType(availableMediaTypes)\n // -> 'text/html'\n\nYou can check a working example at `examples/accept.js`.\n\n## Methods\n\n`preferredMediaTypes(availableMediaTypes)`:\n\nReturns an array of preferred media types ordered by priority from a list of available media types.\n\n`preferredMediaType(availableMediaType)`:\n\nReturns the top preferred media type from a list of available media types.\n\n# Accept-Language Negotiation\n\n Negotiator = require('negotiator')\n\n negotiator = new Negotiator(request)\n\n availableLanguages = 'en', 'es', 'fr'\n\n // Let's say Accept-Language header is 'en;q=0.8, es, pt'\n\n negotiator.preferredLanguages()\n // -> ['es', 'pt', 'en']\n\n negotiator.preferredLanguages(availableLanguages)\n // -> ['es', 'en']\n\n language = negotiator.preferredLanguage(availableLanguages)\n // -> 'es'\n\nYou can check a working example at `examples/language.js`.\n\n## Methods\n\n`preferredLanguages(availableLanguages)`:\n\nReturns an array of preferred languages ordered by priority from a list of available languages.\n\n`preferredLanguage(availableLanguages)`:\n\nReturns the top preferred language from a list of available languages.\n\n# Accept-Charset Negotiation\n\n Negotiator = require('negotiator')\n\n availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5']\n\n negotiator = new Negotiator(request)\n\n // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2'\n\n negotiator.preferredCharsets()\n // -> ['utf-8', 'iso-8859-1', 'utf-7']\n\n negotiator.preferredCharsets(availableCharsets)\n // -> ['utf-8', 'iso-8859-1']\n\n negotiator.preferredCharset(availableCharsets)\n // -> 'utf-8'\n\nYou can check a working example at `examples/charset.js`.\n\n## Methods\n\n`preferredCharsets(availableCharsets)`:\n\nReturns an array of preferred charsets ordered by priority from a list of available charsets.\n\n`preferredCharset(availableCharsets)`:\n\nReturns the top preferred charset from a list of available charsets.\n\n# Accept-Encoding Negotiation\n\n Negotiator = require('negotiator').Negotiator\n\n availableEncodings = ['identity', 'gzip']\n\n negotiator = new Negotiator(request)\n\n // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5'\n\n negotiator.preferredEncodings()\n // -> ['gzip', 'identity', 'compress']\n\n negotiator.preferredEncodings(availableEncodings)\n // -> ['gzip', 'identity']\n\n negotiator.preferredEncoding(availableEncodings)\n // -> 'gzip'\n\nYou can check a working example at `examples/encoding.js`.\n\n## Methods\n\n`preferredEncodings(availableEncodings)`:\n\nReturns an array of preferred encodings ordered by priority from a list of available encodings.\n\n`preferredEncoding(availableEncodings)`:\n\nReturns the top preferred encoding from a list of available encodings.\n\n# License\n\nMIT\n", + "readmeFilename": "readme.md", + "bugs": { + "url": "https://github.com/federomero/negotiator/issues" + }, + "homepage": "https://github.com/federomero/negotiator", + "dependencies": {}, + "_id": "negotiator@0.3.0", + "dist": { + "shasum": "706d692efeddf574d57ea9fb1ab89a4fa7ee8f60" + }, + "_from": "negotiator@0.3.0", + "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/readme.md b/node_modules/express/node_modules/connect/node_modules/negotiator/readme.md new file mode 100644 index 00000000..0a077bbe --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/readme.md @@ -0,0 +1,132 @@ +# Negotiator + +An HTTP content negotiator for node.js written in javascript. + +# Accept Negotiation + + Negotiator = require('negotiator') + + availableMediaTypes = ['text/html', 'text/plain', 'application/json'] + + // The negotiator constructor receives a request object + negotiator = new Negotiator(request) + + // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' + + negotiator.preferredMediaTypes() + // -> ['text/html', 'image/jpeg', 'application/*'] + + negotiator.preferredMediaTypes(availableMediaTypes) + // -> ['text/html', 'application/json'] + + negotiator.preferredMediaType(availableMediaTypes) + // -> 'text/html' + +You can check a working example at `examples/accept.js`. + +## Methods + +`preferredMediaTypes(availableMediaTypes)`: + +Returns an array of preferred media types ordered by priority from a list of available media types. + +`preferredMediaType(availableMediaType)`: + +Returns the top preferred media type from a list of available media types. + +# Accept-Language Negotiation + + Negotiator = require('negotiator') + + negotiator = new Negotiator(request) + + availableLanguages = 'en', 'es', 'fr' + + // Let's say Accept-Language header is 'en;q=0.8, es, pt' + + negotiator.preferredLanguages() + // -> ['es', 'pt', 'en'] + + negotiator.preferredLanguages(availableLanguages) + // -> ['es', 'en'] + + language = negotiator.preferredLanguage(availableLanguages) + // -> 'es' + +You can check a working example at `examples/language.js`. + +## Methods + +`preferredLanguages(availableLanguages)`: + +Returns an array of preferred languages ordered by priority from a list of available languages. + +`preferredLanguage(availableLanguages)`: + +Returns the top preferred language from a list of available languages. + +# Accept-Charset Negotiation + + Negotiator = require('negotiator') + + availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] + + negotiator = new Negotiator(request) + + // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' + + negotiator.preferredCharsets() + // -> ['utf-8', 'iso-8859-1', 'utf-7'] + + negotiator.preferredCharsets(availableCharsets) + // -> ['utf-8', 'iso-8859-1'] + + negotiator.preferredCharset(availableCharsets) + // -> 'utf-8' + +You can check a working example at `examples/charset.js`. + +## Methods + +`preferredCharsets(availableCharsets)`: + +Returns an array of preferred charsets ordered by priority from a list of available charsets. + +`preferredCharset(availableCharsets)`: + +Returns the top preferred charset from a list of available charsets. + +# Accept-Encoding Negotiation + + Negotiator = require('negotiator').Negotiator + + availableEncodings = ['identity', 'gzip'] + + negotiator = new Negotiator(request) + + // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' + + negotiator.preferredEncodings() + // -> ['gzip', 'identity', 'compress'] + + negotiator.preferredEncodings(availableEncodings) + // -> ['gzip', 'identity'] + + negotiator.preferredEncoding(availableEncodings) + // -> 'gzip' + +You can check a working example at `examples/encoding.js`. + +## Methods + +`preferredEncodings(availableEncodings)`: + +Returns an array of preferred encodings ordered by priority from a list of available encodings. + +`preferredEncoding(availableEncodings)`: + +Returns the top preferred encoding from a list of available encodings. + +# License + +MIT diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/test/charset.js b/node_modules/express/node_modules/connect/node_modules/negotiator/test/charset.js new file mode 100644 index 00000000..79224a75 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/test/charset.js @@ -0,0 +1,62 @@ +(function() { + var configuration, preferredCharsets, testConfigurations, testCorrectCharset, _i, _len, + _this = this; + + preferredCharsets = require('../lib/charset').preferredCharsets; + + this["Should not return a charset when no charset is provided"] = function(test) { + test.deepEqual(preferredCharsets('*', []), []); + return test.done(); + }; + + this["Should not return a charset when no charset is acceptable"] = function(test) { + test.deepEqual(preferredCharsets('ISO-8859-1', ['utf-8']), []); + return test.done(); + }; + + this["Should not return a charset with q = 0"] = function(test) { + test.deepEqual(preferredCharsets('utf-8;q=0', ['utf-8']), []); + return test.done(); + }; + + testCorrectCharset = function(c) { + return _this["Should return " + c.selected + " for accept-charset header " + c.accept + " with provided charset " + c.provided] = function(test) { + test.deepEqual(preferredCharsets(c.accept, c.provided), c.selected); + return test.done(); + }; + }; + + testConfigurations = [ + { + accept: 'utf-8', + provided: ['utf-8'], + selected: ['utf-8'] + }, { + accept: '*', + provided: ['utf-8'], + selected: ['utf-8'] + }, { + accept: 'utf-8', + provided: ['utf-8', 'ISO-8859-1'], + selected: ['utf-8'] + }, { + accept: 'utf-8, ISO-8859-1', + provided: ['utf-8'], + selected: ['utf-8'] + }, { + accept: 'utf-8;q=0.8, ISO-8859-1', + provided: ['utf-8', 'ISO-8859-1'], + selected: ['ISO-8859-1', 'utf-8'] + }, { + accept: 'utf-8;q=0.8, ISO-8859-1', + provided: null, + selected: ['ISO-8859-1', 'utf-8'] + } + ]; + + for (_i = 0, _len = testConfigurations.length; _i < _len; _i++) { + configuration = testConfigurations[_i]; + testCorrectCharset(configuration); + } + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/test/encoding.js b/node_modules/express/node_modules/connect/node_modules/negotiator/test/encoding.js new file mode 100644 index 00000000..7859d5e4 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/test/encoding.js @@ -0,0 +1,70 @@ +(function() { + var configuration, preferredEncodings, testConfigurations, testCorrectEncoding, _i, _len, + _this = this; + + preferredEncodings = require('../lib/encoding').preferredEncodings; + + this["Should return identity encoding when no encoding is provided"] = function(test) { + test.deepEqual(preferredEncodings(null), ['identity']); + return test.done(); + }; + + this["Should include the identity encoding even if not explicity listed"] = function(test) { + test.ok(preferredEncodings('gzip').indexOf('identity') !== -1); + return test.done(); + }; + + this["Should not return identity encoding if q = 0"] = function(test) { + test.ok(preferredEncodings('identity;q=0').indexOf('identity') === -1); + return test.done(); + }; + + testCorrectEncoding = function(c) { + return _this["Should return " + c.selected + " for accept-encoding header " + c.accept + " with provided encoding " + c.provided] = function(test) { + test.deepEqual(preferredEncodings(c.accept, c.provided), c.selected); + return test.done(); + }; + }; + + testConfigurations = [ + { + accept: 'gzip', + provided: ['identity', 'gzip'], + selected: ['gzip', 'identity'] + }, { + accept: 'gzip, compress', + provided: ['compress'], + selected: ['compress'] + }, { + accept: 'deflate', + provided: ['gzip', 'identity'], + selected: ['identity'] + }, { + accept: '*', + provided: ['identity', 'gzip'], + selected: ['identity', 'gzip'] + }, { + accept: 'gzip, compress', + provided: ['compress', 'identity'], + selected: ['compress', 'identity'] + }, { + accept: 'gzip;q=0.8, identity;q=0.5, *;q=0.3', + provided: ['identity', 'gzip', 'compress'], + selected: ['gzip', 'identity', 'compress'] + }, { + accept: 'gzip;q=0.8, compress', + provided: ['gzip', 'compress'], + selected: ['compress', 'gzip'] + }, { + accept: 'gzip;q=0.8, compress', + provided: null, + selected: ['compress', 'gzip', 'identity'] + } + ]; + + for (_i = 0, _len = testConfigurations.length; _i < _len; _i++) { + configuration = testConfigurations[_i]; + testCorrectEncoding(configuration); + } + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/test/language.js b/node_modules/express/node_modules/connect/node_modules/negotiator/test/language.js new file mode 100644 index 00000000..d98f26de --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/test/language.js @@ -0,0 +1,70 @@ +(function() { + var configuration, preferredLanguages, testConfigurations, testCorrectType, _i, _len, + _this = this; + + preferredLanguages = require('../lib/language').preferredLanguages; + + this["Should not return a language when no is provided"] = function(test) { + test.deepEqual(preferredLanguages('*', []), []); + return test.done(); + }; + + this["Should not return a language when no language is acceptable"] = function(test) { + test.deepEqual(preferredLanguages('en', ['es']), []); + return test.done(); + }; + + this["Should not return a language with q = 0"] = function(test) { + test.deepEqual(preferredLanguages('en;q=0', ['en']), []); + return test.done(); + }; + + testCorrectType = function(c) { + return _this["Should return " + c.selected + " for accept-language header " + c.accept + " with provided language " + c.provided] = function(test) { + test.deepEqual(preferredLanguages(c.accept, c.provided), c.selected); + return test.done(); + }; + }; + + testConfigurations = [ + { + accept: 'en', + provided: ['en'], + selected: ['en'] + }, { + accept: '*', + provided: ['en'], + selected: ['en'] + }, { + accept: 'en-US, en;q=0.8', + provided: ['en-US', 'en-GB'], + selected: ['en-US', 'en-GB'] + }, { + accept: 'en-US, en-GB', + provided: ['en-US'], + selected: ['en-US'] + }, { + accept: 'en', + provided: ['en-US'], + selected: ['en-US'] + }, { + accept: 'en;q=0.8, es', + provided: ['en', 'es'], + selected: ['es', 'en'] + }, { + accept: 'en-US;q=0.8, es', + provided: ['en', 'es'], + selected: ['es', 'en'] + }, { + accept: 'en-US;q=0.8, es', + provided: null, + selected: ['es', 'en-US'] + } + ]; + + for (_i = 0, _len = testConfigurations.length; _i < _len; _i++) { + configuration = testConfigurations[_i]; + testCorrectType(configuration); + } + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/negotiator/test/mediaType.js b/node_modules/express/node_modules/connect/node_modules/negotiator/test/mediaType.js new file mode 100644 index 00000000..08e49231 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/negotiator/test/mediaType.js @@ -0,0 +1,70 @@ +(function() { + var configuration, preferredMediaTypes, testConfigurations, testCorrectType, _i, _len, + _this = this; + + preferredMediaTypes = require('../lib/mediaType').preferredMediaTypes; + + this["Should not return a media type when no media type provided"] = function(test) { + test.deepEqual(preferredMediaTypes('*/*', []), []); + return test.done(); + }; + + this["Should not return a media type when no media type is acceptable"] = function(test) { + test.deepEqual(preferredMediaTypes('application/json', ['text/html']), []); + return test.done(); + }; + + this["Should not return a media type with q = 0"] = function(test) { + test.deepEqual(preferredMediaTypes('text/html;q=0', ['text/html']), []); + return test.done(); + }; + + testCorrectType = function(c) { + return _this["Should return " + c.selected + " for access header " + c.accept + " with provided types " + c.provided] = function(test) { + test.deepEqual(preferredMediaTypes(c.accept, c.provided), c.selected); + return test.done(); + }; + }; + + testConfigurations = [ + { + accept: 'text/html', + provided: ['text/html'], + selected: ['text/html'] + }, { + accept: '*/*', + provided: ['text/html'], + selected: ['text/html'] + }, { + accept: 'text/*', + provided: ['text/html'], + selected: ['text/html'] + }, { + accept: 'application/json, text/html', + provided: ['text/html'], + selected: ['text/html'] + }, { + accept: 'text/html;q=0.1', + provided: ['text/html'], + selected: ['text/html'] + }, { + accept: 'application/json, text/html', + provided: ['application/json', 'text/html'], + selected: ['application/json', 'text/html'] + }, { + accept: 'application/json;q=0.2, text/html', + provided: ['application/json', 'text/html'], + selected: ['text/html', 'application/json'] + }, { + accept: 'application/json;q=0.2, text/html', + provided: null, + selected: ['text/html', 'application/json'] + } + ]; + + for (_i = 0, _len = testConfigurations.length; _i < _len; _i++) { + configuration = testConfigurations[_i]; + testCorrectType(configuration); + } + +}).call(this); diff --git a/node_modules/express/node_modules/connect/node_modules/pause/.npmignore b/node_modules/express/node_modules/connect/node_modules/pause/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/express/node_modules/connect/node_modules/pause/History.md b/node_modules/express/node_modules/connect/node_modules/pause/History.md new file mode 100644 index 00000000..c8aa68fa --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/History.md @@ -0,0 +1,5 @@ + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Makefile b/node_modules/express/node_modules/connect/node_modules/pause/Makefile new file mode 100644 index 00000000..4e9c8d36 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --require should \ + --reporter spec + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Readme.md b/node_modules/express/node_modules/connect/node_modules/pause/Readme.md new file mode 100644 index 00000000..1cdd68a2 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/Readme.md @@ -0,0 +1,29 @@ + +# pause + + Pause streams... + +## License + +(The MIT License) + +Copyright (c) 2012 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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/index.js b/node_modules/express/node_modules/connect/node_modules/pause/index.js new file mode 100644 index 00000000..1b7b3794 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/index.js @@ -0,0 +1,29 @@ + +module.exports = function(obj){ + var onData + , onEnd + , events = []; + + // buffer data + obj.on('data', onData = function(data, encoding){ + events.push(['data', data, encoding]); + }); + + // buffer end + obj.on('end', onEnd = function(data, encoding){ + events.push(['end', data, encoding]); + }); + + return { + end: function(){ + obj.removeListener('data', onData); + obj.removeListener('end', onEnd); + }, + resume: function(){ + this.end(); + for (var i = 0, len = events.length; i < len; ++i) { + obj.emit.apply(obj, events[i]); + } + } + }; +}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/package.json b/node_modules/express/node_modules/connect/node_modules/pause/package.json new file mode 100644 index 00000000..9296b245 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/pause/package.json @@ -0,0 +1,24 @@ +{ + "name": "pause", + "version": "0.0.1", + "description": "Pause streams...", + "keywords": [], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "main": "index", + "readme": "\n# pause\n\n Pause streams...\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "_id": "pause@0.0.1", + "dist": { + "shasum": "1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + }, + "_from": "pause@0.0.1", + "_resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules b/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules new file mode 100644 index 00000000..49e31dac --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules @@ -0,0 +1,6 @@ +[submodule "support/expresso"] + path = support/expresso + url = git://github.com/visionmedia/expresso.git +[submodule "support/should"] + path = support/should + url = git://github.com/visionmedia/should.js.git diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.npmignore b/node_modules/express/node_modules/connect/node_modules/qs/.npmignore new file mode 100644 index 00000000..e85ce2af --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/qs/.npmignore @@ -0,0 +1,7 @@ +test +.travis.yml +benchmark.js +component.json +examples.js +History.md +Makefile diff --git a/node_modules/express/node_modules/connect/node_modules/qs/Readme.md b/node_modules/express/node_modules/connect/node_modules/qs/Readme.md new file mode 100644 index 00000000..27e54a4a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/qs/Readme.md @@ -0,0 +1,58 @@ +# node-querystring + + query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. + +## Installation + + $ npm install qs + +## Examples + +```js +var qs = require('qs'); + +qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); +// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } + +qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) +// => user[name]=Tobi&user[email]=tobi%40learnboost.com +``` + +## Testing + +Install dev dependencies: + + $ npm install -d + +and execute: + + $ make test + +browser: + + $ open test/browser/index.html + +## License + +(The MIT License) + +Copyright (c) 2010 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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/index.js b/node_modules/express/node_modules/connect/node_modules/qs/index.js new file mode 100644 index 00000000..b05938ac --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/qs/index.js @@ -0,0 +1,366 @@ +/** + * Object#toString() ref for stringify(). + */ + +var toString = Object.prototype.toString; + +/** + * Object#hasOwnProperty ref + */ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Array#indexOf shim. + */ + +var indexOf = typeof Array.prototype.indexOf === 'function' + ? function(arr, el) { return arr.indexOf(el); } + : function(arr, el) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] === el) return i; + } + return -1; + }; + +/** + * Array.isArray shim. + */ + +var isArray = Array.isArray || function(arr) { + return toString.call(arr) == '[object Array]'; +}; + +/** + * Object.keys shim. + */ + +var objectKeys = Object.keys || function(obj) { + var ret = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + ret.push(key); + } + } + return ret; +}; + +/** + * Array#forEach shim. + */ + +var forEach = typeof Array.prototype.forEach === 'function' + ? function(arr, fn) { return arr.forEach(fn); } + : function(arr, fn) { + for (var i = 0; i < arr.length; i++) fn(arr[i]); + }; + +/** + * Array#reduce shim. + */ + +var reduce = function(arr, fn, initial) { + if (typeof arr.reduce === 'function') return arr.reduce(fn, initial); + var res = initial; + for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]); + return res; +}; + +/** + * Cache non-integer test regexp. + */ + +var isint = /^[0-9]+$/; + +function promote(parent, key) { + if (parent[key].length == 0) return parent[key] = {} + var t = {}; + for (var i in parent[key]) { + if (hasOwnProperty.call(parent[key], i)) { + t[i] = parent[key][i]; + } + } + parent[key] = t; + return t; +} + +function parse(parts, parent, key, val) { + var part = parts.shift(); + + // illegal + if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; + + // end + if (!part) { + if (isArray(parent[key])) { + parent[key].push(val); + } else if ('object' == typeof parent[key]) { + parent[key] = val; + } else if ('undefined' == typeof parent[key]) { + parent[key] = val; + } else { + parent[key] = [parent[key], val]; + } + // array + } else { + var obj = parent[key] = parent[key] || []; + if (']' == part) { + if (isArray(obj)) { + if ('' != val) obj.push(val); + } else if ('object' == typeof obj) { + obj[objectKeys(obj).length] = val; + } else { + obj = parent[key] = [parent[key], val]; + } + // prop + } else if (~indexOf(part, ']')) { + part = part.substr(0, part.length - 1); + if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); + parse(parts, obj, part, val); + // key + } else { + if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); + parse(parts, obj, part, val); + } + } +} + +/** + * Merge parent key/val pair. + */ + +function merge(parent, key, val){ + if (~indexOf(key, ']')) { + var parts = key.split('[') + , len = parts.length + , last = len - 1; + parse(parts, parent, 'base', val); + // optimize + } else { + if (!isint.test(key) && isArray(parent.base)) { + var t = {}; + for (var k in parent.base) t[k] = parent.base[k]; + parent.base = t; + } + set(parent.base, key, val); + } + + return parent; +} + +/** + * Compact sparse arrays. + */ + +function compact(obj) { + if ('object' != typeof obj) return obj; + + if (isArray(obj)) { + var ret = []; + + for (var i in obj) { + if (hasOwnProperty.call(obj, i)) { + ret.push(obj[i]); + } + } + + return ret; + } + + for (var key in obj) { + obj[key] = compact(obj[key]); + } + + return obj; +} + +/** + * Parse the given obj. + */ + +function parseObject(obj){ + var ret = { base: {} }; + + forEach(objectKeys(obj), function(name){ + merge(ret, name, obj[name]); + }); + + return compact(ret.base); +} + +/** + * Parse the given str. + */ + +function parseString(str){ + var ret = reduce(String(str).split('&'), function(ret, pair){ + var eql = indexOf(pair, '=') + , brace = lastBraceInKey(pair) + , key = pair.substr(0, brace || eql) + , val = pair.substr(brace || eql, pair.length) + , val = val.substr(indexOf(val, '=') + 1, val.length); + + // ?foo + if ('' == key) key = pair, val = ''; + if ('' == key) return ret; + + return merge(ret, decode(key), decode(val)); + }, { base: {} }).base; + + return compact(ret); +} + +/** + * Parse the given query `str` or `obj`, returning an object. + * + * @param {String} str | {Object} obj + * @return {Object} + * @api public + */ + +exports.parse = function(str){ + if (null == str || '' == str) return {}; + return 'object' == typeof str + ? parseObject(str) + : parseString(str); +}; + +/** + * Turn the given `obj` into a query string + * + * @param {Object} obj + * @return {String} + * @api public + */ + +var stringify = exports.stringify = function(obj, prefix) { + if (isArray(obj)) { + return stringifyArray(obj, prefix); + } else if ('[object Object]' == toString.call(obj)) { + return stringifyObject(obj, prefix); + } else if ('string' == typeof obj) { + return stringifyString(obj, prefix); + } else { + return prefix + '=' + encodeURIComponent(String(obj)); + } +}; + +/** + * Stringify the given `str`. + * + * @param {String} str + * @param {String} prefix + * @return {String} + * @api private + */ + +function stringifyString(str, prefix) { + if (!prefix) throw new TypeError('stringify expects an object'); + return prefix + '=' + encodeURIComponent(str); +} + +/** + * Stringify the given `arr`. + * + * @param {Array} arr + * @param {String} prefix + * @return {String} + * @api private + */ + +function stringifyArray(arr, prefix) { + var ret = []; + if (!prefix) throw new TypeError('stringify expects an object'); + for (var i = 0; i < arr.length; i++) { + ret.push(stringify(arr[i], prefix + '[' + i + ']')); + } + return ret.join('&'); +} + +/** + * Stringify the given `obj`. + * + * @param {Object} obj + * @param {String} prefix + * @return {String} + * @api private + */ + +function stringifyObject(obj, prefix) { + var ret = [] + , keys = objectKeys(obj) + , key; + + for (var i = 0, len = keys.length; i < len; ++i) { + key = keys[i]; + if ('' == key) continue; + if (null == obj[key]) { + ret.push(encodeURIComponent(key) + '='); + } else { + ret.push(stringify(obj[key], prefix + ? prefix + '[' + encodeURIComponent(key) + ']' + : encodeURIComponent(key))); + } + } + + return ret.join('&'); +} + +/** + * Set `obj`'s `key` to `val` respecting + * the weird and wonderful syntax of a qs, + * where "foo=bar&foo=baz" becomes an array. + * + * @param {Object} obj + * @param {String} key + * @param {String} val + * @api private + */ + +function set(obj, key, val) { + var v = obj[key]; + if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; + if (undefined === v) { + obj[key] = val; + } else if (isArray(v)) { + v.push(val); + } else { + obj[key] = [v, val]; + } +} + +/** + * Locate last brace in `str` within the key. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function lastBraceInKey(str) { + var len = str.length + , brace + , c; + for (var i = 0; i < len; ++i) { + c = str[i]; + if (']' == c) brace = false; + if ('[' == c) brace = true; + if ('=' == c && !brace) return i; + } +} + +/** + * Decode `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +function decode(str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (err) { + return str; + } +} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/package.json b/node_modules/express/node_modules/connect/node_modules/qs/package.json new file mode 100644 index 00000000..d2a9c9b2 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/qs/package.json @@ -0,0 +1,42 @@ +{ + "name": "qs", + "description": "querystring parser", + "version": "0.6.6", + "keywords": [ + "query string", + "parser", + "component" + ], + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/node-querystring.git" + }, + "devDependencies": { + "mocha": "*", + "expect.js": "*" + }, + "scripts": { + "test": "make test" + }, + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "main": "index", + "engines": { + "node": "*" + }, + "readme": "# node-querystring\n\n query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others.\n\n## Installation\n\n $ npm install qs\n\n## Examples\n\n```js\nvar qs = require('qs');\n\nqs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com');\n// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } }\n\nqs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }})\n// => user[name]=Tobi&user[email]=tobi%40learnboost.com\n```\n\n## Testing\n\nInstall dev dependencies:\n\n $ npm install -d\n\nand execute:\n\n $ make test\n\nbrowser:\n\n $ open test/browser/index.html\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/node-querystring/issues" + }, + "homepage": "https://github.com/visionmedia/node-querystring", + "_id": "qs@0.6.6", + "dist": { + "shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107" + }, + "_from": "qs@0.6.6", + "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/raw-body/.npmignore b/node_modules/express/node_modules/connect/node_modules/raw-body/.npmignore new file mode 100644 index 00000000..b59f7e3a --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/.npmignore @@ -0,0 +1 @@ +test/ \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/raw-body/.travis.yml b/node_modules/express/node_modules/connect/node_modules/raw-body/.travis.yml new file mode 100644 index 00000000..595ded21 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/.travis.yml @@ -0,0 +1,8 @@ +node_js: +- "0.8" +- "0.10" +- "0.11" +language: node_js +matrix: + allow_failures: + - node_js: "0.11" \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/raw-body/Makefile b/node_modules/express/node_modules/connect/node_modules/raw-body/Makefile new file mode 100644 index 00000000..642d6a64 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/Makefile @@ -0,0 +1,13 @@ +NODE ?= node +BIN = ./node_modules/.bin/ + +test: + @${NODE} ${BIN}mocha \ + --reporter spec \ + --bail \ + ./test/index.js + +clean: + @rm -rf node_modules + +.PHONY: test clean diff --git a/node_modules/express/node_modules/connect/node_modules/raw-body/README.md b/node_modules/express/node_modules/connect/node_modules/raw-body/README.md new file mode 100644 index 00000000..049ef641 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/README.md @@ -0,0 +1,96 @@ +# Raw Body [![Build Status](https://travis-ci.org/stream-utils/raw-body.png)](https://travis-ci.org/stream-utils/raw-body) + +Gets the entire buffer of a stream either as a `Buffer` or a string. +Validates the stream's length against an expected length and maximum limit. +Ideal for parsing request bodies. + +## API + +```js +var getRawBody = require('raw-body') + +app.use(function (req, res, next) { + getRawBody(req, { + length: req.headers['content-length'], + limit: '1mb', + encoding: 'utf8' + }, function (err, string) { + if (err) + return next(err) + + req.text = string + next() + }) +}) +``` + +or in a Koa generator: + +```js +app.use(function* (next) { + var string = yield getRawBody(this.req, { + length: this.length, + limit: '1mb', + encoding: 'utf8' + }) +}) +``` + +### getRawBody(stream, [options], [callback]) + +Returns a thunk for yielding with generators. + +Options: + +- `length` - The length length of the stream. + If the contents of the stream do not add up to this length, + an `400` error code is returned. +- `limit` - The byte limit of the body. + If the body ends up being larger than this limit, + a `413` error code is returned. +- `encoding` - The requested encoding. + By default, a `Buffer` instance will be returned. + Most likely, you want `utf8`. + You can use any type of encoding supported by [StringDecoder](http://nodejs.org/api/string_decoder.html). + You can also pass `true` which sets it to the default `utf8` + +`callback(err, res)`: + +- `err` - the following attributes will be defined if applicable: + + - `limit` - the limit in bytes + - `length` and `expected` - the expected length of the stream + - `received` - the received bytes + - `status` and `statusCode` - the corresponding status code for the error + - `type` - either `entity.too.large`, `request.size.invalid`, or `stream.encoding.set` + +- `res` - the result, either as a `String` if an encoding was set or a `Buffer` otherwise. + +If an error occurs, the stream will be paused, +and you are responsible for correctly disposing the stream. +For HTTP requests, no handling is required if you send a response. +For streams that use file descriptors, you should `stream.destroy()` or `stream.close()` to prevent leaks. + +## License + +The MIT License (MIT) + +Copyright (c) 2013 Jonathan Ong me@jongleberry.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/express/node_modules/connect/node_modules/raw-body/index.js b/node_modules/express/node_modules/connect/node_modules/raw-body/index.js new file mode 100644 index 00000000..b1798654 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/index.js @@ -0,0 +1,160 @@ +var StringDecoder = require('string_decoder').StringDecoder +var bytes = require('bytes') + +module.exports = function (stream, options, done) { + if (typeof options === 'function') { + done = options + options = {} + } else if (!options) { + options = {} + } + + // convert the limit to an integer + var limit = null + if (typeof options.limit === 'number') + limit = options.limit + if (typeof options.limit === 'string') + limit = bytes(options.limit) + + // convert the expected length to an integer + var length = null + if (!isNaN(options.length)) + length = parseInt(options.length, 10) + + // check the length and limit options. + // note: we intentionally leave the stream paused, + // so users should handle the stream themselves. + if (limit !== null && length !== null && length > limit) { + if (typeof stream.pause === 'function') + stream.pause() + + process.nextTick(function () { + var err = makeError('request entity too large', 'entity.too.large') + err.status = err.statusCode = 413 + err.length = err.expected = length + err.limit = limit + done(err) + }) + return defer + } + + var state = stream._readableState + // streams2+: assert the stream encoding is buffer. + if (state && state.encoding != null) { + if (typeof stream.pause === 'function') + stream.pause() + + process.nextTick(function () { + var err = makeError('stream encoding should not be set', + 'stream.encoding.set') + // developer error + err.status = err.statusCode = 500 + done(err) + }) + return defer + } + + var received = 0 + // note: we delegate any invalid encodings to the constructor + var decoder = options.encoding + ? new StringDecoder(options.encoding === true ? 'utf8' : options.encoding) + : null + var buffer = decoder + ? '' + : [] + + stream.on('data', onData) + stream.once('end', onEnd) + stream.once('error', onEnd) + stream.once('close', cleanup) + + return defer + + // yieldable support + function defer(fn) { + done = fn + } + + function onData(chunk) { + received += chunk.length + decoder + ? buffer += decoder.write(chunk) + : buffer.push(chunk) + + if (limit !== null && received > limit) { + if (typeof stream.pause === 'function') + stream.pause() + var err = makeError('request entity too large', 'entity.too.large') + err.status = err.statusCode = 413 + err.received = received + err.limit = limit + done(err) + cleanup() + } + } + + function onEnd(err) { + if (err) { + if (typeof stream.pause === 'function') + stream.pause() + done(err) + } else if (length !== null && received !== length) { + err = makeError('request size did not match content length', + 'request.size.invalid') + err.status = err.statusCode = 400 + err.received = received + err.length = err.expected = length + done(err) + } else { + done(null, decoder + ? buffer + endStringDecoder(decoder) + : Buffer.concat(buffer) + ) + } + + cleanup() + } + + function cleanup() { + received = buffer = null + + stream.removeListener('data', onData) + stream.removeListener('end', onEnd) + stream.removeListener('error', onEnd) + stream.removeListener('close', cleanup) + } +} + +// to create serializable errors you must re-set message so +// that it is enumerable and you must re configure the type +// property so that is writable and enumerable +function makeError(message, type) { + var error = new Error() + error.message = message + Object.defineProperty(error, 'type', { + value: type, + enumerable: true, + writable: true, + configurable: true + }) + return error +} + +// https://github.com/Raynos/body/blob/2512ced39e31776e5a2f7492b907330badac3a40/index.js#L72 +// bug fix for missing `StringDecoder.end` in v0.8.x +function endStringDecoder(decoder) { + if (decoder.end) { + return decoder.end() + } + + var res = "" + + if (decoder.charReceived) { + var cr = decoder.charReceived + var buf = decoder.charBuffer + var enc = decoder.encoding + res += buf.slice(0, cr).toString(enc) + } + + return res +} diff --git a/node_modules/express/node_modules/connect/node_modules/raw-body/package.json b/node_modules/express/node_modules/connect/node_modules/raw-body/package.json new file mode 100644 index 00000000..9f080c17 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/raw-body/package.json @@ -0,0 +1,45 @@ +{ + "name": "raw-body", + "description": "Get and validate the raw body of a readable stream.", + "version": "1.1.2", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/stream-utils/raw-body.git" + }, + "bugs": { + "url": "https://github.com/stream-utils/raw-body/issues" + }, + "dependencies": { + "bytes": "~0.2.1" + }, + "devDependencies": { + "readable-stream": "~1.0.17", + "co": "2", + "gnode": "~0.0.4", + "mocha": "~1.14.0", + "through": "~2.3.4", + "request": "~2.27.0", + "assert-tap": "~0.1.4" + }, + "scripts": { + "test": "NODE=gnode make test && node ./test/acceptance.js" + }, + "engines": { + "node": ">= 0.8.0" + }, + "readme": "# Raw Body [![Build Status](https://travis-ci.org/stream-utils/raw-body.png)](https://travis-ci.org/stream-utils/raw-body)\n\nGets the entire buffer of a stream either as a `Buffer` or a string.\nValidates the stream's length against an expected length and maximum limit.\nIdeal for parsing request bodies.\n\n## API\n\n```js\nvar getRawBody = require('raw-body')\n\napp.use(function (req, res, next) {\n getRawBody(req, {\n length: req.headers['content-length'],\n limit: '1mb',\n encoding: 'utf8'\n }, function (err, string) {\n if (err)\n return next(err)\n\n req.text = string\n next()\n })\n})\n```\n\nor in a Koa generator:\n\n```js\napp.use(function* (next) {\n var string = yield getRawBody(this.req, {\n length: this.length,\n limit: '1mb',\n encoding: 'utf8'\n })\n})\n```\n\n### getRawBody(stream, [options], [callback])\n\nReturns a thunk for yielding with generators.\n\nOptions:\n\n- `length` - The length length of the stream.\n If the contents of the stream do not add up to this length,\n an `400` error code is returned.\n- `limit` - The byte limit of the body.\n If the body ends up being larger than this limit,\n a `413` error code is returned.\n- `encoding` - The requested encoding.\n By default, a `Buffer` instance will be returned.\n Most likely, you want `utf8`.\n You can use any type of encoding supported by [StringDecoder](http://nodejs.org/api/string_decoder.html).\n You can also pass `true` which sets it to the default `utf8`\n\n`callback(err, res)`:\n\n- `err` - the following attributes will be defined if applicable:\n\n - `limit` - the limit in bytes\n - `length` and `expected` - the expected length of the stream\n - `received` - the received bytes\n - `status` and `statusCode` - the corresponding status code for the error\n - `type` - either `entity.too.large`, `request.size.invalid`, or `stream.encoding.set`\n\n- `res` - the result, either as a `String` if an encoding was set or a `Buffer` otherwise.\n\nIf an error occurs, the stream will be paused,\nand you are responsible for correctly disposing the stream.\nFor HTTP requests, no handling is required if you send a response.\nFor streams that use file descriptors, you should `stream.destroy()` or `stream.close()` to prevent leaks.\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Jonathan Ong me@jongleberry.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/stream-utils/raw-body", + "_id": "raw-body@1.1.2", + "dist": { + "shasum": "c74b3004dea5defd1696171106ac740ec31d62be" + }, + "_from": "raw-body@1.1.2", + "_resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz" +} diff --git a/node_modules/express/node_modules/connect/node_modules/uid2/LICENSE b/node_modules/express/node_modules/connect/node_modules/uid2/LICENSE new file mode 100644 index 00000000..bdfab69b --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/uid2/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Marco Aurelio + +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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/uid2/index.js b/node_modules/express/node_modules/connect/node_modules/uid2/index.js new file mode 100644 index 00000000..6240b308 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/uid2/index.js @@ -0,0 +1,55 @@ +/** + * Module dependencies + */ + +var crypto = require('crypto'); + +/** + * 62 characters in the ascii range that can be used in URLs without special + * encoding. + */ +var UIDCHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +/** + * Make a Buffer into a string ready for use in URLs + * + * @param {String} + * @returns {String} + * @api private + */ +function tostr(bytes) { + var chars, r, i; + + r = []; + for (i = 0; i < bytes.length; i++) { + r.push(UIDCHARS[bytes[i] % UIDCHARS.length]); + } + + return r.join(''); +} + +/** + * Generate an Unique Id + * + * @param {Number} length The number of chars of the uid + * @param {Number} cb (optional) Callback for async uid generation + * @api public + */ + +function uid(length, cb) { + + if (typeof cb === 'undefined') { + return tostr(crypto.pseudoRandomBytes(length)); + } else { + crypto.pseudoRandomBytes(length, function(err, bytes) { + if (err) return cb(err); + cb(null, tostr(bytes)); + }) + } +} + +/** + * Exports + */ + +module.exports = uid; diff --git a/node_modules/express/node_modules/connect/node_modules/uid2/package.json b/node_modules/express/node_modules/connect/node_modules/uid2/package.json new file mode 100644 index 00000000..08af7a10 --- /dev/null +++ b/node_modules/express/node_modules/connect/node_modules/uid2/package.json @@ -0,0 +1,16 @@ +{ + "name": "uid2", + "description": "strong uid", + "tags": [ + "uid" + ], + "version": "0.0.3", + "dependencies": {}, + "readme": "ERROR: No README data found!", + "_id": "uid2@0.0.3", + "dist": { + "shasum": "837bfbe18583ae394e1e2b803f8bc13c47f942ef" + }, + "_from": "uid2@0.0.3", + "_resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" +} diff --git a/node_modules/express/node_modules/connect/package.json b/node_modules/express/node_modules/connect/package.json new file mode 100644 index 00000000..1ac08cc4 --- /dev/null +++ b/node_modules/express/node_modules/connect/package.json @@ -0,0 +1,69 @@ +{ + "name": "connect", + "version": "2.12.0", + "description": "High performance middleware framework", + "keywords": [ + "framework", + "web", + "middleware", + "connect", + "rack" + ], + "repository": { + "type": "git", + "url": "git://github.com/senchalabs/connect.git" + }, + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "dependencies": { + "batch": "0.5.0", + "qs": "0.6.6", + "cookie-signature": "1.0.1", + "buffer-crc32": "0.2.1", + "cookie": "0.1.0", + "send": "0.1.4", + "bytes": "0.2.1", + "fresh": "0.2.0", + "pause": "0.0.1", + "uid2": "0.0.3", + "debug": ">= 0.7.3 < 1", + "methods": "0.1.0", + "raw-body": "1.1.2", + "negotiator": "0.3.0", + "multiparty": "2.2.0" + }, + "devDependencies": { + "should": ">= 2.0.2 < 3", + "mocha": ">= 1.13.0 < 2", + "jade": ">= 0.35.0 < 1", + "dox": ">= 0.4.4 < 1" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/senchalabs/connect/master/LICENSE" + } + ], + "main": "index", + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "test": "make" + }, + "readme": "# Connect [![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect)\n\n Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance \"plugins\" known as _middleware_.\n\n Connect is bundled with over _20_ commonly used middleware, including\n a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/).\n\n```js\nvar connect = require('connect')\n , http = require('http');\n\nvar app = connect()\n .use(connect.favicon())\n .use(connect.logger('dev'))\n .use(connect.static('public'))\n .use(connect.directory('public'))\n .use(connect.cookieParser())\n .use(connect.session({ secret: 'my secret here' }))\n .use(function(req, res){\n res.end('Hello from Connect!\\n');\n });\n\nhttp.createServer(app).listen(3000);\n```\n\n## Middleware\n\n - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html)\n - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html)\n - [compress](http://www.senchalabs.org/connect/compress.html)\n - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html)\n - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html)\n - [csrf](http://www.senchalabs.org/connect/csrf.html)\n - [directory](http://www.senchalabs.org/connect/directory.html)\n - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html)\n - [favicon](http://www.senchalabs.org/connect/favicon.html)\n - [json](http://www.senchalabs.org/connect/json.html)\n - [limit](http://www.senchalabs.org/connect/limit.html)\n - [logger](http://www.senchalabs.org/connect/logger.html)\n - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html)\n - [multipart](http://www.senchalabs.org/connect/multipart.html)\n - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html)\n - [query](http://www.senchalabs.org/connect/query.html)\n - [responseTime](http://www.senchalabs.org/connect/responseTime.html)\n - [session](http://www.senchalabs.org/connect/session.html)\n - [static](http://www.senchalabs.org/connect/static.html)\n - [staticCache](http://www.senchalabs.org/connect/staticCache.html)\n - [subdomains](http://www.senchalabs.org/connect/subdomains.html)\n - [vhost](http://www.senchalabs.org/connect/vhost.html)\n\n## Running Tests\n\nfirst:\n\n $ npm install -d\n\nthen:\n\n $ make test\n\n## Contributors\n\n https://github.com/senchalabs/connect/graphs/contributors\n\n## Node Compatibility\n\n Connect `< 1.x` is compatible with node 0.2.x\n\n\n Connect `1.x` is compatible with node 0.4.x\n\n\n Connect `2.x` is compatible with node 0.6.x\n\n\n Connect (_master_) is compatible with node 0.8.x\n\n## CLA\n\n [http://sencha.com/cla](http://sencha.com/cla)\n\n## License\n\nView the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/).\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/senchalabs/connect/issues" + }, + "homepage": "https://github.com/senchalabs/connect", + "_id": "connect@2.12.0", + "dist": { + "shasum": "31d8fa0dcacdf1908d822bd2923be8a2d2a7ed9a" + }, + "_from": "connect@2.12.0", + "_resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz" +} diff --git a/node_modules/express/node_modules/cookie-signature/.npmignore b/node_modules/express/node_modules/cookie-signature/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/express/node_modules/cookie-signature/History.md b/node_modules/express/node_modules/cookie-signature/History.md new file mode 100644 index 00000000..9e301799 --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/History.md @@ -0,0 +1,11 @@ + +1.0.1 / 2013-04-15 +================== + + * Revert "Changed underlying HMAC algo. to sha512." + * Revert "Fix for timing attacks on MAC verification." + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/node_modules/cookie-signature/Makefile b/node_modules/express/node_modules/cookie-signature/Makefile new file mode 100644 index 00000000..4e9c8d36 --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --require should \ + --reporter spec + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/cookie-signature/Readme.md b/node_modules/express/node_modules/cookie-signature/Readme.md new file mode 100644 index 00000000..2559e841 --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/Readme.md @@ -0,0 +1,42 @@ + +# cookie-signature + + Sign and unsign cookies. + +## Example + +```js +var cookie = require('cookie-signature'); + +var val = cookie.sign('hello', 'tobiiscool'); +val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); + +var val = cookie.sign('hello', 'tobiiscool'); +cookie.unsign(val, 'tobiiscool').should.equal('hello'); +cookie.unsign(val, 'luna').should.be.false; +``` + +## License + +(The MIT License) + +Copyright (c) 2012 LearnBoost <tj@learnboost.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. \ No newline at end of file diff --git a/node_modules/express/node_modules/cookie-signature/index.js b/node_modules/express/node_modules/cookie-signature/index.js new file mode 100644 index 00000000..ed62814e --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/index.js @@ -0,0 +1,42 @@ + +/** + * Module dependencies. + */ + +var crypto = require('crypto'); + +/** + * Sign the given `val` with `secret`. + * + * @param {String} val + * @param {String} secret + * @return {String} + * @api private + */ + +exports.sign = function(val, secret){ + if ('string' != typeof val) throw new TypeError('cookie required'); + if ('string' != typeof secret) throw new TypeError('secret required'); + return val + '.' + crypto + .createHmac('sha256', secret) + .update(val) + .digest('base64') + .replace(/\=+$/, ''); +}; + +/** + * Unsign and decode the given `val` with `secret`, + * returning `false` if the signature is invalid. + * + * @param {String} val + * @param {String} secret + * @return {String|Boolean} + * @api private + */ + +exports.unsign = function(val, secret){ + if ('string' != typeof val) throw new TypeError('cookie required'); + if ('string' != typeof secret) throw new TypeError('secret required'); + var str = val.slice(0, val.lastIndexOf('.')); + return exports.sign(str, secret) == val ? str : false; +}; diff --git a/node_modules/express/node_modules/cookie-signature/package.json b/node_modules/express/node_modules/cookie-signature/package.json new file mode 100644 index 00000000..5203d81a --- /dev/null +++ b/node_modules/express/node_modules/cookie-signature/package.json @@ -0,0 +1,28 @@ +{ + "name": "cookie-signature", + "version": "1.0.1", + "description": "Sign and unsign cookies", + "keywords": [ + "cookie", + "sign", + "unsign" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@learnboost.com" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "main": "index", + "readme": "\n# cookie-signature\n\n Sign and unsign cookies.\n\n## Example\n\n```js\nvar cookie = require('cookie-signature');\n\nvar val = cookie.sign('hello', 'tobiiscool');\nval.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI');\n\nvar val = cookie.sign('hello', 'tobiiscool');\ncookie.unsign(val, 'tobiiscool').should.equal('hello');\ncookie.unsign(val, 'luna').should.be.false;\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 LearnBoost <tj@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "_id": "cookie-signature@1.0.1", + "dist": { + "shasum": "44e072148af01e6e8e24afbf12690d68ae698ecb" + }, + "_from": "cookie-signature@1.0.1", + "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" +} diff --git a/node_modules/express/node_modules/cookie/.npmignore b/node_modules/express/node_modules/cookie/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/express/node_modules/cookie/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/express/node_modules/cookie/.travis.yml b/node_modules/express/node_modules/cookie/.travis.yml new file mode 100644 index 00000000..9400c118 --- /dev/null +++ b/node_modules/express/node_modules/cookie/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - "0.6" + - "0.8" + - "0.10" diff --git a/node_modules/express/node_modules/cookie/LICENSE b/node_modules/express/node_modules/cookie/LICENSE new file mode 100644 index 00000000..249d9def --- /dev/null +++ b/node_modules/express/node_modules/cookie/LICENSE @@ -0,0 +1,9 @@ +// MIT License + +Copyright (C) Roman Shtylman + +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/express/node_modules/cookie/README.md b/node_modules/express/node_modules/cookie/README.md new file mode 100644 index 00000000..5187ed1c --- /dev/null +++ b/node_modules/express/node_modules/cookie/README.md @@ -0,0 +1,44 @@ +# cookie [![Build Status](https://secure.travis-ci.org/shtylman/node-cookie.png?branch=master)](http://travis-ci.org/shtylman/node-cookie) # + +cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. + +See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. + +## how? + +``` +npm install cookie +``` + +```javascript +var cookie = require('cookie'); + +var hdr = cookie.serialize('foo', 'bar'); +// hdr = 'foo=bar'; + +var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); +// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; +``` + +## more + +The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. + +### path +> cookie path + +### expires +> absolute expiration date for the cookie (Date object) + +### maxAge +> relative max age of the cookie from when the client receives it (seconds) + +### domain +> domain for the cookie + +### secure +> true or false + +### httpOnly +> true or false + diff --git a/node_modules/express/node_modules/cookie/index.js b/node_modules/express/node_modules/cookie/index.js new file mode 100644 index 00000000..16bdb65d --- /dev/null +++ b/node_modules/express/node_modules/cookie/index.js @@ -0,0 +1,70 @@ + +/// Serialize the a name value pair into a cookie string suitable for +/// http headers. An optional options object specified cookie parameters +/// +/// serialize('foo', 'bar', { httpOnly: true }) +/// => "foo=bar; httpOnly" +/// +/// @param {String} name +/// @param {String} val +/// @param {Object} options +/// @return {String} +var serialize = function(name, val, opt){ + opt = opt || {}; + var enc = opt.encode || encode; + var pairs = [name + '=' + enc(val)]; + + if (opt.maxAge) pairs.push('Max-Age=' + opt.maxAge); + if (opt.domain) pairs.push('Domain=' + opt.domain); + if (opt.path) pairs.push('Path=' + opt.path); + if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); + if (opt.httpOnly) pairs.push('HttpOnly'); + if (opt.secure) pairs.push('Secure'); + + return pairs.join('; '); +}; + +/// Parse the given cookie header string into an object +/// The object has the various cookies as keys(names) => values +/// @param {String} str +/// @return {Object} +var parse = function(str, opt) { + opt = opt || {}; + var obj = {} + var pairs = str.split(/[;,] */); + var dec = opt.decode || decode; + + pairs.forEach(function(pair) { + var eq_idx = pair.indexOf('=') + + // skip things that don't look like key=value + if (eq_idx < 0) { + return; + } + + var key = pair.substr(0, eq_idx).trim() + var val = pair.substr(++eq_idx, pair.length).trim(); + + // quoted values + if ('"' == val[0]) { + val = val.slice(1, -1); + } + + // only assign once + if (undefined == obj[key]) { + try { + obj[key] = dec(val); + } catch (e) { + obj[key] = val; + } + } + }); + + return obj; +}; + +var encode = encodeURIComponent; +var decode = decodeURIComponent; + +module.exports.serialize = serialize; +module.exports.parse = parse; diff --git a/node_modules/express/node_modules/cookie/package.json b/node_modules/express/node_modules/cookie/package.json new file mode 100644 index 00000000..8da1c04e --- /dev/null +++ b/node_modules/express/node_modules/cookie/package.json @@ -0,0 +1,41 @@ +{ + "author": { + "name": "Roman Shtylman", + "email": "shtylman@gmail.com" + }, + "name": "cookie", + "description": "cookie parsing and serialization", + "version": "0.1.0", + "repository": { + "type": "git", + "url": "git://github.com/shtylman/node-cookie.git" + }, + "keywords": [ + "cookie", + "cookies" + ], + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "1.x.x" + }, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "readme": "# cookie [![Build Status](https://secure.travis-ci.org/shtylman/node-cookie.png?branch=master)](http://travis-ci.org/shtylman/node-cookie) #\n\ncookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers.\n\nSee [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies.\n\n## how?\n\n```\nnpm install cookie\n```\n\n```javascript\nvar cookie = require('cookie');\n\nvar hdr = cookie.serialize('foo', 'bar');\n// hdr = 'foo=bar';\n\nvar cookies = cookie.parse('foo=bar; cat=meow; dog=ruff');\n// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' };\n```\n\n## more\n\nThe serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values.\n\n### path\n> cookie path\n\n### expires\n> absolute expiration date for the cookie (Date object)\n\n### maxAge\n> relative max age of the cookie from when the client receives it (seconds)\n\n### domain\n> domain for the cookie\n\n### secure\n> true or false\n\n### httpOnly\n> true or false\n\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/shtylman/node-cookie/issues" + }, + "homepage": "https://github.com/shtylman/node-cookie", + "_id": "cookie@0.1.0", + "dist": { + "shasum": "90eb469ddce905c866de687efc43131d8801f9d0" + }, + "_from": "cookie@0.1.0", + "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz" +} diff --git a/node_modules/express/node_modules/cookie/test/mocha.opts b/node_modules/express/node_modules/cookie/test/mocha.opts new file mode 100644 index 00000000..e2bfcc5a --- /dev/null +++ b/node_modules/express/node_modules/cookie/test/mocha.opts @@ -0,0 +1 @@ +--ui qunit diff --git a/node_modules/express/node_modules/cookie/test/parse.js b/node_modules/express/node_modules/cookie/test/parse.js new file mode 100644 index 00000000..c6c27a20 --- /dev/null +++ b/node_modules/express/node_modules/cookie/test/parse.js @@ -0,0 +1,44 @@ + +var assert = require('assert'); + +var cookie = require('..'); + +suite('parse'); + +test('basic', function() { + assert.deepEqual({ foo: 'bar' }, cookie.parse('foo=bar')); + assert.deepEqual({ foo: '123' }, cookie.parse('foo=123')); +}); + +test('ignore spaces', function() { + assert.deepEqual({ FOO: 'bar', baz: 'raz' }, + cookie.parse('FOO = bar; baz = raz')); +}); + +test('escaping', function() { + assert.deepEqual({ foo: 'bar=123456789&name=Magic+Mouse' }, + cookie.parse('foo="bar=123456789&name=Magic+Mouse"')); + + assert.deepEqual({ email: ' ",;/' }, + cookie.parse('email=%20%22%2c%3b%2f')); +}); + +test('ignore escaping error and return original value', function() { + assert.deepEqual({ foo: '%1', bar: 'bar' }, cookie.parse('foo=%1;bar=bar')); +}); + +test('ignore non values', function() { + assert.deepEqual({ foo: '%1', bar: 'bar' }, cookie.parse('foo=%1;bar=bar;HttpOnly;Secure')); +}); + +test('unencoded', function() { + assert.deepEqual({ foo: 'bar=123456789&name=Magic+Mouse' }, + cookie.parse('foo="bar=123456789&name=Magic+Mouse"',{ + decode: function(value) { return value; } + })); + + assert.deepEqual({ email: '%20%22%2c%3b%2f' }, + cookie.parse('email=%20%22%2c%3b%2f',{ + decode: function(value) { return value; } + })); +}) diff --git a/node_modules/express/node_modules/cookie/test/serialize.js b/node_modules/express/node_modules/cookie/test/serialize.js new file mode 100644 index 00000000..86bb8c93 --- /dev/null +++ b/node_modules/express/node_modules/cookie/test/serialize.js @@ -0,0 +1,64 @@ +// builtin +var assert = require('assert'); + +var cookie = require('..'); + +suite('serialize'); + +test('basic', function() { + assert.equal('foo=bar', cookie.serialize('foo', 'bar')); + assert.equal('foo=bar%20baz', cookie.serialize('foo', 'bar baz')); +}); + +test('path', function() { + assert.equal('foo=bar; Path=/', cookie.serialize('foo', 'bar', { + path: '/' + })); +}); + +test('secure', function() { + assert.equal('foo=bar; Secure', cookie.serialize('foo', 'bar', { + secure: true + })); + + assert.equal('foo=bar', cookie.serialize('foo', 'bar', { + secure: false + })); +}); + +test('domain', function() { + assert.equal('foo=bar; Domain=example.com', cookie.serialize('foo', 'bar', { + domain: 'example.com' + })); +}); + +test('httpOnly', function() { + assert.equal('foo=bar; HttpOnly', cookie.serialize('foo', 'bar', { + httpOnly: true + })); +}); + +test('maxAge', function() { + assert.equal('foo=bar; Max-Age=1000', cookie.serialize('foo', 'bar', { + maxAge: 1000 + })); +}); + +test('escaping', function() { + assert.deepEqual('cat=%2B%20', cookie.serialize('cat', '+ ')); +}); + +test('parse->serialize', function() { + + assert.deepEqual({ cat: 'foo=123&name=baz five' }, cookie.parse( + cookie.serialize('cat', 'foo=123&name=baz five'))); + + assert.deepEqual({ cat: ' ";/' }, cookie.parse( + cookie.serialize('cat', ' ";/'))); +}); + +test('unencoded', function() { + assert.deepEqual('cat=+ ', cookie.serialize('cat', '+ ', { + encode: function(value) { return value; } + })); +}) diff --git a/node_modules/express/node_modules/debug/Readme.md b/node_modules/express/node_modules/debug/Readme.md new file mode 100644 index 00000000..c5a34e8b --- /dev/null +++ b/node_modules/express/node_modules/debug/Readme.md @@ -0,0 +1,115 @@ +# debug + + tiny node.js debugging utility modelled after node core's debugging technique. + +## Installation + +``` +$ npm install debug +``` + +## Usage + + With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', 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_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.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. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_ + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.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". + +## 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:". + +## Browser support + + Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + a('doing some work'); +}, 1200); +``` + +## License + +(The MIT License) + +Copyright (c) 2011 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/express/node_modules/debug/debug.js b/node_modules/express/node_modules/debug/debug.js new file mode 100644 index 00000000..509dc0de --- /dev/null +++ b/node_modules/express/node_modules/debug/debug.js @@ -0,0 +1,137 @@ + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + if (!debug.enabled(name)) return function(){}; + + return function(fmt){ + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (debug[name] || curr); + debug[name] = curr; + + fmt = name + + ' ' + + fmt + + ' +' + debug.humanize(ms); + + // This hackery is required for IE8 + // where `console.log` doesn't have 'apply' + window.console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); + } +} + +/** + * The currently active debug mode names. + */ + +debug.names = []; +debug.skips = []; + +/** + * Enables a debug mode by name. This can include modes + * separated by a colon and wildcards. + * + * @param {String} name + * @api public + */ + +debug.enable = function(name) { + try { + localStorage.debug = name; + } catch(e){} + + var split = (name || '').split(/[\s,]+/) + , len = split.length; + + for (var i = 0; i < len; i++) { + name = split[i].replace('*', '.*?'); + if (name[0] === '-') { + debug.skips.push(new RegExp('^' + name.substr(1) + '$')); + } + else { + debug.names.push(new RegExp('^' + name + '$')); + } + } +}; + +/** + * Disable debug output. + * + * @api public + */ + +debug.disable = function(){ + debug.enable(''); +}; + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +debug.humanize = function(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +}; + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +debug.enabled = function(name) { + for (var i = 0, len = debug.skips.length; i < len; i++) { + if (debug.skips[i].test(name)) { + return false; + } + } + for (var i = 0, len = debug.names.length; i < len; i++) { + if (debug.names[i].test(name)) { + return true; + } + } + return false; +}; + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +// persist + +try { + if (window.localStorage) debug.enable(localStorage.debug); +} catch(e){} diff --git a/node_modules/express/node_modules/debug/index.js b/node_modules/express/node_modules/debug/index.js new file mode 100644 index 00000000..e02c13b7 --- /dev/null +++ b/node_modules/express/node_modules/debug/index.js @@ -0,0 +1,5 @@ +if ('undefined' == typeof window) { + module.exports = require('./lib/debug'); +} else { + module.exports = require('./debug'); +} diff --git a/node_modules/express/node_modules/debug/lib/debug.js b/node_modules/express/node_modules/debug/lib/debug.js new file mode 100644 index 00000000..3b0a9183 --- /dev/null +++ b/node_modules/express/node_modules/debug/lib/debug.js @@ -0,0 +1,147 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Enabled debuggers. + */ + +var names = [] + , skips = []; + +(process.env.DEBUG || '') + .split(/[\s,]+/) + .forEach(function(name){ + name = name.replace('*', '.*?'); + if (name[0] === '-') { + skips.push(new RegExp('^' + name.substr(1) + '$')); + } else { + names.push(new RegExp('^' + name + '$')); + } + }); + +/** + * Colors. + */ + +var colors = [6, 2, 3, 4, 5, 1]; + +/** + * Previous debug() call. + */ + +var prev = {}; + +/** + * Previously assigned color. + */ + +var prevColor = 0; + +/** + * Is stdout a TTY? Colored output is disabled when `true`. + */ + +var isatty = tty.isatty(2); + +/** + * Select a color. + * + * @return {Number} + * @api private + */ + +function color() { + return colors[prevColor++ % colors.length]; +} + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +function humanize(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +} + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + function disabled(){} + disabled.enabled = false; + + var match = skips.some(function(re){ + return re.test(name); + }); + + if (match) return disabled; + + match = names.some(function(re){ + return re.test(name); + }); + + if (!match) return disabled; + var c = color(); + + function colored(fmt) { + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (prev[name] || curr); + prev[name] = curr; + + fmt = ' \u001b[9' + c + 'm' + name + ' ' + + '\u001b[3' + c + 'm\u001b[90m' + + fmt + '\u001b[3' + c + 'm' + + ' +' + humanize(ms) + '\u001b[0m'; + + console.error.apply(this, arguments); + } + + function plain(fmt) { + fmt = coerce(fmt); + + fmt = new Date().toUTCString() + + ' ' + name + ' ' + fmt; + console.error.apply(this, arguments); + } + + colored.enabled = plain.enabled = true; + + return isatty || process.env.DEBUG_COLORS + ? colored + : plain; +} + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/express/node_modules/debug/package.json b/node_modules/express/node_modules/debug/package.json new file mode 100644 index 00000000..24abce64 --- /dev/null +++ b/node_modules/express/node_modules/debug/package.json @@ -0,0 +1,46 @@ +{ + "name": "debug", + "version": "0.7.4", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*" + }, + "main": "lib/debug.js", + "browser": "./debug.js", + "engines": { + "node": "*" + }, + "files": [ + "lib/debug.js", + "debug.js", + "index.js" + ], + "component": { + "scripts": { + "debug/index.js": "index.js", + "debug/debug.js": "debug.js" + } + }, + "readme": "# debug\n\n tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n 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.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n \n## Conventions\n\n 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\". \n\n## Wildcards\n\n 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=*`.\n\n 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:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "homepage": "https://github.com/visionmedia/debug", + "_id": "debug@0.7.4", + "_from": "debug@>= 0.7.3 < 1" +} diff --git a/node_modules/express/node_modules/fresh/.npmignore b/node_modules/express/node_modules/fresh/.npmignore new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/node_modules/express/node_modules/fresh/.npmignore @@ -0,0 +1 @@ +test diff --git a/node_modules/express/node_modules/fresh/History.md b/node_modules/express/node_modules/fresh/History.md new file mode 100644 index 00000000..60a2903f --- /dev/null +++ b/node_modules/express/node_modules/fresh/History.md @@ -0,0 +1,5 @@ + +0.2.0 / 2013-08-11 +================== + + * fix: return false for no-cache diff --git a/node_modules/express/node_modules/fresh/Makefile b/node_modules/express/node_modules/fresh/Makefile new file mode 100644 index 00000000..8e8640f2 --- /dev/null +++ b/node_modules/express/node_modules/fresh/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --reporter spec \ + --require should + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/Readme.md b/node_modules/express/node_modules/fresh/Readme.md new file mode 100644 index 00000000..61366c57 --- /dev/null +++ b/node_modules/express/node_modules/fresh/Readme.md @@ -0,0 +1,57 @@ + +# node-fresh + + HTTP response freshness testing + +## fresh(req, res) + + Check freshness of `req` and `res` headers. + + When the cache is "fresh" __true__ is returned, + otherwise __false__ is returned to indicate that + the cache is now stale. + +## Example: + +```js +var req = { 'if-none-match': 'tobi' }; +var res = { 'etag': 'luna' }; +fresh(req, res); +// => false + +var req = { 'if-none-match': 'tobi' }; +var res = { 'etag': 'tobi' }; +fresh(req, res); +// => true +``` + +## Installation + +``` +$ npm install fresh +``` + +## License + +(The MIT License) + +Copyright (c) 2012 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. \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/index.js b/node_modules/express/node_modules/fresh/index.js new file mode 100644 index 00000000..9c3f47d1 --- /dev/null +++ b/node_modules/express/node_modules/fresh/index.js @@ -0,0 +1,53 @@ + +/** + * Expose `fresh()`. + */ + +module.exports = fresh; + +/** + * Check freshness of `req` and `res` headers. + * + * When the cache is "fresh" __true__ is returned, + * otherwise __false__ is returned to indicate that + * the cache is now stale. + * + * @param {Object} req + * @param {Object} res + * @return {Boolean} + * @api public + */ + +function fresh(req, res) { + // defaults + var etagMatches = true; + var notModified = true; + + // fields + var modifiedSince = req['if-modified-since']; + var noneMatch = req['if-none-match']; + var lastModified = res['last-modified']; + var etag = res['etag']; + var cc = req['cache-control']; + + // unconditional request + if (!modifiedSince && !noneMatch) return false; + + // check for no-cache cache request directive + if (cc && cc.indexOf('no-cache') !== -1) return false; + + // parse if-none-match + if (noneMatch) noneMatch = noneMatch.split(/ *, */); + + // if-none-match + if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; + + // if-modified-since + if (modifiedSince) { + modifiedSince = new Date(modifiedSince); + lastModified = new Date(lastModified); + notModified = lastModified <= modifiedSince; + } + + return !! (etagMatches && notModified); +} \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/package.json b/node_modules/express/node_modules/fresh/package.json new file mode 100644 index 00000000..8300673a --- /dev/null +++ b/node_modules/express/node_modules/fresh/package.json @@ -0,0 +1,32 @@ +{ + "name": "fresh", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "description": "HTTP response freshness testing", + "version": "0.2.0", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/node-fresh.git" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "readme": "\n# node-fresh\n\n HTTP response freshness testing\n\n## fresh(req, res)\n\n Check freshness of `req` and `res` headers.\n\n When the cache is \"fresh\" __true__ is returned,\n otherwise __false__ is returned to indicate that\n the cache is now stale.\n\n## Example:\n\n```js\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'luna' };\nfresh(req, res);\n// => false\n\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'tobi' };\nfresh(req, res);\n// => true\n```\n\n## Installation\n\n```\n$ npm install fresh\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/node-fresh/issues" + }, + "homepage": "https://github.com/visionmedia/node-fresh", + "_id": "fresh@0.2.0", + "dist": { + "shasum": "bfd9402cf3df12c4a4c310c79f99a3dde13d34a7" + }, + "_from": "fresh@0.2.0", + "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz" +} diff --git a/node_modules/express/node_modules/merge-descriptors/.npmignore b/node_modules/express/node_modules/merge-descriptors/.npmignore new file mode 100644 index 00000000..f62e6050 --- /dev/null +++ b/node_modules/express/node_modules/merge-descriptors/.npmignore @@ -0,0 +1,59 @@ +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store* +ehthumbs.db +Icon? +Thumbs.db + +# Node.js # +########### +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +node_modules +npm-debug.log + +# Components # +############## + +/build +/components +/vendors \ No newline at end of file diff --git a/node_modules/express/node_modules/merge-descriptors/README.md b/node_modules/express/node_modules/merge-descriptors/README.md new file mode 100644 index 00000000..34d715df --- /dev/null +++ b/node_modules/express/node_modules/merge-descriptors/README.md @@ -0,0 +1,49 @@ +# Merge Descriptors [![Build Status](https://travis-ci.org/jonathanong/merge-descriptors.png)](https://travis-ci.org/jonathanong/merge-descriptors) + +Merge objects using descriptors. + +```js +var thing = { + get name() { + return 'jon' + } +} + +var animal = { + +} + +merge(animal, thing) + +animal.name === 'jon' +``` + +## API + +### merge(destination, source) + +Overwrites `destination`'s descriptors with `source`'s. + +## License + +The MIT License (MIT) + +Copyright (c) 2013 Jonathan Ong me@jongleberry.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. \ No newline at end of file diff --git a/node_modules/express/node_modules/merge-descriptors/component.json b/node_modules/express/node_modules/merge-descriptors/component.json new file mode 100644 index 00000000..26b1b8e8 --- /dev/null +++ b/node_modules/express/node_modules/merge-descriptors/component.json @@ -0,0 +1,10 @@ +{ + "name": "merge-descriptors", + "description": "Merge objects using descriptors", + "version": "0.0.1", + "scripts": [ + "index.js" + ], + "repo": "jonathanong/merge-descriptors", + "license": "MIT" +} \ No newline at end of file diff --git a/node_modules/express/node_modules/merge-descriptors/index.js b/node_modules/express/node_modules/merge-descriptors/index.js new file mode 100644 index 00000000..e4e23793 --- /dev/null +++ b/node_modules/express/node_modules/merge-descriptors/index.js @@ -0,0 +1,8 @@ +module.exports = function (dest, src) { + Object.getOwnPropertyNames(src).forEach(function (name) { + var descriptor = Object.getOwnPropertyDescriptor(src, name) + Object.defineProperty(dest, name, descriptor) + }) + + return dest +} \ No newline at end of file diff --git a/node_modules/express/node_modules/merge-descriptors/package.json b/node_modules/express/node_modules/merge-descriptors/package.json new file mode 100644 index 00000000..059520b1 --- /dev/null +++ b/node_modules/express/node_modules/merge-descriptors/package.json @@ -0,0 +1,30 @@ +{ + "name": "merge-descriptors", + "description": "Merge objects using descriptors", + "version": "0.0.1", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/jonathanong/merge-descriptors.git" + }, + "bugs": { + "url": "https://github.com/jonathanong/merge-descriptors/issues" + }, + "scripts": { + "test": "make test;" + }, + "readme": "# Merge Descriptors [![Build Status](https://travis-ci.org/jonathanong/merge-descriptors.png)](https://travis-ci.org/jonathanong/merge-descriptors)\n\nMerge objects using descriptors.\n\n```js\nvar thing = {\n get name() {\n return 'jon'\n }\n}\n\nvar animal = {\n\n}\n\nmerge(animal, thing)\n\nanimal.name === 'jon'\n```\n\n## API\n\n### merge(destination, source)\n\nOverwrites `destination`'s descriptors with `source`'s.\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Jonathan Ong me@jongleberry.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.", + "readmeFilename": "README.md", + "homepage": "https://github.com/jonathanong/merge-descriptors", + "_id": "merge-descriptors@0.0.1", + "dist": { + "shasum": "2ff0980c924cf81d0b5d1fb601177cb8bb56c0d0" + }, + "_from": "merge-descriptors@0.0.1", + "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.1.tgz" +} diff --git a/node_modules/express/node_modules/methods/History.md b/node_modules/express/node_modules/methods/History.md new file mode 100644 index 00000000..1d0e229f --- /dev/null +++ b/node_modules/express/node_modules/methods/History.md @@ -0,0 +1,5 @@ + +0.1.0 / 2013-10-28 +================== + + * add http.METHODS support diff --git a/node_modules/express/node_modules/methods/Readme.md b/node_modules/express/node_modules/methods/Readme.md new file mode 100644 index 00000000..ac0658e2 --- /dev/null +++ b/node_modules/express/node_modules/methods/Readme.md @@ -0,0 +1,4 @@ + +# Methods + + HTTP verbs that node core's parser supports. diff --git a/node_modules/express/node_modules/methods/index.js b/node_modules/express/node_modules/methods/index.js new file mode 100644 index 00000000..95b93f5f --- /dev/null +++ b/node_modules/express/node_modules/methods/index.js @@ -0,0 +1,37 @@ + +var http = require('http'); + +if (http.METHODS) { + module.exports = http.METHODS.map(function(method){ + return method.toLowerCase(); + }); + + return; +} + +module.exports = [ + 'get', + 'post', + 'put', + 'head', + 'delete', + 'options', + 'trace', + 'copy', + 'lock', + 'mkcol', + 'move', + 'propfind', + 'proppatch', + 'unlock', + 'report', + 'mkactivity', + 'checkout', + 'merge', + 'm-search', + 'notify', + 'subscribe', + 'unsubscribe', + 'patch', + 'search' +]; diff --git a/node_modules/express/node_modules/methods/package.json b/node_modules/express/node_modules/methods/package.json new file mode 100644 index 00000000..e328b9dd --- /dev/null +++ b/node_modules/express/node_modules/methods/package.json @@ -0,0 +1,33 @@ +{ + "name": "methods", + "version": "0.1.0", + "description": "HTTP methods that node supports", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "http", + "methods" + ], + "author": { + "name": "TJ Holowaychuk" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/node-methods.git" + }, + "readme": "\n# Methods\n\n HTTP verbs that node core's parser supports.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/node-methods/issues" + }, + "homepage": "https://github.com/visionmedia/node-methods", + "_id": "methods@0.1.0", + "dist": { + "shasum": "335d429eefd21b7bacf2e9c922a8d2bd14a30e4f" + }, + "_from": "methods@0.1.0", + "_resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz" +} diff --git a/node_modules/express/node_modules/mkdirp/.npmignore b/node_modules/express/node_modules/mkdirp/.npmignore new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.travis.yml b/node_modules/express/node_modules/mkdirp/.travis.yml new file mode 100644 index 00000000..84fd7ca2 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - 0.9 diff --git a/node_modules/express/node_modules/mkdirp/LICENSE b/node_modules/express/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000..432d1aeb --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +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/express/node_modules/mkdirp/examples/pow.js b/node_modules/express/node_modules/mkdirp/examples/pow.js new file mode 100644 index 00000000..e6924212 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/examples/pow.js @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/express/node_modules/mkdirp/index.js b/node_modules/express/node_modules/mkdirp/index.js new file mode 100644 index 00000000..fda6de8a --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/index.js @@ -0,0 +1,82 @@ +var path = require('path'); +var fs = require('fs'); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, mode, f, made) { + if (typeof mode === 'function' || mode === undefined) { + f = mode; + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + fs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), mode, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, mode, cb, made); + }); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + fs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} + +mkdirP.sync = function sync (p, mode, made) { + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + try { + fs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), mode, made); + sync(p, mode, made); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = fs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } + + return made; +}; diff --git a/node_modules/express/node_modules/mkdirp/package.json b/node_modules/express/node_modules/mkdirp/package.json new file mode 100644 index 00000000..221a22e3 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/package.json @@ -0,0 +1,34 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.5", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": [ + "mkdir", + "directory" + ], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "devDependencies": { + "tap": "~0.4.0" + }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.3.5", + "_from": "mkdirp@~0.3.5" +} diff --git a/node_modules/express/node_modules/mkdirp/readme.markdown b/node_modules/express/node_modules/mkdirp/readme.markdown new file mode 100644 index 00000000..83b0216a --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/readme.markdown @@ -0,0 +1,63 @@ +# mkdirp + +Like `mkdir -p`, but in node.js! + +[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) + +# example + +## pow.js + +```js +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); +``` + +Output + +``` +pow! +``` + +And now /tmp/foo/bar/baz exists, huzzah! + +# methods + +```js +var mkdirp = require('mkdirp'); +``` + +## mkdirp(dir, mode, cb) + +Create a new directory and any necessary subdirectories at `dir` with octal +permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +`cb(err, made)` fires with the error or the first directory `made` +that had to be created, if any. + +## mkdirp.sync(dir, mode) + +Synchronously create a new directory and any necessary subdirectories at `dir` +with octal permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +Returns the first directory that had to be created, if any. + +# install + +With [npm](http://npmjs.org) do: + +``` +npm install mkdirp +``` + +# license + +MIT diff --git a/node_modules/express/node_modules/mkdirp/test/chmod.js b/node_modules/express/node_modules/mkdirp/test/chmod.js new file mode 100644 index 00000000..520dcb8e --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/chmod.js @@ -0,0 +1,38 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +test('chmod-pre', function (t) { + var mode = 0744 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); + t.end(); + }); + }); +}); + +test('chmod', function (t) { + var mode = 0755 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.end(); + }); + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/clobber.js b/node_modules/express/node_modules/mkdirp/test/clobber.js new file mode 100644 index 00000000..0eb70998 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/clobber.js @@ -0,0 +1,37 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +// a file in the way +var itw = ps.slice(0, 3).join('/'); + + +test('clobber-pre', function (t) { + console.error("about to write to "+itw) + fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); + + fs.stat(itw, function (er, stat) { + t.ifError(er) + t.ok(stat && stat.isFile(), 'should be file') + t.end() + }) +}) + +test('clobber', function (t) { + t.plan(2); + mkdirp(file, 0755, function (err) { + t.ok(err); + t.equal(err.code, 'ENOTDIR'); + t.end(); + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/mkdirp.js b/node_modules/express/node_modules/mkdirp/test/mkdirp.js new file mode 100644 index 00000000..b07cd70c --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/mkdirp.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('woo', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm.js b/node_modules/express/node_modules/mkdirp/test/perm.js new file mode 100644 index 00000000..23a7abbd --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/perm.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('async perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); + +test('async root perm', function (t) { + mkdirp('/tmp', 0755, function (err) { + if (err) t.fail(err); + t.end(); + }); + t.end(); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm_sync.js b/node_modules/express/node_modules/mkdirp/test/perm_sync.js new file mode 100644 index 00000000..f685f609 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/perm_sync.js @@ -0,0 +1,39 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; + + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); + +test('sync root perm', function (t) { + t.plan(1); + + var file = '/tmp'; + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/race.js b/node_modules/express/node_modules/mkdirp/test/race.js new file mode 100644 index 00000000..96a04476 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/race.js @@ -0,0 +1,41 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('race', function (t) { + t.plan(4); + var ps = [ '', 'tmp' ]; + + for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); + } + var file = ps.join('/'); + + var res = 2; + mk(file, function () { + if (--res === 0) t.end(); + }); + + mk(file, function () { + if (--res === 0) t.end(); + }); + + function mk (file, cb) { + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + if (cb) cb(); + } + }) + }) + }); + } +}); diff --git a/node_modules/express/node_modules/mkdirp/test/rel.js b/node_modules/express/node_modules/mkdirp/test/rel.js new file mode 100644 index 00000000..79858243 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/rel.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('rel', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var cwd = process.cwd(); + process.chdir('/tmp'); + + var file = [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + process.chdir(cwd); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/return.js b/node_modules/express/node_modules/mkdirp/test/return.js new file mode 100644 index 00000000..bce68e56 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/return.js @@ -0,0 +1,25 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(4); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, '/tmp/' + x); + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, null); + }); + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/return_sync.js b/node_modules/express/node_modules/mkdirp/test/return_sync.js new file mode 100644 index 00000000..7c222d35 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/return_sync.js @@ -0,0 +1,24 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + // Note that this will throw on failure, which will fail the test. + var made = mkdirp.sync(file); + t.equal(made, '/tmp/' + x); + + // making the same file again should have no effect. + made = mkdirp.sync(file); + t.equal(made, null); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/root.js b/node_modules/express/node_modules/mkdirp/test/root.js new file mode 100644 index 00000000..97ad7a2f --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/root.js @@ -0,0 +1,18 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('root', function (t) { + // '/' on unix, 'c:/' on windows. + var file = path.resolve('/'); + + mkdirp(file, 0755, function (err) { + if (err) throw err + fs.stat(file, function (er, stat) { + if (er) throw er + t.ok(stat.isDirectory(), 'target is a directory'); + t.end(); + }) + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/sync.js b/node_modules/express/node_modules/mkdirp/test/sync.js new file mode 100644 index 00000000..7530cada --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/sync.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file, 0755); + } catch (err) { + t.fail(err); + return t.end(); + } + + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }); + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask.js b/node_modules/express/node_modules/mkdirp/test/umask.js new file mode 100644 index 00000000..64ccafe2 --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/umask.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('implicit mode from umask', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0777 & (~process.umask())); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask_sync.js b/node_modules/express/node_modules/mkdirp/test/umask_sync.js new file mode 100644 index 00000000..35bd5cbb --- /dev/null +++ b/node_modules/express/node_modules/mkdirp/test/umask_sync.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('umask sync modes', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file); + } catch (err) { + t.fail(err); + return t.end(); + } + + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, (0777 & (~process.umask()))); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }); + }); +}); diff --git a/node_modules/express/node_modules/range-parser/.npmignore b/node_modules/express/node_modules/range-parser/.npmignore new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/node_modules/express/node_modules/range-parser/.npmignore @@ -0,0 +1 @@ +test diff --git a/node_modules/express/node_modules/range-parser/History.md b/node_modules/express/node_modules/range-parser/History.md new file mode 100644 index 00000000..82df7b1e --- /dev/null +++ b/node_modules/express/node_modules/range-parser/History.md @@ -0,0 +1,15 @@ + +0.0.4 / 2012-06-17 +================== + + * changed: ret -1 for unsatisfiable and -2 when invalid + +0.0.3 / 2012-06-17 +================== + + * fix last-byte-pos default to len - 1 + +0.0.2 / 2012-06-14 +================== + + * add `.type` diff --git a/node_modules/express/node_modules/range-parser/Makefile b/node_modules/express/node_modules/range-parser/Makefile new file mode 100644 index 00000000..8e8640f2 --- /dev/null +++ b/node_modules/express/node_modules/range-parser/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --reporter spec \ + --require should + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/Readme.md b/node_modules/express/node_modules/range-parser/Readme.md new file mode 100644 index 00000000..b2a67fe8 --- /dev/null +++ b/node_modules/express/node_modules/range-parser/Readme.md @@ -0,0 +1,28 @@ + +# node-range-parser + + Range header field parser. + +## Example: + +```js +assert(-1 == parse(200, 'bytes=500-20')); +assert(-2 == parse(200, 'bytes=malformed')); +parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); +parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); +parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); +parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); +parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); +parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); +parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); +parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); +parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); +parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); +parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); +``` + +## Installation + +``` +$ npm install range-parser +``` \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/index.js b/node_modules/express/node_modules/range-parser/index.js new file mode 100644 index 00000000..9b0f7a8e --- /dev/null +++ b/node_modules/express/node_modules/range-parser/index.js @@ -0,0 +1,49 @@ + +/** + * Parse "Range" header `str` relative to the given file `size`. + * + * @param {Number} size + * @param {String} str + * @return {Array} + * @api public + */ + +module.exports = function(size, str){ + var valid = true; + var i = str.indexOf('='); + + if (-1 == i) return -2; + + var arr = str.slice(i + 1).split(',').map(function(range){ + var range = range.split('-') + , start = parseInt(range[0], 10) + , end = parseInt(range[1], 10); + + // -nnn + if (isNaN(start)) { + start = size - end; + end = size - 1; + // nnn- + } else if (isNaN(end)) { + end = size - 1; + } + + // limit last-byte-pos to current length + if (end > size - 1) end = size - 1; + + // invalid + if (isNaN(start) + || isNaN(end) + || start > end + || start < 0) valid = false; + + return { + start: start, + end: end + }; + }); + + arr.type = str.slice(0, i); + + return valid ? arr : -1; +}; \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/package.json b/node_modules/express/node_modules/range-parser/package.json new file mode 100644 index 00000000..0e048f77 --- /dev/null +++ b/node_modules/express/node_modules/range-parser/package.json @@ -0,0 +1,24 @@ +{ + "name": "range-parser", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "description": "Range header field string parser", + "version": "0.0.4", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "readme": "\n# node-range-parser\n\n Range header field parser.\n\n## Example:\n\n```js\nassert(-1 == parse(200, 'bytes=500-20'));\nassert(-2 == parse(200, 'bytes=malformed'));\nparse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }]));\nparse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }]));\nparse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }]));\nparse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }]));\nparse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }]));\nparse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }]));\nparse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }]));\nparse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }]));\nparse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }]));\n```\n\n## Installation\n\n```\n$ npm install range-parser\n```", + "readmeFilename": "Readme.md", + "_id": "range-parser@0.0.4", + "dist": { + "shasum": "c0427ffef51c10acba0782a46c9602e744ff620b" + }, + "_from": "range-parser@0.0.4", + "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" +} diff --git a/node_modules/express/node_modules/send/.npmignore b/node_modules/express/node_modules/send/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/express/node_modules/send/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/express/node_modules/send/History.md b/node_modules/express/node_modules/send/History.md new file mode 100644 index 00000000..55c4af74 --- /dev/null +++ b/node_modules/express/node_modules/send/History.md @@ -0,0 +1,40 @@ + +0.1.4 / 2013-08-11 +================== + + * update fresh + +0.1.3 / 2013-07-08 +================== + + * Revert "Fix fd leak" + +0.1.2 / 2013-07-03 +================== + + * Fix fd leak + +0.1.0 / 2012-08-25 +================== + + * add options parameter to send() that is passed to fs.createReadStream() [kanongil] + +0.0.4 / 2012-08-16 +================== + + * allow custom "Accept-Ranges" definition + +0.0.3 / 2012-07-16 +================== + + * fix normalization of the root directory. Closes #3 + +0.0.2 / 2012-07-09 +================== + + * add passing of req explicitly for now (YUCK) + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/node_modules/send/Makefile b/node_modules/express/node_modules/send/Makefile new file mode 100644 index 00000000..a9dcfd50 --- /dev/null +++ b/node_modules/express/node_modules/send/Makefile @@ -0,0 +1,8 @@ + +test: + @./node_modules/.bin/mocha \ + --require should \ + --reporter spec \ + --bail + +.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/send/Readme.md b/node_modules/express/node_modules/send/Readme.md new file mode 100644 index 00000000..ea7b2341 --- /dev/null +++ b/node_modules/express/node_modules/send/Readme.md @@ -0,0 +1,128 @@ +# send + + Send is Connect's `static()` extracted for generalized use, a streaming static file + server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. + +## Installation + + $ npm install send + +## Examples + + Small: + +```js +var http = require('http'); +var send = require('send'); + +var app = http.createServer(function(req, res){ + send(req, req.url).pipe(res); +}).listen(3000); +``` + + Serving from a root directory with custom error-handling: + +```js +var http = require('http'); +var send = require('send'); +var url = require('url'); + +var app = http.createServer(function(req, res){ + // your custom error-handling logic: + function error(err) { + res.statusCode = err.status || 500; + res.end(err.message); + } + + // your custom directory handling logic: + function redirect() { + res.statusCode = 301; + res.setHeader('Location', req.url + '/'); + res.end('Redirecting to ' + req.url + '/'); + } + + // transfer arbitrary files from within + // /www/example.com/public/* + send(req, url.parse(req.url).pathname) + .root('/www/example.com/public') + .on('error', error) + .on('directory', redirect) + .pipe(res); +}).listen(3000); +``` + +## API + +### Events + + - `error` an error occurred `(err)` + - `directory` a directory was requested + - `file` a file was requested `(path, stat)` + - `stream` file streaming has started `(stream)` + - `end` streaming has completed + +### .root(dir) + + Serve files relative to `path`. Aliased as `.from(dir)`. + +### .index(path) + + By default send supports "index.html" files, to disable this + invoke `.index(false)` or to supply a new index pass a string. + +### .maxage(ms) + + Provide a max-age in milliseconds for http caching, defaults to 0. + +### .hidden(bool) + + Enable or disable transfer of hidden files, defaults to false. + +## Error-handling + + By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. + +## Caching + + It does _not_ perform internal caching, you should use a reverse proxy cache such + as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). + +## Debugging + + To enable `debug()` instrumentation output export __DEBUG__: + +``` +$ DEBUG=send node app +``` + +## Running tests + +``` +$ npm install +$ make test +``` + +## License + +(The MIT License) + +Copyright (c) 2012 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/express/node_modules/send/index.js b/node_modules/express/node_modules/send/index.js new file mode 100644 index 00000000..f17158d8 --- /dev/null +++ b/node_modules/express/node_modules/send/index.js @@ -0,0 +1,2 @@ + +module.exports = require('./lib/send'); \ No newline at end of file diff --git a/node_modules/express/node_modules/send/lib/send.js b/node_modules/express/node_modules/send/lib/send.js new file mode 100644 index 00000000..a3d94a69 --- /dev/null +++ b/node_modules/express/node_modules/send/lib/send.js @@ -0,0 +1,474 @@ + +/** + * Module dependencies. + */ + +var debug = require('debug')('send') + , parseRange = require('range-parser') + , Stream = require('stream') + , mime = require('mime') + , fresh = require('fresh') + , path = require('path') + , http = require('http') + , fs = require('fs') + , basename = path.basename + , normalize = path.normalize + , join = path.join + , utils = require('./utils'); + +/** + * Expose `send`. + */ + +exports = module.exports = send; + +/** + * Expose mime module. + */ + +exports.mime = mime; + +/** + * Return a `SendStream` for `req` and `path`. + * + * @param {Request} req + * @param {String} path + * @param {Object} options + * @return {SendStream} + * @api public + */ + +function send(req, path, options) { + return new SendStream(req, path, options); +} + +/** + * Initialize a `SendStream` with the given `path`. + * + * Events: + * + * - `error` an error occurred + * - `stream` file streaming has started + * - `end` streaming has completed + * - `directory` a directory was requested + * + * @param {Request} req + * @param {String} path + * @param {Object} options + * @api private + */ + +function SendStream(req, path, options) { + var self = this; + this.req = req; + this.path = path; + this.options = options || {}; + this.maxage(0); + this.hidden(false); + this.index('index.html'); +} + +/** + * Inherits from `Stream.prototype`. + */ + +SendStream.prototype.__proto__ = Stream.prototype; + +/** + * Enable or disable "hidden" (dot) files. + * + * @param {Boolean} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.hidden = function(val){ + debug('hidden %s', val); + this._hidden = val; + return this; +}; + +/** + * Set index `path`, set to a falsy + * value to disable index support. + * + * @param {String|Boolean} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.index = function(path){ + debug('index %s', path); + this._index = path; + return this; +}; + +/** + * Set root `path`. + * + * @param {String} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.root = +SendStream.prototype.from = function(path){ + this._root = normalize(path); + return this; +}; + +/** + * Set max-age to `ms`. + * + * @param {Number} ms + * @return {SendStream} + * @api public + */ + +SendStream.prototype.maxage = function(ms){ + if (Infinity == ms) ms = 60 * 60 * 24 * 365 * 1000; + debug('max-age %d', ms); + this._maxage = ms; + return this; +}; + +/** + * Emit error with `status`. + * + * @param {Number} status + * @api private + */ + +SendStream.prototype.error = function(status, err){ + var res = this.res; + var msg = http.STATUS_CODES[status]; + err = err || new Error(msg); + err.status = status; + if (this.listeners('error').length) return this.emit('error', err); + res.statusCode = err.status; + res.end(msg); +}; + +/** + * Check if the pathname is potentially malicious. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isMalicious = function(){ + return !this._root && ~this.path.indexOf('..'); +}; + +/** + * Check if the pathname ends with "/". + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.hasTrailingSlash = function(){ + return '/' == this.path[this.path.length - 1]; +}; + +/** + * Check if the basename leads with ".". + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.hasLeadingDot = function(){ + return '.' == basename(this.path)[0]; +}; + +/** + * Check if this is a conditional GET request. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isConditionalGET = function(){ + return this.req.headers['if-none-match'] + || this.req.headers['if-modified-since']; +}; + +/** + * Strip content-* header fields. + * + * @api private + */ + +SendStream.prototype.removeContentHeaderFields = function(){ + var res = this.res; + Object.keys(res._headers).forEach(function(field){ + if (0 == field.indexOf('content')) { + res.removeHeader(field); + } + }); +}; + +/** + * Respond with 304 not modified. + * + * @api private + */ + +SendStream.prototype.notModified = function(){ + var res = this.res; + debug('not modified'); + this.removeContentHeaderFields(); + res.statusCode = 304; + res.end(); +}; + +/** + * Check if the request is cacheable, aka + * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isCachable = function(){ + var res = this.res; + return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; +}; + +/** + * Handle stat() error. + * + * @param {Error} err + * @api private + */ + +SendStream.prototype.onStatError = function(err){ + var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; + if (~notfound.indexOf(err.code)) return this.error(404, err); + this.error(500, err); +}; + +/** + * Check if the cache is fresh. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isFresh = function(){ + return fresh(this.req.headers, this.res._headers); +}; + +/** + * Redirect to `path`. + * + * @param {String} path + * @api private + */ + +SendStream.prototype.redirect = function(path){ + if (this.listeners('directory').length) return this.emit('directory'); + var res = this.res; + path += '/'; + res.statusCode = 301; + res.setHeader('Location', path); + res.end('Redirecting to ' + utils.escape(path)); +}; + +/** + * Pipe to `res. + * + * @param {Stream} res + * @return {Stream} res + * @api public + */ + +SendStream.prototype.pipe = function(res){ + var self = this + , args = arguments + , path = this.path + , root = this._root; + + // references + this.res = res; + + // invalid request uri + path = utils.decode(path); + if (-1 == path) return this.error(400); + + // null byte(s) + if (~path.indexOf('\0')) return this.error(400); + + // join / normalize from optional root dir + if (root) path = normalize(join(this._root, path)); + + // ".." is malicious without "root" + if (this.isMalicious()) return this.error(403); + + // malicious path + if (root && 0 != path.indexOf(root)) return this.error(403); + + // hidden file support + if (!this._hidden && this.hasLeadingDot()) return this.error(404); + + // index file support + if (this._index && this.hasTrailingSlash()) path += this._index; + + debug('stat "%s"', path); + fs.stat(path, function(err, stat){ + if (err) return self.onStatError(err); + if (stat.isDirectory()) return self.redirect(self.path); + self.emit('file', path, stat); + self.send(path, stat); + }); + + return res; +}; + +/** + * Transfer `path`. + * + * @param {String} path + * @api public + */ + +SendStream.prototype.send = function(path, stat){ + var options = this.options; + var len = stat.size; + var res = this.res; + var req = this.req; + var ranges = req.headers.range; + var offset = options.start || 0; + + // set header fields + this.setHeader(stat); + + // set content-type + this.type(path); + + // conditional GET support + if (this.isConditionalGET() + && this.isCachable() + && this.isFresh()) { + return this.notModified(); + } + + // adjust len to start/end options + len = Math.max(0, len - offset); + if (options.end !== undefined) { + var bytes = options.end - offset + 1; + if (len > bytes) len = bytes; + } + + // Range support + if (ranges) { + ranges = parseRange(len, ranges); + + // unsatisfiable + if (-1 == ranges) { + res.setHeader('Content-Range', 'bytes */' + stat.size); + return this.error(416); + } + + // valid (syntactically invalid ranges are treated as a regular response) + if (-2 != ranges) { + options.start = offset + ranges[0].start; + options.end = offset + ranges[0].end; + + // Content-Range + res.statusCode = 206; + res.setHeader('Content-Range', 'bytes ' + + ranges[0].start + + '-' + + ranges[0].end + + '/' + + len); + len = options.end - options.start + 1; + } + } + + // content-length + res.setHeader('Content-Length', len); + + // HEAD support + if ('HEAD' == req.method) return res.end(); + + this.stream(path, options); +}; + +/** + * Stream `path` to the response. + * + * @param {String} path + * @param {Object} options + * @api private + */ + +SendStream.prototype.stream = function(path, options){ + // TODO: this is all lame, refactor meeee + var self = this; + var res = this.res; + var req = this.req; + + // pipe + var stream = fs.createReadStream(path, options); + this.emit('stream', stream); + stream.pipe(res); + + // socket closed, done with the fd + req.on('close', stream.destroy.bind(stream)); + + // error handling code-smell + stream.on('error', function(err){ + // no hope in responding + if (res._header) { + console.error(err.stack); + req.destroy(); + return; + } + + // 500 + err.status = 500; + self.emit('error', err); + }); + + // end + stream.on('end', function(){ + self.emit('end'); + }); +}; + +/** + * Set content-type based on `path` + * if it hasn't been explicitly set. + * + * @param {String} path + * @api private + */ + +SendStream.prototype.type = function(path){ + var res = this.res; + if (res.getHeader('Content-Type')) return; + var type = mime.lookup(path); + var charset = mime.charsets.lookup(type); + debug('content-type %s', type); + res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); +}; + +/** + * Set reaponse header fields, most + * fields may be pre-defined. + * + * @param {Object} stat + * @api private + */ + +SendStream.prototype.setHeader = function(stat){ + var res = this.res; + if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); + if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat)); + if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); + if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (this._maxage / 1000)); + if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); +}; diff --git a/node_modules/express/node_modules/send/lib/utils.js b/node_modules/express/node_modules/send/lib/utils.js new file mode 100644 index 00000000..950e5a2c --- /dev/null +++ b/node_modules/express/node_modules/send/lib/utils.js @@ -0,0 +1,47 @@ + +/** + * Return an ETag in the form of `"-"` + * from the given `stat`. + * + * @param {Object} stat + * @return {String} + * @api private + */ + +exports.etag = function(stat) { + return '"' + stat.size + '-' + Number(stat.mtime) + '"'; +}; + +/** + * decodeURIComponent. + * + * Allows V8 to only deoptimize this fn instead of all + * of send(). + * + * @param {String} path + * @api private + */ + +exports.decode = function(path){ + try { + return decodeURIComponent(path); + } catch (err) { + return -1; + } +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; \ No newline at end of file diff --git a/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/node_modules/express/node_modules/send/node_modules/mime/LICENSE new file mode 100644 index 00000000..451fc455 --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +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/express/node_modules/send/node_modules/mime/README.md b/node_modules/express/node_modules/send/node_modules/mime/README.md new file mode 100644 index 00000000..6ca19bd1 --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/README.md @@ -0,0 +1,66 @@ +# mime + +Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. + +## Install + +Install with [npm](http://github.com/isaacs/npm): + + npm install mime + +## API - Queries + +### mime.lookup(path) +Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. + + var mime = require('mime'); + + mime.lookup('/path/to/file.txt'); // => 'text/plain' + mime.lookup('file.txt'); // => 'text/plain' + mime.lookup('.TXT'); // => 'text/plain' + mime.lookup('htm'); // => 'text/html' + +### mime.default_type +Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) + +### mime.extension(type) +Get the default extension for `type` + + mime.extension('text/html'); // => 'html' + mime.extension('application/octet-stream'); // => 'bin' + +### mime.charsets.lookup() + +Map mime-type to charset + + mime.charsets.lookup('text/plain'); // => 'UTF-8' + +(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) + +## API - Defining Custom Types + +The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). + +### mime.define() + +Add custom mime/extension mappings + + mime.define({ + 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], + 'application/x-my-type': ['x-mt', 'x-mtt'], + // etc ... + }); + + mime.lookup('x-sft'); // => 'text/x-some-format' + +The first entry in the extensions array is returned by `mime.extension()`. E.g. + + mime.extension('text/x-some-format'); // => 'x-sf' + +### mime.load(filepath) + +Load mappings from an Apache ".types" format file + + mime.load('./my_project.types'); + +The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/express/node_modules/send/node_modules/mime/mime.js b/node_modules/express/node_modules/send/node_modules/mime/mime.js new file mode 100644 index 00000000..48be0c5e --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/mime.js @@ -0,0 +1,114 @@ +var path = require('path'); +var fs = require('fs'); + +function Mime() { + // Map of extension -> mime type + this.types = Object.create(null); + + // Map of mime type -> extension + this.extensions = Object.create(null); +} + +/** + * Define mimetype -> extension mappings. Each key is a mime-type that maps + * to an array of extensions associated with the type. The first extension is + * used as the default extension for the type. + * + * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); + * + * @param map (Object) type definitions + */ +Mime.prototype.define = function (map) { + for (var type in map) { + var exts = map[type]; + + for (var i = 0; i < exts.length; i++) { + if (process.env.DEBUG_MIME && this.types[exts]) { + console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + + this.types[exts] + ' to ' + type); + } + + this.types[exts[i]] = type; + } + + // Default extension is the first one we encounter + if (!this.extensions[type]) { + this.extensions[type] = exts[0]; + } + } +}; + +/** + * Load an Apache2-style ".types" file + * + * This may be called multiple times (it's expected). Where files declare + * overlapping types/extensions, the last file wins. + * + * @param file (String) path of file to load. + */ +Mime.prototype.load = function(file) { + + this._loading = file; + // Read file and split into lines + var map = {}, + content = fs.readFileSync(file, 'ascii'), + lines = content.split(/[\r\n]+/); + + lines.forEach(function(line) { + // Clean up whitespace/comments, and split into fields + var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); + map[fields.shift()] = fields; + }); + + this.define(map); + + this._loading = null; +}; + +/** + * Lookup a mime type based on extension + */ +Mime.prototype.lookup = function(path, fallback) { + var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); + + return this.types[ext] || fallback || this.default_type; +}; + +/** + * Return file extension associated with a mime type + */ +Mime.prototype.extension = function(mimeType) { + var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); + return this.extensions[type]; +}; + +// Default instance +var mime = new Mime(); + +// Load local copy of +// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +mime.load(path.join(__dirname, 'types/mime.types')); + +// Load additional types from node.js community +mime.load(path.join(__dirname, 'types/node.types')); + +// Default type +mime.default_type = mime.lookup('bin'); + +// +// Additional API specific to the default instance +// + +mime.Mime = Mime; + +/** + * Lookup a charset based on mime type. + */ +mime.charsets = { + lookup: function(mimeType, fallback) { + // Assume text types are utf8 + return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; + } +}; + +module.exports = mime; diff --git a/node_modules/express/node_modules/send/node_modules/mime/package.json b/node_modules/express/node_modules/send/node_modules/mime/package.json new file mode 100644 index 00000000..a9759392 --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Robert Kieffer", + "email": "robert@broofa.com", + "url": "http://github.com/broofa" + }, + "contributors": [ + { + "name": "Benjamin Thomas", + "email": "benjamin@benjaminthomas.org", + "url": "http://github.com/bentomas" + } + ], + "dependencies": {}, + "description": "A comprehensive library for mime-type mapping", + "devDependencies": {}, + "keywords": [ + "util", + "mime" + ], + "main": "mime.js", + "name": "mime", + "repository": { + "url": "https://github.com/broofa/node-mime", + "type": "git" + }, + "version": "1.2.11", + "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/broofa/node-mime/issues" + }, + "homepage": "https://github.com/broofa/node-mime", + "_id": "mime@1.2.11", + "_from": "mime@~1.2.9" +} diff --git a/node_modules/express/node_modules/send/node_modules/mime/test.js b/node_modules/express/node_modules/send/node_modules/mime/test.js new file mode 100644 index 00000000..2cda1c7a --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/test.js @@ -0,0 +1,84 @@ +/** + * Usage: node test.js + */ + +var mime = require('./mime'); +var assert = require('assert'); +var path = require('path'); + +function eq(a, b) { + console.log('Test: ' + a + ' === ' + b); + assert.strictEqual.apply(null, arguments); +} + +console.log(Object.keys(mime.extensions).length + ' types'); +console.log(Object.keys(mime.types).length + ' extensions\n'); + +// +// Test mime lookups +// + +eq('text/plain', mime.lookup('text.txt')); // normal file +eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase +eq('text/plain', mime.lookup('dir/text.txt')); // dir + file +eq('text/plain', mime.lookup('.text.txt')); // hidden file +eq('text/plain', mime.lookup('.txt')); // nameless +eq('text/plain', mime.lookup('txt')); // extension-only +eq('text/plain', mime.lookup('/txt')); // extension-less () +eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less +eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized +eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default + +// +// Test extensions +// + +eq('txt', mime.extension(mime.types.text)); +eq('html', mime.extension(mime.types.htm)); +eq('bin', mime.extension('application/octet-stream')); +eq('bin', mime.extension('application/octet-stream ')); +eq('html', mime.extension(' text/html; charset=UTF-8')); +eq('html', mime.extension('text/html; charset=UTF-8 ')); +eq('html', mime.extension('text/html; charset=UTF-8')); +eq('html', mime.extension('text/html ; charset=UTF-8')); +eq('html', mime.extension('text/html;charset=UTF-8')); +eq('html', mime.extension('text/Html;charset=UTF-8')); +eq(undefined, mime.extension('unrecognized')); + +// +// Test node.types lookups +// + +eq('application/font-woff', mime.lookup('file.woff')); +eq('application/octet-stream', mime.lookup('file.buffer')); +eq('audio/mp4', mime.lookup('file.m4a')); +eq('font/opentype', mime.lookup('file.otf')); + +// +// Test charsets +// + +eq('UTF-8', mime.charsets.lookup('text/plain')); +eq(undefined, mime.charsets.lookup(mime.types.js)); +eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); + +// +// Test for overlaps between mime.types and node.types +// + +var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); +apacheTypes.load(path.join(__dirname, 'types/mime.types')); +nodeTypes.load(path.join(__dirname, 'types/node.types')); + +var keys = [].concat(Object.keys(apacheTypes.types)) + .concat(Object.keys(nodeTypes.types)); +keys.sort(); +for (var i = 1; i < keys.length; i++) { + if (keys[i] == keys[i-1]) { + console.warn('Warning: ' + + 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + + ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); + } +} + +console.log('\nOK'); diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/node_modules/express/node_modules/send/node_modules/mime/types/mime.types new file mode 100644 index 00000000..da8cd691 --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/types/mime.types @@ -0,0 +1,1588 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/node_modules/express/node_modules/send/node_modules/mime/types/node.types new file mode 100644 index 00000000..55b2cf79 --- /dev/null +++ b/node_modules/express/node_modules/send/node_modules/mime/types/node.types @@ -0,0 +1,77 @@ +# What: WebVTT +# Why: To allow formats intended for marking up external text track resources. +# http://dev.w3.org/html5/webvtt/ +# Added by: niftylettuce +text/vtt vtt + +# What: Google Chrome Extension +# Why: To allow apps to (work) be served with the right content type header. +# http://codereview.chromium.org/2830017 +# Added by: niftylettuce +application/x-chrome-extension crx + +# What: HTC support +# Why: To properly render .htc files such as CSS3PIE +# Added by: niftylettuce +text/x-component htc + +# What: HTML5 application cache manifes ('.manifest' extension) +# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps +# per https://developer.mozilla.org/en/offline_resources_in_firefox +# Added by: louisremi +text/cache-manifest manifest + +# What: node binary buffer format +# Why: semi-standard extension w/in the node community +# Added by: tootallnate +application/octet-stream buffer + +# What: The "protected" MP-4 formats used by iTunes. +# Why: Required for streaming music to browsers (?) +# Added by: broofa +application/mp4 m4p +audio/mp4 m4a + +# What: Video format, Part of RFC1890 +# Why: See https://github.com/bentomas/node-mime/pull/6 +# Added by: mjrusso +video/MP2T ts + +# What: EventSource mime type +# Why: mime type of Server-Sent Events stream +# http://www.w3.org/TR/eventsource/#text-event-stream +# Added by: francois2metz +text/event-stream event-stream + +# What: Mozilla App manifest mime type +# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests +# Added by: ednapiranha +application/x-web-app-manifest+json webapp + +# What: Lua file types +# Why: Googling around shows de-facto consensus on these +# Added by: creationix (Issue #45) +text/x-lua lua +application/x-lua-bytecode luac + +# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax +# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown +# Added by: avoidwork +text/x-markdown markdown md mkd + +# What: ini files +# Why: because they're just text files +# Added by: Matthew Kastor +text/plain ini + +# What: DASH Adaptive Streaming manifest +# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video +# Added by: eelcocramer +application/dash+xml mdp + +# What: OpenType font files - http://www.microsoft.com/typography/otspec/ +# Why: Browsers usually ignore the font MIME types and sniff the content, +# but Chrome, shows a warning if OpenType fonts aren't served with +# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. +# Added by: alrra +font/opentype otf diff --git a/node_modules/express/node_modules/send/package.json b/node_modules/express/node_modules/send/package.json new file mode 100644 index 00000000..607f5806 --- /dev/null +++ b/node_modules/express/node_modules/send/package.json @@ -0,0 +1,46 @@ +{ + "name": "send", + "version": "0.1.4", + "description": "Better streaming static file server with Range and conditional-GET support", + "keywords": [ + "static", + "file", + "server" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": { + "debug": "*", + "mime": "~1.2.9", + "fresh": "0.2.0", + "range-parser": "0.0.4" + }, + "devDependencies": { + "mocha": "*", + "should": "*", + "supertest": "0.0.1", + "connect": "2.x" + }, + "scripts": { + "test": "make test" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/send.git" + }, + "main": "index", + "readme": "# send\n\n Send is Connect's `static()` extracted for generalized use, a streaming static file\n server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework.\n\n## Installation\n\n $ npm install send\n\n## Examples\n\n Small:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n send(req, req.url).pipe(res);\n}).listen(3000);\n```\n\n Serving from a root directory with custom error-handling:\n\n```js\nvar http = require('http');\nvar send = require('send');\nvar url = require('url');\n\nvar app = http.createServer(function(req, res){\n // your custom error-handling logic:\n function error(err) {\n res.statusCode = err.status || 500;\n res.end(err.message);\n }\n\n // your custom directory handling logic:\n function redirect() {\n res.statusCode = 301;\n res.setHeader('Location', req.url + '/');\n res.end('Redirecting to ' + req.url + '/');\n }\n\n // transfer arbitrary files from within\n // /www/example.com/public/*\n send(req, url.parse(req.url).pathname)\n .root('/www/example.com/public')\n .on('error', error)\n .on('directory', redirect)\n .pipe(res);\n}).listen(3000);\n```\n\n## API\n\n### Events\n\n - `error` an error occurred `(err)`\n - `directory` a directory was requested\n - `file` a file was requested `(path, stat)`\n - `stream` file streaming has started `(stream)`\n - `end` streaming has completed\n\n### .root(dir)\n\n Serve files relative to `path`. Aliased as `.from(dir)`.\n\n### .index(path)\n\n By default send supports \"index.html\" files, to disable this\n invoke `.index(false)` or to supply a new index pass a string.\n\n### .maxage(ms)\n\n Provide a max-age in milliseconds for http caching, defaults to 0.\n\n### .hidden(bool)\n\n Enable or disable transfer of hidden files, defaults to false.\n\n## Error-handling\n\n By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc.\n\n## Caching\n\n It does _not_ perform internal caching, you should use a reverse proxy cache such\n as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;).\n\n## Debugging\n\n To enable `debug()` instrumentation output export __DEBUG__:\n\n```\n$ DEBUG=send node app\n```\n\n## Running tests\n\n```\n$ npm install\n$ make test\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/send/issues" + }, + "homepage": "https://github.com/visionmedia/send", + "_id": "send@0.1.4", + "dist": { + "shasum": "be70d8d1be01de61821af13780b50345a4f71abd" + }, + "_from": "send@0.1.4", + "_resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz" +} diff --git a/node_modules/express/package.json b/node_modules/express/package.json new file mode 100644 index 00000000..fc43276c --- /dev/null +++ b/node_modules/express/package.json @@ -0,0 +1,91 @@ +{ + "name": "express", + "description": "Sinatra inspired web development framework", + "version": "3.4.8", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "contributors": [ + { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + { + "name": "Ciaran Jessup", + "email": "ciaranj@gmail.com" + }, + { + "name": "Guillermo Rauch", + "email": "rauchg@gmail.com" + } + ], + "dependencies": { + "connect": "2.12.0", + "commander": "1.3.2", + "range-parser": "0.0.4", + "mkdirp": "0.3.5", + "cookie": "0.1.0", + "buffer-crc32": "0.2.1", + "fresh": "0.2.0", + "methods": "0.1.0", + "send": "0.1.4", + "cookie-signature": "1.0.1", + "merge-descriptors": "0.0.1", + "debug": ">= 0.7.3 < 1" + }, + "devDependencies": { + "ejs": "~0.8.4", + "mocha": "~1.15.1", + "jade": "~0.30.0", + "hjs": "~0.0.6", + "stylus": "~0.40.0", + "should": "~2.1.1", + "connect-redis": "~1.4.5", + "marked": "0.2.10", + "supertest": "~0.8.1" + }, + "keywords": [ + "express", + "framework", + "sinatra", + "web", + "rest", + "restful", + "router", + "app", + "api" + ], + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/express" + }, + "main": "index", + "bin": { + "express": "./bin/express" + }, + "scripts": { + "prepublish": "npm prune", + "test": "make test" + }, + "engines": { + "node": ">= 0.8.0" + }, + "license": "MIT", + "readme": "[![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)](http://expressjs.com/)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) [![Gittip](http://img.shields.io/gittip/visionmedia.png)](https://www.gittip.com/visionmedia/)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers, making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n\n Built on Connect, you can use _only_ what you need, and nothing more. Applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js),\n you can quickly craft your perfect framework.\n\n## More Information\n\n * [Website and Documentation](http://expressjs.com/) stored at [visionmedia/expressjs.com](https://github.com/visionmedia/expressjs.com)\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [Русскоязычная документация](http://jsman.ru/express/)\n * Run express examples [online](https://runnable.com/express)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite dependencies:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nThen run whichever tests you want:\n\n $ node examples/content-negotiation\n\nYou can also view live examples here:\n\n
    \n\n## Running Tests\n\nTo run the test suite, first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nThen run the tests:\n\n $ make test\n\n## Contributors\n\n https://github.com/visionmedia/express/graphs/contributors\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/express/issues" + }, + "homepage": "https://github.com/visionmedia/express", + "_id": "express@3.4.8", + "dist": { + "shasum": "aa7a8986de07053337f4bc5ed9a6453d9cc8e2e1" + }, + "_from": "express@", + "_resolved": "https://registry.npmjs.org/express/-/express-3.4.8.tgz" +} diff --git a/node_modules/gulp-minify-css/.npmignore b/node_modules/gulp-minify-css/.npmignore new file mode 100644 index 00000000..b5ef13a3 --- /dev/null +++ b/node_modules/gulp-minify-css/.npmignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +node_modules +build +*.node +components \ No newline at end of file diff --git a/node_modules/gulp-minify-css/.travis.yml b/node_modules/gulp-minify-css/.travis.yml new file mode 100644 index 00000000..18ae2d89 --- /dev/null +++ b/node_modules/gulp-minify-css/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.11" + - "0.10" diff --git a/node_modules/gulp-minify-css/LICENSE b/node_modules/gulp-minify-css/LICENSE new file mode 100755 index 00000000..55eb4777 --- /dev/null +++ b/node_modules/gulp-minify-css/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2013 Jonathan Pollack , Cloudlabs 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/gulp-minify-css/README.md b/node_modules/gulp-minify-css/README.md new file mode 100644 index 00000000..95ff084a --- /dev/null +++ b/node_modules/gulp-minify-css/README.md @@ -0,0 +1,68 @@ +[![Build Status](https://travis-ci.org/jonathanepollack/gulp-minify-css.png?branch=master)](https://travis-ci.org/jonathanepollack/gulp-minify-css) +## Information + + + + + + + + + + + + + +
    Packagegulp-minify-css
    DescriptionMinify css with clean-css.
    Node Version>= 0.10
    + +## Installion + +``` +npm install --save-dev gulp-minify-css +``` + +## Usage + +```js +var minifyCSS = require('gulp-minify-css'); + +gulp.task('minify-css', function() { + + gulp.src('./static/css/*.css') + .pipe(minifyCSS(opts)) + .pipe(gulp.dest('./dist/')) +}); +``` +### Options +* `keepSpecialComments` - `*` for keeping all (default), `1` for keeping first one, `0` for removing all +* `keepBreaks` - whether to keep line breaks (default is false) +* `removeEmpty` - whether to remove empty elements (default is false) +* `debug` - turns on debug mode measuring time spent on cleaning up + (run `npm run bench` to see example) +* `root` - path with which to resolve absolute `@import` rules +* `relativeTo` - path with which to resolve relative `@import` rules + +## LICENSE + +(MIT License) + +Copyright (c) 2013 Jonathan Pollack (), Cloublabs 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/gulp-minify-css/index.js b/node_modules/gulp-minify-css/index.js new file mode 100644 index 00000000..2616ea1c --- /dev/null +++ b/node_modules/gulp-minify-css/index.js @@ -0,0 +1,52 @@ +var es = require('event-stream'), + CleanCSS = require('clean-css'), + clone = require('clone'), + BufferStreams = require('bufferstreams'), + gutil = require('gulp-util'); + +// File level transform function +function minifyCSSTransform(opt) { + + // Return a callback function handling the buffered content + return function(err, buf, cb) { + + // Handle any error + if(err) cb(gutil.PluginError('minify-css', err)); + + // Use the buffered content + buf = Buffer(new CleanCSS(opt).minify(String(buf))); + + // Bring it back to streams + cb(null, buf); + }; +} + +// Plugin function +function minifyCSSGulp(opt){ + if (!opt) opt = {}; + + function modifyContents(file, cb){ + if(file.isNull()) return cb(null, file); + + if(file.isStream()) { + + file.contents = file.contents.pipe(new BufferStreams(minifyCSSTransform(opt))); + + return cb(null, file); + } + + var newFile = clone(file); + + var newContents = new CleanCSS(opt).minify(String(newFile.contents)); + newFile.contents = new Buffer(newContents); + cb(null, newFile); + } + + return es.map(modifyContents); +} + +// Export the file level transform function for other plugins usage +minifyCSSGulp.fileTransform = minifyCSSTransform; + +// Export the plugin main function +module.exports = minifyCSSGulp; diff --git a/node_modules/gulp-minify-css/node_modules/.bin/cleancss b/node_modules/gulp-minify-css/node_modules/.bin/cleancss new file mode 120000 index 00000000..2a3439eb --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/.bin/cleancss @@ -0,0 +1 @@ +../clean-css/bin/cleancss \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/.npmignore b/node_modules/gulp-minify-css/node_modules/bufferstreams/.npmignore new file mode 100755 index 00000000..31f2e87a --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/.npmignore @@ -0,0 +1,5 @@ +*~ +*.swp +node_modules/ +.git +tests/results diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/.travis.yml b/node_modules/gulp-minify-css/node_modules/bufferstreams/.travis.yml new file mode 100755 index 00000000..b2178387 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - 0.10 + +before_script: + - npm install --dev + +script: + - npm test diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/LICENCE b/node_modules/gulp-minify-css/node_modules/bufferstreams/LICENCE new file mode 100755 index 00000000..454ab9d0 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/LICENCE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2013 Nicolas Froidure, + +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/gulp-minify-css/node_modules/bufferstreams/README.md b/node_modules/gulp-minify-css/node_modules/bufferstreams/README.md new file mode 100755 index 00000000..85fc9bd1 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/README.md @@ -0,0 +1,42 @@ +# BufferStreams [![NPM version](https://badge.fury.io/js/bufferstreams.png)](https://npmjs.org/package/bufferstreams) [![Build Status](https://travis-ci.org/nfroidure/BufferStreams.png?branch=master)](https://travis-ci.org/nfroidure/BufferStreams) + +BufferStreams abstracts streams to allow you to deal with the whole contents in + a single buffer when it becomes necessary (by example: a legacy library that + do not support streams). + +It is not a good practice, just some glue. Using BufferStreams means: +* there is no library dealing with streams for your needs +* you filled an issue to the wrapped library to support streams + +## Usage +Install the [npm module](https://npmjs.org/package/bufferstreams): +```sh +npm install bufferstreams --save +``` +Then, in your scripts: +```js +var BufferStreams = require('bufferstreams'); + +Fs.createReadStream('input.txt') + .pipe(new BufferStreams(function(err, buf, cb) { + + // err will be filled with an error if the piped in stream emits one. + if(err) { + throw err; + } + + // buf will contain the whole piped in stream contents + buf = Buffer(buf.toString(utf-8).repalce('foo', 'bar')); + + // cb is a callback to pass the result back to the piped out stream + // first argument is an error that wil be emitted if one + // the second argument is the modified buffer + cb(null, buf); + + })) + .pipe(Fs.createWriteStream('output.txt')); +``` + +## Contributing +Feel free to pull your code if you agree with publishing it under the MIT license. + diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/package.json b/node_modules/gulp-minify-css/node_modules/bufferstreams/package.json new file mode 100755 index 00000000..fd607d19 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/package.json @@ -0,0 +1,45 @@ +{ + "name": "bufferstreams", + "version": "0.0.1", + "description": "Abstract streams to deal with the whole buffered contents.", + "homepage": "https://github.com/nfroidure/BufferStreams", + "main": "src/index.js", + "scripts": { + "test": "mocha tests/*.mocha.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/nfroidure/BufferStreams" + }, + "keywords": [ + "buffer", + "streaming", + "stream", + "async", + "abstract" + ], + "devDependencies": { + "mocha": "1.x.x", + "event-stream": "1.x.x" + }, + "author": { + "name": "Nicolas Froidure", + "url": "http://www.insertafter.com/blog.html" + }, + "engines": { + "node": ">= 0.10.0" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/nfroidure/BufferStreams/blob/master/LICENSE" + } + ], + "bugs": { + "url": "https://github.com/nfroidure/BufferStreams/issues" + }, + "readme": "# BufferStreams [![NPM version](https://badge.fury.io/js/bufferstreams.png)](https://npmjs.org/package/bufferstreams) [![Build Status](https://travis-ci.org/nfroidure/BufferStreams.png?branch=master)](https://travis-ci.org/nfroidure/BufferStreams)\n\nBufferStreams abstracts streams to allow you to deal with the whole contents in\n a single buffer when it becomes necessary (by example: a legacy library that\n do not support streams).\n\nIt is not a good practice, just some glue. Using BufferStreams means:\n* there is no library dealing with streams for your needs\n* you filled an issue to the wrapped library to support streams\n\n## Usage\nInstall the [npm module](https://npmjs.org/package/bufferstreams):\n```sh\nnpm install bufferstreams --save\n```\nThen, in your scripts:\n```js\nvar BufferStreams = require('bufferstreams');\n\nFs.createReadStream('input.txt')\n .pipe(new BufferStreams(function(err, buf, cb) {\n\n // err will be filled with an error if the piped in stream emits one.\n if(err) {\n throw err;\n }\n\n // buf will contain the whole piped in stream contents\n buf = Buffer(buf.toString(utf-8).repalce('foo', 'bar'));\n\n // cb is a callback to pass the result back to the piped out stream\n // first argument is an error that wil be emitted if one\n // the second argument is the modified buffer\n cb(null, buf);\n\n }))\n .pipe(Fs.createWriteStream('output.txt'));\n```\n\n## Contributing\nFeel free to pull your code if you agree with publishing it under the MIT license.\n\n", + "readmeFilename": "README.md", + "_id": "bufferstreams@0.0.1", + "_from": "bufferstreams@0.0.1" +} diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/src/index.js b/node_modules/gulp-minify-css/node_modules/bufferstreams/src/index.js new file mode 100644 index 00000000..a19a0f96 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/src/index.js @@ -0,0 +1,45 @@ +var PassThrough = require('stream').PassThrough; +var util = require('util'); + +// Inherit of PassThrough stream +util.inherits(BufferStream, PassThrough); + +// Constructor +function BufferStream(cb) { + + // Ensure new were used + if (!(this instanceof BufferStream)) { + throw Error('Please use the "new" operator to instanciate a BufferStream.'); + } + + // Parent constructor + PassThrough.call(this); + + // Keep a reference to the callback + this._cb = cb; + + // Internal buffer + this._buf = Buffer(''); +} + +BufferStream.prototype._transform = function(chunk, encoding, done) { + + this._buf = Buffer.concat([this._buf, chunk], this._buf.length + chunk.length); + + done(); + +}; + +BufferStream.prototype._flush = function(done) { + var _that = this; + + this._cb(null, this._buf, function(err, buf) { + if (buf && buf.length) { + _that.push(buf); + } + done(); + }); + +}; + +module.exports = BufferStream; diff --git a/node_modules/gulp-minify-css/node_modules/bufferstreams/tests/index.mocha.js b/node_modules/gulp-minify-css/node_modules/bufferstreams/tests/index.mocha.js new file mode 100755 index 00000000..7b0ccc32 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/bufferstreams/tests/index.mocha.js @@ -0,0 +1,111 @@ +var assert = require('assert') + , es = require('event-stream') + , BufferStream = require('../src') +; + +// Helpers +function syncBufferPrefixer(headerText) { + return new BufferStream(function(err, buf, cb) { + assert.equal(err, null); + if(null === buf) { + cb(null, Buffer(headerText)); + } else { + cb(null, Buffer.concat([Buffer(headerText), buf])); + } + }); +} +function asyncBufferPrefixer(headerText) { + return new BufferStream(function(err, buf, cb) { + assert.equal(err, null); + if(null === buf) { + setTimeout(function() { + cb(null, Buffer(headerText)); + }, 0); + } else { + setTimeout(function() { + cb(null, Buffer.concat([Buffer(headerText), buf])); + }, 0); + } + }); +} + +// Tests +describe('Abstract buffers', function() { + describe('synchonously', function() { + + it('should work with one pipe', function(done) { + es.readArray(['te', 'st']) + .pipe(syncBufferPrefixer('plop')) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, 'ploptest'); + done(); + })); + }); + + it('should work when returning a null buffer', function(done) { + + es.readArray(['te', 'st']) + .pipe(new BufferStream(function(err, buf, cb){ + cb(null, null); + })) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, ''); + done(); + })); + }); + + it('should work with multiple pipes', function(done) { + es.readArray(['te', 'st']) + .pipe(syncBufferPrefixer('plop')) + .pipe(syncBufferPrefixer('plip')) + .pipe(syncBufferPrefixer('plap')) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, 'plapplipploptest'); + done(); + })); + }); + + }); + + describe('asynchonously', function() { + + it('should work with one pipe', function(done) { + es.readArray(['te', 'st']) + .pipe(asyncBufferPrefixer('plop')) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, 'ploptest'); + done(); + })); + }); + + it('should work when returning a null buffer', function(done) { + + es.readArray(['te', 'st']) + .pipe(new BufferStream(function(err, buf, cb){ + cb(null, null); + })) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, ''); + done(); + })); + }); + + it('should work with multiple pipes', function(done) { + es.readArray(['te', 'st']) + .pipe(asyncBufferPrefixer('plop')) + .pipe(asyncBufferPrefixer('plip')) + .pipe(asyncBufferPrefixer('plap')) + .pipe(es.wait(function(err, data) { + assert.equal(err, null); + assert.equal(data, 'plapplipploptest'); + done(); + })); + }); + + }); +}); diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/History.md b/node_modules/gulp-minify-css/node_modules/clean-css/History.md new file mode 100644 index 00000000..6d649bc5 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/History.md @@ -0,0 +1,379 @@ +[2.0.8 / 2014-02-07](https://github.com/GoalSmashers/clean-css/compare/v2.0.7...v2.0.8) +================== + +* Fixed issue [#232](https://github.com/GoalSmashers/clean-css/issues/232) - edge case in non-adjacent selectors merging. + +[2.0.7 / 2014-01-16](https://github.com/GoalSmashers/clean-css/compare/v2.0.6...v2.0.7) +================== + +* Fixed issue [#208](https://github.com/GoalSmashers/clean-css/issues/208) - don't swallow @page and @viewport. + +[2.0.6 / 2014-01-04](https://github.com/GoalSmashers/clean-css/compare/v2.0.5...v2.0.6) +================== + +* Fixed issue [#198](https://github.com/GoalSmashers/clean-css/issues/198) - process comments and `@import`s correctly. +* Fixed issue [#205](https://github.com/GoalSmashers/clean-css/issues/205) - freeze on broken @import declaration. + +[2.0.5 / 2014-01-03](https://github.com/GoalSmashers/clean-css/compare/v2.0.4...v2.0.5) +================== + +* Fixed issue [#199](https://github.com/GoalSmashers/clean-css/issues/199) - keep line breaks with no advanced optimizations. +* Fixed issue [#203](https://github.com/GoalSmashers/clean-css/issues/203) - Buffer as a first argument to minify method. + +[2.0.4 / 2013-12-19](https://github.com/GoalSmashers/clean-css/compare/v2.0.3...v2.0.4) +================== + +* Fixed issue [#193](https://github.com/GoalSmashers/clean-css/issues/193) - HSL color space normalization. + +[2.0.3 / 2013-12-18](https://github.com/GoalSmashers/clean-css/compare/v2.0.2...v2.0.3) +================== + +* Fixed issue [#191](https://github.com/GoalSmashers/clean-css/issues/191) - leading numbers in font/animation names. +* Fixed issue [#192](https://github.com/GoalSmashers/clean-css/issues/192) - many `@import`s inside a comment. + +[2.0.2 / 2013-11-18](https://github.com/GoalSmashers/clean-css/compare/v2.0.1...v2.0.2) +================== + +* Fixed issue [#177](https://github.com/GoalSmashers/clean-css/issues/177) - process broken content correctly. + +[2.0.1 / 2013-11-14](https://github.com/GoalSmashers/clean-css/compare/v2.0.0...v2.0.1) +================== + +* Fixed issue [#176](https://github.com/GoalSmashers/clean-css/issues/176) - hangs on `undefined` keyword. + +[2.0.0 / 2013-11-04](https://github.com/GoalSmashers/clean-css/compare/v1.1.7...v2.0.0) +================== + +* Adds simplified and more advanced text escaping / restoring via `EscapeStore` class. +* Adds simplified and much faster empty elements removal. +* Adds missing `@import` processing to our benchmark (run via `npm run bench`). +* Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors. +* Adds basic optimizer removing duplicate selectors from a list. +* Adds merging duplicate properties within a single selector's body. +* Adds merging adjacent selectors within a scope (single and multiple ones). +* Changes behavior of `--keep-line-breaks`/`keepBreaks` option to keep breaks after trailing braces only. +* Makes all multiple selectors ordered alphabetically (aids merging). +* Adds property overriding so more coarse properties override more granular ones. +* Adds reducing non-adjacent selectors. +* Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations. +* Adds reducing non-adjacent selectors when overridden by more complex selectors. +* Fixed issue [#138](https://github.com/GoalSmashers/clean-css/issues/138) - makes CleanCSS interface OO. +* Fixed issue [#139](https://github.com/GoalSmashers/clean-css/issues/138) - consistent error & warning handling. +* Fixed issue [#145](https://github.com/GoalSmashers/clean-css/issues/145) - debug mode in library too. +* Fixed issue [#157](https://github.com/GoalSmashers/clean-css/issues/157) - gets rid of `removeEmpty` option. +* Fixed issue [#159](https://github.com/GoalSmashers/clean-css/issues/159) - escaped quotes inside content. +* Fixed issue [#162](https://github.com/GoalSmashers/clean-css/issues/162) - strip quotes from Base64 encoded URLs. +* Fixed issue [#166](https://github.com/GoalSmashers/clean-css/issues/166) - `debug` formatting in CLI +* Fixed issue [#167](https://github.com/GoalSmashers/clean-css/issues/167) - `background:transparent` minification. + +[1.1.7 / 2013-10-28](https://github.com/GoalSmashers/clean-css/compare/v1.1.6...v1.1.7) +================== + +* Fixed issue [#156](https://github.com/GoalSmashers/clean-css/issues/156) - `@import`s inside comments. + +[1.1.6 / 2013-10-26](https://github.com/GoalSmashers/clean-css/compare/v1.1.5...v1.1.6) +================== + +* Fixed issue [#155](https://github.com/GoalSmashers/clean-css/issues/155) - broken irregular CSS content. + +[1.1.5 / 2013-10-24](https://github.com/GoalSmashers/clean-css/compare/v1.1.4...v1.1.5) +================== + +* Fixed issue [#153](https://github.com/GoalSmashers/clean-css/issues/153) - keepSpecialComments 0/1 as a string. + +[1.1.4 / 2013-10-23](https://github.com/GoalSmashers/clean-css/compare/v1.1.3...v1.1.4) +================== + +* Fixed issue [#152](https://github.com/GoalSmashers/clean-css/issues/152) - adds an option to disable rebasing. + +[1.1.3 / 2013-10-04](https://github.com/GoalSmashers/clean-css/compare/v1.1.2...v1.1.3) +================== + +* Fixed issue [#150](https://github.com/GoalSmashers/clean-css/issues/150) - minifying `background:none`. + +[1.1.2 / 2013-09-29](https://github.com/GoalSmashers/clean-css/compare/v1.1.1...v1.1.2) +================== + +* Fixed issue [#149](https://github.com/GoalSmashers/clean-css/issues/149) - shorthand font property. + +[1.1.1 / 2013-09-07](https://github.com/GoalSmashers/clean-css/compare/v1.1.0...v1.1.1) +================== + +* Fixed issue [#144](https://github.com/GoalSmashers/clean-css/issues/144) - skip URLs rebasing by default. + +[1.1.0 / 2013-09-06](https://github.com/GoalSmashers/clean-css/compare/v1.0.12...v1.1.0) +================== + +* Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking. +* Added simplified comments processing & imports. +* Fixed issue [#43](https://github.com/GoalSmashers/clean-css/issues/43) - `--debug` switch for minification stats. +* Fixed issue [#65](https://github.com/GoalSmashers/clean-css/issues/65) - full color name / hex shortening. +* Fixed issue [#84](https://github.com/GoalSmashers/clean-css/issues/84) - support for `@import` with media queries. +* Fixed issue [#124](https://github.com/GoalSmashers/clean-css/issues/124) - raise error on broken imports. +* Fixed issue [#126](https://github.com/GoalSmashers/clean-css/issues/126) - proper CSS expressions handling. +* Fixed issue [#129](https://github.com/GoalSmashers/clean-css/issues/129) - rebasing imported URLs. +* Fixed issue [#130](https://github.com/GoalSmashers/clean-css/issues/130) - better code modularity. +* Fixed issue [#135](https://github.com/GoalSmashers/clean-css/issues/135) - require node.js 0.8+. + +[1.0.12 / 2013-07-19](https://github.com/GoalSmashers/clean-css/compare/v1.0.11...v1.0.12) +=================== + +* Fixed issue [#121](https://github.com/GoalSmashers/clean-css/issues/121) - ability to skip `@import` processing. + +[1.0.11 / 2013-07-08](https://github.com/GoalSmashers/clean-css/compare/v1.0.10...v1.0.11) +=================== + +* Fixed issue [#117](https://github.com/GoalSmashers/clean-css/issues/117) - line break escaping in comments. + +[1.0.10 / 2013-06-13](https://github.com/GoalSmashers/clean-css/compare/v1.0.9...v1.0.10) +=================== + +* Fixed issue [#114](https://github.com/GoalSmashers/clean-css/issues/114) - comments in imported stylesheets. + +[1.0.9 / 2013-06-11](https://github.com/GoalSmashers/clean-css/compare/v1.0.8...v1.0.9) +================== + +* Fixed issue [#113](https://github.com/GoalSmashers/clean-css/issues/113) - `@import` in comments. + +[1.0.8 / 2013-06-10](https://github.com/GoalSmashers/clean-css/compare/v1.0.7...v1.0.8) +================== + +* Fixed issue [#112](https://github.com/GoalSmashers/clean-css/issues/112) - reducing `box-shadow` zeros. + +[1.0.7 / 2013-06-05](https://github.com/GoalSmashers/clean-css/compare/v1.0.6...v1.0.7) +================== + +* Support for `@import` URLs starting with `//`. + By [@petetak](https://github.com/petetak). + +[1.0.6 / 2013-06-04](https://github.com/GoalSmashers/clean-css/compare/v1.0.5...v1.0.6) +================== + +* Fixed issue [#110](https://github.com/GoalSmashers/clean-css/issues/110) - data URIs in URLs. + +[1.0.5 / 2013-05-26](https://github.com/GoalSmashers/clean-css/compare/v1.0.4...v1.0.5) +================== + +* Fixed issue [#107](https://github.com/GoalSmashers/clean-css/issues/107) - data URIs in imported stylesheets. + +1.0.4 / 2013-05-23 +================== + +* Rewrite relative URLs in imported stylesheets. + By [@bluej100](https://github.com/bluej100). + +1.0.3 / 2013-05-20 +================== + +* Support alternative `@import` syntax with file name not wrapped inside `url()` statement. + By [@bluej100](https://github.com/bluej100). + +1.0.2 / 2013-04-29 +================== + +* Fixed issue [#97](https://github.com/GoalSmashers/clean-css/issues/97) - `--remove-empty` & FontAwesome. + +1.0.1 / 2013-04-08 +================== + +* Do not pick up `bench` and `test` while building `npm` package. + By [@sindresorhus](https://https://github.com/sindresorhus). + +1.0.0 / 2013-03-30 +================== + +* Fixed issue [#2](https://github.com/GoalSmashers/clean-css/issues/2) - resolving `@import` rules. +* Fixed issue [#44](https://github.com/GoalSmashers/clean-css/issues/44) - examples in `--help`. +* Fixed issue [#46](https://github.com/GoalSmashers/clean-css/issues/46) - preserving special characters in URLs and attributes. +* Fixed issue [#80](https://github.com/GoalSmashers/clean-css/issues/80) - quotation in multi line strings. +* Fixed issue [#83](https://github.com/GoalSmashers/clean-css/issues/83) - HSL to hex color conversions. +* Fixed issue [#86](https://github.com/GoalSmashers/clean-css/issues/86) - broken `@charset` replacing. +* Fixed issue [#88](https://github.com/GoalSmashers/clean-css/issues/88) - removes space in `! important`. +* Fixed issue [#92](https://github.com/GoalSmashers/clean-css/issues/92) - uppercase hex to short versions. + +0.10.2 / 2013-03-19 +=================== + +* Fixed issue [#79](https://github.com/GoalSmashers/clean-css/issues/79) - node.js 0.10.x compatibility. + +0.10.1 / 2013-02-14 +=================== + +* Fixed issue [#66](https://github.com/GoalSmashers/clean-css/issues/66) - line breaks without extra spaces should + be handled correctly. + +0.10.0 / 2013-02-09 +=================== + +* Switched from [optimist](https://github.com/substack/node-optimist) to + [commander](https://github.com/visionmedia/commander.js) for CLI processing. +* Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`. +* Fixed performance issue with replacing multiple `@charset` declarations and issue + with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie). +* Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`). +* Fixed issue [#47](https://github.com/GoalSmashers/clean-css/issues/47) - commandline issues on Windows. +* Fixed issue [#49](https://github.com/GoalSmashers/clean-css/issues/49) - remove empty selectors from media query. +* Fixed issue [#52](https://github.com/GoalSmashers/clean-css/issues/52) - strip fraction zeros if not needed. +* Fixed issue [#58](https://github.com/GoalSmashers/clean-css/issues/58) - remove colon where possible. +* Fixed issue [#59](https://github.com/GoalSmashers/clean-css/issues/59) - content property handling. + +0.9.1 / 2012-12-19 +================== + +* Fixed issue [#37](https://github.com/GoalSmashers/clean-css/issues/37) - converting + `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)). + +0.9.0 / 2012-12-15 +================== + +* Added stripping quotation from font names (if possible). +* Added stripping quotation from `@keyframes` declaration, `animation` and + `animation-name` property. +* Added stripping quotations from attributes' value (e.g. `[data-target='x']`). +* Added better hex->name and name->hex color shortening. +* Added `font: normal` and `font: bold` shortening the same way as `font-weight` is. +* Refactored shorthand selectors and added `border-radius`, `border-style` + and `border-color` shortening. +* Added `margin`, `padding` and `border-width` shortening. +* Added removing line break after commas. +* Fixed removing whitespace inside media query definition. +* Added removing line breaks after a comma, so all declarations are one-liners now. +* Speed optimizations (~10% despite many new features). +* Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`. + +0.8.3 / 2012-11-29 +================== + +* Fixed HSL/HSLA colors processing. + +0.8.2 / 2012-10-31 +================== + +* Fixed shortening hex colors and their relation to hashes in URLs. +* Cleanup by [@XhmikosR](https://github.com/XhmikosR). + +0.8.1 / 2012-10-28 +================== + +* Added better zeros processing for `rect(...)` syntax (clip property). + +0.8.0 / 2012-10-21 +================== + +* Added removing URLs quotation if possible. +* Rewrote breaks processing. +* Added `keepBreaks`/`-b` option to keep line breaks in the minimized file. +* Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules. +* Minimized test data is now minimized with line breaks so it's easier to + compare the changes line by line. + +0.7.0 / 2012-10-14 +================== + +* Added stripping special comments to CLI (`--s0` and `--s1` options). +* Added stripping special comments to programmatic interface + (`keepSpecialComments` option). + +0.6.0 / 2012-08-05 +================== + +* Full Windows support with tests (./test.bat). + +0.5.0 / 2012-08-02 +================== + +* Made path to vows local. +* Explicit node.js 0.6 requirement. + +0.4.2 / 2012-06-28 +================== + +* Updated binary `-v` option (version). +* Updated binary to output help when no options given (but not in piped mode). +* Added binary tests. + +0.4.1 / 2012-06-10 +================== + +* Fixed stateless mode where calling `CleanCSS#process` directly was giving + errors (reported by [@facelessuser](https://github.com/facelessuser)). + +0.4.0 / 2012-06-04 +================== + +* Speed improvements up to 4x thanks to the rewrite of comments and CSS' content + processing. +* Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details). +* Improved debugging mode (see [test/bench.js](/test/bench.js)) +* Added `make bench` for a one-pass benchmark. + +0.3.3 / 2012-05-27 +================== + +* Fixed tests, [package.json](/package.json) for development, and regex + for removing empty declarations (thanks to [@vvo](https://github.com/vvo)). + +0.3.2 / 2012-01-17 +================== + +* Fixed output method under node.js 0.6 which incorrectly tried to close + `process.stdout`. + +0.3.1 / 2011-12-16 +================== + +* Fixed cleaning up `0 0 0 0` expressions. + +0.3.0 / 2011-11-29 +================== + +* Clean-css requires node.js 0.4.0+ to run. +* Removed node.js's 0.2.x 'sys' package dependency + (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch). + +0.2.6 / 2011-11-27 +================== + +* Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector. + +0.2.5 / 2011-11-27 +================== + +* Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations + (thanks to [@cvan](https://github.com/cvan) for reporting it). +* Fixed converting `#f00` to `red` in borders and gradients. + +0.2.4 / 2011-05-25 +================== + +* Fixed problem with expanding `none` to `0` in partial/full background + declarations. +* Fixed including clean-css library from binary (global to local). + +0.2.3 / 2011-04-18 +================== + +* Fixed problem with optimizing IE filters. + +0.2.2 / 2011-04-17 +================== + +* Fixed problem with space before color in `border` property. + +0.2.1 / 2011-03-19 +================== + +* Added stripping space before `!important` keyword. +* Updated repository location and author information in [package.json](/package.json). + +0.2.0 / 2011-03-02 +================== + +* Added options parsing via optimist. +* Changed code inclusion (thus the version bump). + +0.1.0 / 2011-02-27 +================== + +* First version of clean-css library. +* Implemented all basic CSS transformations. diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/LICENSE b/node_modules/gulp-minify-css/node_modules/clean-css/LICENSE new file mode 100644 index 00000000..1509aa3d --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011-2013 GoalSmashers.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/gulp-minify-css/node_modules/clean-css/README.md b/node_modules/gulp-minify-css/node_modules/clean-css/README.md new file mode 100644 index 00000000..8b28e5c3 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/README.md @@ -0,0 +1,187 @@ +[![NPM version](https://badge.fury.io/js/clean-css.png)](https://badge.fury.io/js/clean-css) +[![Build Status](https://secure.travis-ci.org/GoalSmashers/clean-css.png)](https://travis-ci.org/GoalSmashers/clean-css) +[![Dependency Status](https://david-dm.org/GoalSmashers/clean-css.png)](https://david-dm.org/GoalSmashers/clean-css) +[![devDependency Status](https://david-dm.org/GoalSmashers/clean-css/dev-status.png)](https://david-dm.org/GoalSmashers/clean-css#info=devDependencies) + +## What is clean-css? + +Clean-css is a fast and efficient [node.js](http://nodejs.org/) library for minifying CSS files. + +According to [tests](https://github.com/GoalSmashers/css-minification-benchmark) it is one of the best available. + + +## Usage + +### What are the requirements? + +``` +node.js 0.8.0+ (tested on CentOS, Ubuntu, OS X 10.6+, and Windows 7+) +``` + +### How to install clean-css? + +``` +npm install clean-css +``` + +### How to upgrade clean-css from 1.x to 2.x? + +#### Command-line interface (CLI) + +``` +npm update clean-css +``` + +or point `package.json` to version 2.x. That's it! + +#### Node.js module + +Update `clean-css` as for CLI above. +Then change your JavaScript code from: + +```js +var minimized = CleanCSS.process(source, options); +``` + +into + +```js +var minimized = new CleanCSS(options).minify(source); +``` + +And you are done. + +### How to use clean-css CLI? + +Clean-css accepts the following command line arguments (please make sure +you use `` as the very last argument to avoid potential issues): + +``` +cleancss [options] + +-h, --help Output usage information +-v, --version Output the version number +-b, --keep-line-breaks Keep line breaks +--s0 Remove all special comments, i.e. /*! comment */ +--s1 Remove all special comments but the first one +-r, --root [root-path] A root path to which resolve absolute @import rules + and rebase relative URLs +-o, --output [output-file] Use [output-file] as output instead of STDOUT +-s, --skip-import Disable @import processing +--skip-rebase Disable URLs rebasing +--skip-advanced Disable advanced optimizations - selector & property merging, + reduction, etc. +--selectors-merge-mode [ie8|*] Use `ie8` for compatibility mode, `*` for merge all (default) +-d, --debug Shows debug information (minification time & compression efficiency) +``` + +#### Examples: + +To minify a **public.css** file into **public-min.css** do: + +``` +cleancss -o public-min.css public.css +``` + +To minify the same **public.css** into the standard output skip the `-o` parameter: + +``` +cleancss public.css +``` + +More likely you would like to concatenate a couple of files. +If you are on a Unix-like system: + +```bash +cat one.css two.css three.css | cleancss -o merged-and-minified.css +``` + +On Windows: + +```bat +type one.css two.css three.css | cleancss -o merged-and-minified.css +``` + +Or even gzip the result at once: + +```bash +cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz +``` + +### How to use clean-css programmatically? + +```js +var CleanCSS = require('clean-css'); +var source = 'a{font-weight:bold;}'; +var minimized = new CleanCSS().minify(source); +``` + +CleanCSS constructor accepts a hash as a parameter, i.e., +`new CleanCSS(options).minify(source)` with the following options available: + +* `keepSpecialComments` - `*` for keeping all (default), `1` for keeping first one only, `0` for removing all +* `keepBreaks` - whether to keep line breaks (default is false) +* `benchmark` - turns on benchmarking mode measuring time spent on cleaning up + (run `npm run bench` to see example) +* `root` - path to resolve absolute `@import` rules and rebase relative URLs +* `relativeTo` - path with which to resolve relative `@import` rules and URLs +* `processImport` - whether to process `@import` rules +* `noRebase` - whether to skip URLs rebasing +* `noAdvanced` - set to true to disable advanced optimizations - selector & property merging, reduction, etc. +* `selectorsMergeMode` - `ie8` for IE8 compatibility mode, `*` for merging all (default) +* `debug` - set to true to get minification statistics under `stats` property (see `test/custom-test.js` for examples) + +### What are the clean-css' dev commands? + +First clone the source, then run: + +* `npm run bench` for clean-css benchmarks (see [test/bench.js](https://github.com/GoalSmashers/clean-css/blob/master/test/bench.js) for details) +* `npm run check` to check JS sources with [JSHint](https://github.com/jshint/jshint/) +* `npm test` for the test suite + +## Tips & Tricks + +### How to preserve a comment block? + +Use the `/*!` notation instead of the standard one `/*`: + +```css +/*! + Important comments included in minified output. +*/ +``` + +### How to rebase relative image URLs + +Clean-css will handle it automatically for you (since version 1.1) in the following cases: + +* When using the CLI: + 1. Use an output path via `-o`/`--output` to rebase URLs as relative to the output file. + 2. Use a root path via `-r`/`--root` to rebase URLs as absolute from the given root path. + 3. If you specify both then `-r`/`--root` takes precendence. +* When using clean-css as a library: + 1. Use a combination of `relativeTo` and `target` options for relative rebase (same as 1 in CLI). + 2. Use a combination of `relativeTo` and `root` options for absolute rebase (same as 2 in CLI). + 3. `root` takes precendence over `target` as in CLI. + +## Acknowledgments + +* Vincent Voyer ([@vvo](https://github.com/vvo)) for a patch with better + empty element regex and for inspiring us to do many performance improvements + in 0.4 release. +* Isaac ([@facelessuser](https://github.com/facelessuser)) for pointing out + a flaw in clean-css' stateless mode. +* Jan Michael Alonzo ([@jmalonzo](https://github.com/jmalonzo)) for a patch + removing node.js' old `sys` package. +* [@XhmikosR](https://github.com/XhmikosR) for suggesting new features + (option to remove special comments and strip out URLs quotation) and + pointing out numerous improvements (JSHint, media queries). +* Anthony Barre ([@abarre](https://github.com/abarre)) for improvements to + `@import` processing, namely introducing the `--skip-import` / + `processImport` options. +* Simon Altschuler ([@altschuler](https://github.com/altschuler)) for fixing + `@import` processing inside comments. + +## License + +Clean-css is released under the [MIT License](https://github.com/GoalSmashers/clean-css/blob/master/LICENSE). diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/bin/cleancss b/node_modules/gulp-minify-css/node_modules/clean-css/bin/cleancss new file mode 100755 index 00000000..e73ebd56 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/bin/cleancss @@ -0,0 +1,138 @@ +#!/usr/bin/env node + +var util = require('util'); +var fs = require('fs'); +var path = require('path'); +var CleanCSS = require('../index'); + +var commands = require('commander'); + +var packageConfig = fs.readFileSync(path.join(path.dirname(fs.realpathSync(process.argv[1])), '../package.json')); +var buildVersion = JSON.parse(packageConfig).version; + +var isWindows = process.platform == 'win32'; + +// Specify commander options to parse command line params correctly +commands + .version(buildVersion, '-v, --version') + .usage('[options] ') + .option('-b, --keep-line-breaks', 'Keep line breaks') + .option('--s0', 'Remove all special comments, i.e. /*! comment */') + .option('--s1', 'Remove all special comments but the first one') + .option('-r, --root [root-path]', 'Set a root path to which resolve absolute @import rules') + .option('-o, --output [output-file]', 'Use [output-file] as output instead of STDOUT') + .option('-s, --skip-import', 'Disable @import processing') + .option('--skip-rebase', 'Disable URLs rebasing') + .option('--skip-advanced', 'Disable advanced optimizations - selector & property merging, reduction, etc.') + .option('--selectors-merge-mode [ie8|*]', 'Use `ie8` for compatibility mode, `*` for merge all (default).') + .option('-d, --debug', 'Shows debug information (minification time & compression efficiency)'); + +commands.on('--help', function() { + util.puts(' Examples:\n'); + util.puts(' %> cleancss one.css'); + util.puts(' %> cleancss -o one-min.css one.css'); + if (isWindows) { + util.puts(' %> type one.css two.css three.css | cleancss -o merged-and-minified.css'); + } else { + util.puts(' %> cat one.css two.css three.css | cleancss -o merged-and-minified.css'); + util.puts(' %> cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz'); + } + util.puts(''); + process.exit(); +}); + +commands.parse(process.argv); + +var options = { + source: null, + target: null +}; +var cleanOptions = {}; +var fromStdin = !process.env['__DIRECT__'] && !process.stdin.isTTY; + +// If no sensible data passed in just print help and exit +if (!fromStdin && commands.args.length == 0) { + commands.outputHelp(); + return 0; +} + +// Now coerce commands into CleanCSS configuration... +if (commands.output) + cleanOptions.target = options.target = commands.output; +if (commands.keepLineBreaks) + cleanOptions.keepBreaks = true; +if (commands.s1) + cleanOptions.keepSpecialComments = 1; +if (commands.s0) + cleanOptions.keepSpecialComments = 0; +if (commands.root) + cleanOptions.root = commands.root; +if (commands.skipImport) + cleanOptions.processImport = false; +if (commands.skipRebase) + cleanOptions.noRebase = true; +if (commands.skipAdvanced) + cleanOptions.noAdvanced = true; +if (commands.selectorsMergeMode) + cleanOptions.selectorsMergeMode = commands.selectorsMergeMode; +if (commands.debug) + cleanOptions.debug = true; +if (commands.args.length > 0) { + var source = commands.args[0]; + options.source = source; + cleanOptions.relativeTo = path.dirname(path.resolve(source)); +} + +// ... and do the magic! +if (options.source) { + fs.readFile(options.source, 'utf8', function(error, data) { + if (error) + throw error; + output(minify(data)); + }); +} else { + var stdin = process.openStdin(); + stdin.setEncoding('utf-8'); + var data = ''; + stdin.on('data', function(chunk) { + data += chunk; + }); + stdin.on('end', function() { + output(minify(data)); + }); +} + +function minify(data) { + var minifier = new CleanCSS(cleanOptions); + var minified = minifier.minify(data); + + if (cleanOptions.debug) { + console.error('Original: %d bytes', minifier.stats.originalSize); + console.error('Minified: %d bytes', minifier.stats.minifiedSize); + console.error('Efficiency: %d%', ~~(minifier.stats.efficiency * 10000) / 100.0); + console.error('Time spent: %dms', minifier.stats.timeSpent); + } + + outputFeedback(minifier.errors, true); + outputFeedback(minifier.warnings); + + if (minifier.errors.length > 0) + process.exit(1); + + return minified; +} + +function output(minified) { + if (options.target) + fs.writeFileSync(options.target, minified, 'utf8'); + else + process.stdout.write(minified); +}; + +function outputFeedback(messages, isError) { + var prefix = isError ? '\x1B[31mERROR\x1B[39m:' : 'WARNING:'; + + messages.forEach(function(message) { + console.error('%s %s', prefix, message); + }); +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/index.js b/node_modules/gulp-minify-css/node_modules/clean-css/index.js new file mode 100644 index 00000000..d7b05030 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/clean'); diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/clean.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/clean.js new file mode 100644 index 00000000..3d999301 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/clean.js @@ -0,0 +1,329 @@ +/** + * Clean-css - https://github.com/GoalSmashers/clean-css + * Released under the terms of MIT license + * + * Copyright (C) 2011-2013 GoalSmashers.com + */ + +var ColorShortener = require('./colors/shortener'); +var ColorHSLToHex = require('./colors/hsl-to-hex'); +var ColorRGBToHex = require('./colors/rgb-to-hex'); +var ColorLongToShortHex = require('./colors/long-to-short-hex'); + +var ShorthandNotations = require('./properties/shorthand-notations'); +var ImportInliner = require('./imports/inliner'); +var UrlRebase = require('./images/url-rebase'); +var EmptyRemoval = require('./selectors/empty-removal'); + +var CommentsProcessor = require('./text/comments'); +var ExpressionsProcessor = require('./text/expressions'); +var FreeTextProcessor = require('./text/free'); +var UrlsProcessor = require('./text/urls'); + +var SelectorsOptimizer = require('./selectors/optimizer'); + +module.exports = function(options) { + var lineBreak = process.platform == 'win32' ? '\r\n' : '\n'; + var stats = {}; + var context = { + errors: [], + warnings: [] + }; + + options = options || {}; + options.keepBreaks = options.keepBreaks || false; + + //active by default + if (options.processImport === undefined) + options.processImport = true; + + var minify = function(data) { + if (Buffer.isBuffer(data)) + data = data.toString(); + + var startedAt; + if (options.debug) { + startedAt = process.hrtime(); + stats.originalSize = data.length; + } + + var replace = function() { + if (typeof arguments[0] == 'function') + arguments[0](); + else + data = data.replace.apply(data, arguments); + }; + + // replace function + if (options.benchmark) { + var originalReplace = replace; + replace = function(pattern, replacement) { + var name = typeof pattern == 'function' ? + /function (\w+)\(/.exec(pattern.toString())[1] : + pattern; + + var start = process.hrtime(); + originalReplace(pattern, replacement); + + var itTook = process.hrtime(start); + console.log('%d ms: ' + name, 1000 * itTook[0] + itTook[1] / 1000000.0); + }; + } + + var commentsProcessor = new CommentsProcessor( + 'keepSpecialComments' in options ? options.keepSpecialComments : '*', + options.keepBreaks, + lineBreak + ); + var expressionsProcessor = new ExpressionsProcessor(); + var freeTextProcessor = new FreeTextProcessor(); + var urlsProcessor = new UrlsProcessor(); + var importInliner = new ImportInliner(context); + + if (options.processImport) { + // inline all imports + replace(function inlineImports() { + data = importInliner.process(data, { + root: options.root || process.cwd(), + relativeTo: options.relativeTo + }); + }); + } + + replace(function escapeComments() { + data = commentsProcessor.escape(data); + }); + + // replace all escaped line breaks + replace(/\\(\r\n|\n)/mg, ''); + + // strip parentheses in urls if possible (no spaces inside) + replace(/url\((['"])([^\)]+)['"]\)/g, function(match, quote, url) { + var unsafeDataURI = url.indexOf('data:') === 0 && url.match(/data:\w+\/[^;]+;base64,/) === null; + if (url.match(/[ \t]/g) !== null || unsafeDataURI) + return 'url(' + quote + url + quote + ')'; + else + return 'url(' + url + ')'; + }); + + // strip parentheses in animation & font names + replace(/(animation|animation\-name|font|font\-family):([^;}]+)/g, function(match, propertyName, def) { + return propertyName + ':' + def.replace(/['"]([a-zA-Z][a-zA-Z\d\-_]+)['"]/g, '$1'); + }); + + // strip parentheses in @keyframes + replace(/@(\-moz\-|\-o\-|\-webkit\-)?keyframes ([^{]+)/g, function(match, prefix, name) { + prefix = prefix || ''; + return '@' + prefix + 'keyframes ' + (name.indexOf(' ') > -1 ? name : name.replace(/['"]/g, '')); + }); + + // IE shorter filters, but only if single (IE 7 issue) + replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\([^\)]+\))([;}'"])/g, function(match, filter, args, suffix) { + return filter.toLowerCase() + args + suffix; + }); + + replace(function escapeExpressions() { + data = expressionsProcessor.escape(data); + }); + + // strip parentheses in attribute values + replace(/\[([^\]]+)\]/g, function(match, content) { + var eqIndex = content.indexOf('='); + var singleQuoteIndex = content.indexOf('\''); + var doubleQuoteIndex = content.indexOf('"'); + if (eqIndex < 0 && singleQuoteIndex < 0 && doubleQuoteIndex < 0) + return match; + if (singleQuoteIndex === 0 || doubleQuoteIndex === 0) + return match; + + var key = content.substring(0, eqIndex); + var value = content.substring(eqIndex + 1, content.length); + + if (/^['"](?:[a-zA-Z][a-zA-Z\d\-_]+)['"]$/.test(value)) + return '[' + key + '=' + value.substring(1, value.length - 1) + ']'; + else + return match; + }); + + replace(function escapeFreeText() { + data = freeTextProcessor.escape(data); + }); + + replace(function escapeUrls() { + data = urlsProcessor.escape(data); + }); + + // line breaks + replace(/[\r]?\n/g, ' '); + + // multiple whitespace + replace(/[\t ]+/g, ' '); + + // multiple semicolons (with optional whitespace) + replace(/;[ ]?;+/g, ';'); + + // multiple line breaks to one + replace(/ (?:\r\n|\n)/g, lineBreak); + replace(/(?:\r\n|\n)+/g, lineBreak); + + // remove spaces around selectors + replace(/ ([+~>]) /g, '$1'); + + // remove extra spaces inside content + replace(/([!\(\{\}:;=,\n]) /g, '$1'); + replace(/ ([!\)\{\};=,\n])/g, '$1'); + replace(/(?:\r\n|\n)\}/g, '}'); + replace(/([\{;,])(?:\r\n|\n)/g, '$1'); + replace(/ :([^\{\};]+)([;}])/g, ':$1$2'); + + // restore spaces inside IE filters (IE 7 issue) + replace(/progid:[^(]+\(([^\)]+)/g, function(match) { + return match.replace(/,/g, ', '); + }); + + // trailing semicolons + replace(/;\}/g, '}'); + + replace(function hsl2Hex() { + data = new ColorHSLToHex(data).process(); + }); + + replace(function rgb2Hex() { + data = new ColorRGBToHex(data).process(); + }); + + replace(function longToShortHex() { + data = new ColorLongToShortHex(data).process(); + }); + + replace(function shortenColors() { + data = new ColorShortener(data).process(); + }); + + // replace font weight with numerical value + replace(/(font\-weight|font):(normal|bold)([ ;\}!])(\w*)/g, function(match, property, weight, suffix, next) { + if (suffix == ' ' && next.length > 0 && !/[.\d]/.test(next)) + return match; + + if (weight == 'normal') + return property + ':400' + suffix + next; + else if (weight == 'bold') + return property + ':700' + suffix + next; + else + return match; + }); + + // zero + unit to zero + replace(/(\s|:|,)0(?:px|em|ex|cm|mm|in|pt|pc|%)/g, '$1' + '0'); + replace(/rect\(0(?:px|em|ex|cm|mm|in|pt|pc|%)/g, 'rect(0'); + + // fraction zeros removal + replace(/\.([1-9]*)0+(\D)/g, function(match, nonZeroPart, suffix) { + return (nonZeroPart ? '.' : '') + nonZeroPart + suffix; + }); + + // restore 0% in hsl/hsla + replace(/(hsl|hsla)\(([^\)]+)\)/g, function(match, colorFunction, colorDef) { + var tokens = colorDef.split(','); + if (tokens[1] == '0') + tokens[1] = '0%'; + if (tokens[2] == '0') + tokens[2] = '0%'; + return colorFunction + '(' + tokens.join(',') + ')'; + }); + + // none to 0 + replace(/(border|border-top|border-right|border-bottom|border-left|outline):none/g, '$1:0'); + + // background:none to background:0 0 + replace(/background:(?:none|transparent)([;}])/g, 'background:0 0$1'); + + // multiple zeros into one + replace(/box-shadow:0 0 0 0([^\.])/g, 'box-shadow:0 0$1'); + replace(/:0 0 0 0([^\.])/g, ':0$1'); + replace(/([: ,=\-])0\.(\d)/g, '$1.$2'); + + replace(function shorthandNotations() { + data = new ShorthandNotations(data).process(); + }); + + // restore rect(...) zeros syntax for 4 zeros + replace(/rect\(\s?0(\s|,)0[ ,]0[ ,]0\s?\)/g, 'rect(0$10$10$10)'); + + // remove universal selector when not needed (*#id, *.class etc) + replace(/\*([\.#:\[])/g, '$1'); + + // Restore spaces inside calc back + replace(/calc\([^\}]+\}/g, function(match) { + return match.replace(/\+/g, ' + '); + }); + + if (options.noAdvanced) { + if (options.keepBreaks) + replace(/\}/g, '}' + lineBreak); + } else { + replace(function optimizeSelectors() { + data = new SelectorsOptimizer(data, context, { + keepBreaks: options.keepBreaks, + lineBreak: lineBreak, + selectorsMergeMode: options.selectorsMergeMode + }).process(); + }); + } + + replace(function restoreUrls() { + data = urlsProcessor.restore(data); + }); + replace(function rebaseUrls() { + data = options.noRebase ? data : new UrlRebase(options, context).process(data); + }); + replace(function restoreFreeText() { + data = freeTextProcessor.restore(data); + }); + replace(function restoreComments() { + data = commentsProcessor.restore(data); + }); + replace(function restoreExpressions() { + data = expressionsProcessor.restore(data); + }); + + // move first charset to the beginning + replace(function moveCharset() { + // get first charset in stylesheet + var match = data.match(/@charset [^;]+;/); + var firstCharset = match ? match[0] : null; + if (!firstCharset) + return; + + // reattach first charset and remove all subsequent + data = firstCharset + + (options.keepBreaks ? lineBreak : '') + + data.replace(new RegExp('@charset [^;]+;(' + lineBreak + ')?', 'g'), '').trim(); + }); + + replace(function removeEmptySelectors() { + data = new EmptyRemoval(data).process(); + }); + + // trim spaces at beginning and end + data = data.trim(); + + if (options.debug) { + var elapsed = process.hrtime(startedAt); + stats.timeSpent = ~~(elapsed[0] * 1e3 + elapsed[1] / 1e6); + stats.efficiency = 1 - data.length / stats.originalSize; + stats.minifiedSize = data.length; + } + + return data; + }; + + return { + errors: context.errors, + lineBreak: lineBreak, + options: options, + minify: minify, + stats: stats, + warnings: context.warnings + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/hsl-to-hex.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/hsl-to-hex.js new file mode 100644 index 00000000..6bb50312 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/hsl-to-hex.js @@ -0,0 +1,64 @@ +module.exports = function HSLToHex(data) { + // HSL to RGB converter. Both methods adapted from: + // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + var hslToRgb = function(h, s, l) { + var r, g, b; + + // normalize hue orientation b/w 0 and 360 degrees + h = h % 360; + if (h < 0) + h += 360; + h = ~~h / 360; + + if (s < 0) + s = 0; + else if (s > 100) + s = 100; + s = ~~s / 100; + + if (l < 0) + l = 0; + else if (l > 100) + l = 100; + l = ~~l / 100; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? + l * (1 + s) : + l + s - l * s; + var p = 2 * l - q; + r = hueToRgb(p, q, h + 1/3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1/3); + } + + return [~~(r * 255), ~~(g * 255), ~~(b * 255)]; + }; + + var hueToRgb = function(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1/6) return p + (q - p) * 6 * t; + if (t < 1/2) return q; + if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + }; + + return { + process: function() { + return data.replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function(match, hue, saturation, lightness) { + var asRgb = hslToRgb(hue, saturation, lightness); + var redAsHex = asRgb[0].toString(16); + var greenAsHex = asRgb[1].toString(16); + var blueAsHex = asRgb[2].toString(16); + + return '#' + + ((redAsHex.length == 1 ? '0' : '') + redAsHex) + + ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) + + ((blueAsHex.length == 1 ? '0' : '') + blueAsHex); + }); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/long-to-short-hex.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/long-to-short-hex.js new file mode 100644 index 00000000..87fa31b2 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/long-to-short-hex.js @@ -0,0 +1,12 @@ +module.exports = function LongToShortHex(data) { + return { + process: function() { + return data.replace(/([,: \(])#([0-9a-f]{6})/gi, function(match, prefix, color) { + if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) + return prefix + '#' + color[0] + color[2] + color[4]; + else + return prefix + '#' + color; + }); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/rgb-to-hex.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/rgb-to-hex.js new file mode 100644 index 00000000..d235289b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/rgb-to-hex.js @@ -0,0 +1,16 @@ +module.exports = function RGBToHex(data) { + return { + process: function() { + return data.replace(/rgb\((\d+),(\d+),(\d+)\)/g, function(match, red, green, blue) { + var redAsHex = parseInt(red, 10).toString(16); + var greenAsHex = parseInt(green, 10).toString(16); + var blueAsHex = parseInt(blue, 10).toString(16); + + return '#' + + ((redAsHex.length == 1 ? '0' : '') + redAsHex) + + ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) + + ((blueAsHex.length == 1 ? '0' : '') + blueAsHex); + }); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/shortener.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/shortener.js new file mode 100644 index 00000000..7476f09b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/colors/shortener.js @@ -0,0 +1,174 @@ +module.exports = function Shortener(data) { + var COLORS = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#0ff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000', + blanchedalmond: '#ffebcd', + blue: '#00f', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#0ff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgreen: '#006400', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#f0f', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + green: '#008000', + greenyellow: '#adff2f', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgreen: '#90ee90', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#778899', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#0f0', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#ff00ff', + maroon: '#800000', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370db', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#db7093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + red: '#f00', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#fff', + whitesmoke: '#f5f5f5', + yellow: '#ff0', + yellowgreen: '#9acd32' + }; + + var toHex = {}; + var toName = {}; + + for (var name in COLORS) { + var color = COLORS[name]; + if (name.length < color.length) + toName[color] = name; + else + toHex[name] = color; + } + + return { + toHex: toHex, + toName: toName, + + // replace color name with hex values if shorter (or the other way around) + process: function() { + [toHex, toName].forEach(function(conversion) { + var pattern = '(' + Object.keys(conversion).join('|') + ')'; + var colorSwitcher = function(match, prefix, colorValue, suffix) { + return prefix + conversion[colorValue.toLowerCase()] + suffix; + }; + data = data.replace(new RegExp('([ :,\\(])' + pattern + '([;\\}!\\) ])', 'ig'), colorSwitcher); + data = data.replace(new RegExp('(,)' + pattern + '(,)', 'ig'), colorSwitcher); + }); + + return data; + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rebase.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rebase.js new file mode 100644 index 00000000..5b249544 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rebase.js @@ -0,0 +1,34 @@ +var path = require('path'); + +var UrlRewriter = require('./url-rewriter'); + +module.exports = function UrlRebase(options, context) { + var process = function(data) { + var rebaseOpts = { + absolute: !!options.root, + relative: !options.root && !!options.target, + fromBase: options.relativeTo + }; + + if (!rebaseOpts.absolute && !rebaseOpts.relative) + return data; + + if (rebaseOpts.absolute && !!options.target) + context.warnings.push('Both \'root\' and output file given so rebasing URLs as absolute paths'); + + if (rebaseOpts.absolute) + rebaseOpts.toBase = path.resolve(options.root); + + if (rebaseOpts.relative) + rebaseOpts.toBase = path.resolve(path.dirname(options.target)); + + if (!rebaseOpts.fromBase || !rebaseOpts.toBase) + return data; + + return UrlRewriter.process(data, rebaseOpts); + }; + + return { + process: process + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rewriter.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rewriter.js new file mode 100644 index 00000000..b41056fd --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/images/url-rewriter.js @@ -0,0 +1,53 @@ +var path = require('path'); + +module.exports = { + process: function(data, options) { + var tempData = []; + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + + for (; nextEnd < data.length; ) { + nextStart = data.indexOf('url(', nextEnd); + if (nextStart == -1) + break; + + nextEnd = data.indexOf(')', nextStart + 4); + if (nextEnd == -1) + break; + + tempData.push(data.substring(cursor, nextStart)); + var url = data.substring(nextStart + 4, nextEnd).replace(/['"]/g, ''); + tempData.push('url(' + this._rebased(url, options) + ')'); + cursor = nextEnd + 1; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }, + + _rebased: function(url, options) { + var specialUrl = url[0] == '/' || + url.substring(url.length - 4) == '.css' || + url.indexOf('data:') === 0 || + /^https?:\/\//.exec(url) !== null || + /__\w+__/.exec(url) !== null; + var rebased; + + if (specialUrl) + return url; + + if (options.absolute) { + rebased = path + .resolve(path.join(options.fromBase, url)) + .replace(options.toBase, ''); + } else { + rebased = path.relative(options.toBase, path.join(options.fromBase, url)); + } + + return process.platform == 'win32' ? + rebased.replace(/\\/g, '/') : + rebased; + } +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/imports/inliner.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/imports/inliner.js new file mode 100644 index 00000000..9180e3c7 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/imports/inliner.js @@ -0,0 +1,152 @@ +var fs = require('fs'); +var path = require('path'); + +var UrlRewriter = require('../images/url-rewriter'); + +module.exports = function Inliner(context) { + var process = function(data, options) { + var tempData = []; + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + var isComment = commentScanner(data); + + options.relativeTo = options.relativeTo || options.root; + options._baseRelativeTo = options._baseRelativeTo || options.relativeTo; + options.visited = options.visited || []; + + for (; nextEnd < data.length; ) { + nextStart = data.indexOf('@import', cursor); + if (nextStart == -1) + break; + + if (isComment(nextStart)) { + cursor = nextStart + 1; + continue; + } + + nextEnd = data.indexOf(';', nextStart); + if (nextEnd == -1) { + tempData.push(''); + cursor = data.length; + break; + } + + tempData.push(data.substring(cursor, nextStart)); + tempData.push(inlinedFile(data, nextStart, nextEnd, options)); + cursor = nextEnd + 1; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }; + + var commentScanner = function(data) { + var commentRegex = /(\/\*(?!\*\/)[\s\S]*?\*\/)/; + var lastStartIndex = 0; + var lastEndIndex = 0; + var noComments = false; + + // test whether an index is located within a comment + var scanner = function(idx) { + var comment; + var localStartIndex = 0; + var localEndIndex = 0; + var globalStartIndex = 0; + var globalEndIndex = 0; + + // return if we know there are no more comments + if (noComments) + return false; + + // idx can be still within last matched comment (many @import statements inside one comment) + if (idx > lastStartIndex && idx < lastEndIndex) + return true; + + comment = data.match(commentRegex); + + if (!comment) { + noComments = true; + return false; + } + + // get the indexes relative to the current data chunk + lastStartIndex = localStartIndex = comment.index; + localEndIndex = localStartIndex + comment[0].length; + + // calculate the indexes relative to the full original data + globalEndIndex = localEndIndex + lastEndIndex; + globalStartIndex = globalEndIndex - comment[0].length; + + // chop off data up to and including current comment block + data = data.substring(localEndIndex); + lastEndIndex = globalEndIndex; + + // re-run scan if comment ended before the idx + if (globalEndIndex < idx) + return scanner(idx); + + return globalEndIndex > idx && idx > globalStartIndex; + }; + + return scanner; + }; + + var inlinedFile = function(data, nextStart, nextEnd, options) { + var strippedImport = data + .substring(data.indexOf(' ', nextStart) + 1, nextEnd) + .replace(/^url\(/, '') + .replace(/['"]/g, ''); + + var separatorIndex = strippedImport.indexOf(' '); + var importedFile = strippedImport + .substring(0, separatorIndex > 0 ? separatorIndex : strippedImport.length) + .replace(')', ''); + var mediaQuery = strippedImport + .substring(importedFile.length + 1) + .trim(); + + if (/^(http|https):\/\//.test(importedFile) || /^\/\//.test(importedFile)) + return '@import url(' + importedFile + ')' + (mediaQuery.length > 0 ? ' ' + mediaQuery : '') + ';'; + + var relativeTo = importedFile[0] == '/' ? + options.root : + options.relativeTo; + + var fullPath = path.resolve(path.join(relativeTo, importedFile)); + + if (!fs.existsSync(fullPath) || !fs.statSync(fullPath).isFile()) { + context.errors.push('Broken @import declaration of "' + importedFile + '"'); + return ''; + } + + if (options.visited.indexOf(fullPath) != -1) + return ''; + + options.visited.push(fullPath); + + var importedData = fs.readFileSync(fullPath, 'utf8'); + var importRelativeTo = path.dirname(fullPath); + importedData = UrlRewriter.process(importedData, { + relative: true, + fromBase: importRelativeTo, + toBase: options._baseRelativeTo + }); + + var inlinedData = process(importedData, { + root: options.root, + relativeTo: importRelativeTo, + _baseRelativeTo: options.baseRelativeTo, + visited: options.visited + }); + return mediaQuery.length > 0 ? + '@media ' + mediaQuery + '{' + inlinedData + '}' : + inlinedData; + }; + + return { + // Inlines all imports taking care of repetitions, unknown files, and circular dependencies + process: process + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/optimizer.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/optimizer.js new file mode 100644 index 00000000..6106f379 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/optimizer.js @@ -0,0 +1,228 @@ +module.exports = function Optimizer() { + var overridable = { + 'animation-delay': ['animation'], + 'animation-direction': ['animation'], + 'animation-duration': ['animation'], + 'animation-fill-mode': ['animation'], + 'animation-iteration-count': ['animation'], + 'animation-name': ['animation'], + 'animation-play-state': ['animation'], + 'animation-timing-function': ['animation'], + '-moz-animation-delay': ['-moz-animation'], + '-moz-animation-direction': ['-moz-animation'], + '-moz-animation-duration': ['-moz-animation'], + '-moz-animation-fill-mode': ['-moz-animation'], + '-moz-animation-iteration-count': ['-moz-animation'], + '-moz-animation-name': ['-moz-animation'], + '-moz-animation-play-state': ['-moz-animation'], + '-moz-animation-timing-function': ['-moz-animation'], + '-o-animation-delay': ['-o-animation'], + '-o-animation-direction': ['-o-animation'], + '-o-animation-duration': ['-o-animation'], + '-o-animation-fill-mode': ['-o-animation'], + '-o-animation-iteration-count': ['-o-animation'], + '-o-animation-name': ['-o-animation'], + '-o-animation-play-state': ['-o-animation'], + '-o-animation-timing-function': ['-o-animation'], + '-webkit-animation-delay': ['-webkit-animation'], + '-webkit-animation-direction': ['-webkit-animation'], + '-webkit-animation-duration': ['-webkit-animation'], + '-webkit-animation-fill-mode': ['-webkit-animation'], + '-webkit-animation-iteration-count': ['-webkit-animation'], + '-webkit-animation-name': ['-webkit-animation'], + '-webkit-animation-play-state': ['-webkit-animation'], + '-webkit-animation-timing-function': ['-webkit-animation'], + 'background-attachment': ['background'], + 'background-clip': ['background'], + 'background-color': ['background'], + 'background-image': ['background'], + 'background-origin': ['background'], + 'background-position': ['background'], + 'background-repeat': ['background'], + 'background-size': ['background'], + 'border-color': ['border'], + 'border-style': ['border'], + 'border-width': ['border'], + 'border-bottom': ['border'], + 'border-bottom-color': ['border-bottom', 'border-color', 'border'], + 'border-bottom-style': ['border-bottom', 'border-style', 'border'], + 'border-bottom-width': ['border-bottom', 'border-width', 'border'], + 'border-left': ['border'], + 'border-left-color': ['border-left', 'border-color', 'border'], + 'border-left-style': ['border-left', 'border-style', 'border'], + 'border-left-width': ['border-left', 'border-width', 'border'], + 'border-right': ['border'], + 'border-right-color': ['border-right', 'border-color', 'border'], + 'border-right-style': ['border-right', 'border-style', 'border'], + 'border-right-width': ['border-right', 'border-width', 'border'], + 'border-top': ['border'], + 'border-top-color': ['border-top', 'border-color', 'border'], + 'border-top-style': ['border-top', 'border-style', 'border'], + 'border-top-width': ['border-top', 'border-width', 'border'], + 'font-family': ['font'], + 'font-size': ['font'], + 'font-style': ['font'], + 'font-variant': ['font'], + 'font-weight': ['font'], + 'list-style-image': ['list'], + 'list-style-position': ['list'], + 'list-style-type': ['list'], + 'margin-bottom': ['margin'], + 'margin-left': ['margin'], + 'margin-right': ['margin'], + 'margin-top': ['margin'], + 'outline-color': ['outline'], + 'outline-style': ['outline'], + 'outline-width': ['outline'], + 'padding-bottom': ['padding'], + 'padding-left': ['padding'], + 'padding-right': ['padding'], + 'padding-top': ['padding'], + 'transition-delay': ['transition'], + 'transition-duration': ['transition'], + 'transition-property': ['transition'], + 'transition-timing-function': ['transition'], + '-moz-transition-delay': ['-moz-transition'], + '-moz-transition-duration': ['-moz-transition'], + '-moz-transition-property': ['-moz-transition'], + '-moz-transition-timing-function': ['-moz-transition'], + '-o-transition-delay': ['-o-transition'], + '-o-transition-duration': ['-o-transition'], + '-o-transition-property': ['-o-transition'], + '-o-transition-timing-function': ['-o-transition'], + '-webkit-transition-delay': ['-webkit-transition'], + '-webkit-transition-duration': ['-webkit-transition'], + '-webkit-transition-property': ['-webkit-transition'], + '-webkit-transition-timing-function': ['-webkit-transition'] + }; + + var overrides = {}; + for (var granular in overridable) { + for (var i = 0; i < overridable[granular].length; i++) { + var coarse = overridable[granular][i]; + var list = overrides[coarse]; + + if (list) + list.push(granular); + else + overrides[coarse] = [granular]; + } + } + + var tokenize = function(body) { + var tokens = body.split(';'); + var keyValues = []; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + if (token === '') + continue; + + var firstColon = token.indexOf(':'); + keyValues.push([ + token.substring(0, firstColon), + token.substring(firstColon + 1), + token.indexOf('!important') > -1 + ]); + } + + return keyValues; + }; + + var optimize = function(tokens, allowAdjacent) { + var merged = []; + var properties = []; + var lastProperty = null; + var rescanTrigger = {}; + + var removeOverridenBy = function(property, isImportant) { + var overrided = overrides[property]; + for (var i = 0, l = overrided.length; i < l; i++) { + for (var j = 0; j < properties.length; j++) { + if (properties[j] != overrided[i] || (merged[j][2] && !isImportant)) + continue; + + merged.splice(j, 1); + properties.splice(j, 1); + j -= 1; + } + } + }; + + var mergeablePosition = function(position) { + if (allowAdjacent === false || allowAdjacent === true) + return allowAdjacent; + + return allowAdjacent.indexOf(position) > -1; + }; + + tokensLoop: + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + var property = token[0]; + var isImportant = token[2]; + var _property = (property == '-ms-filter' || property == 'filter') ? + (lastProperty == 'background' || lastProperty == 'background-image' ? lastProperty : property) : + property; + var toOverridePosition = 0; + + // comment is necessary - we assume that if two properties are one after another + // then it is intentional way of redefining property which may not be widely supported + // e.g. a{display:inline-block;display:-moz-inline-box} + // however if `mergeablePosition` yields true then the rule does not apply + // (e.g merging two adjacent selectors: `a{display:block}a{display:block}`) + if (_property != lastProperty || mergeablePosition(i)) { + while (true) { + toOverridePosition = properties.indexOf(_property, toOverridePosition); + if (toOverridePosition == -1) + break; + + if (merged[toOverridePosition][2] && !isImportant) + continue tokensLoop; + + merged.splice(toOverridePosition, 1); + properties.splice(toOverridePosition, 1); + } + } + + merged.push(token); + properties.push(_property); + + // certain properties (see values of `overridable`) should trigger removal of + // more granular properties (see keys of `overridable`) + if (rescanTrigger[_property]) + removeOverridenBy(_property, isImportant); + + // add rescan triggers - if certain property appears later in the list a rescan needs + // to be triggered, e.g 'border-top' triggers a rescan after 'border-top-width' and + // 'border-top-color' as they can be removed + for (var j = 0, list = overridable[_property] || [], m = list.length; j < m; j++) + rescanTrigger[list[j]] = true; + + lastProperty = _property; + } + + return merged; + }; + + var rebuild = function(tokens) { + var flat = []; + + for (var i = 0, l = tokens.length; i < l; i++) { + flat.push(tokens[i][0] + ':' + tokens[i][1]); + } + + return flat.join(';'); + }; + + return { + process: function(body, allowAdjacent) { + var tokens = tokenize(body); + if (tokens.length < 2) + return body; + + var optimized = optimize(tokens, allowAdjacent); + return rebuild(optimized); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/shorthand-notations.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/shorthand-notations.js new file mode 100644 index 00000000..f29b2d36 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/properties/shorthand-notations.js @@ -0,0 +1,50 @@ +module.exports = function ShorthandNotations(data) { + // shorthand notations + var shorthandRegex = function(repeats, hasSuffix) { + var pattern = '(padding|margin|border\\-width|border\\-color|border\\-style|border\\-radius):'; + for (var i = 0; i < repeats; i++) + pattern += '([\\d\\w\\.%#\\(\\),]+)' + (i < repeats - 1 ? ' ' : ''); + return new RegExp(pattern + (hasSuffix ? '([;}])' : ''), 'g'); + }; + + var from4Values = function() { + return data.replace(shorthandRegex(4), function(match, property, size1, size2, size3, size4) { + if (size1 === size2 && size1 === size3 && size1 === size4) + return property + ':' + size1; + else if (size1 === size3 && size2 === size4) + return property + ':' + size1 + ' ' + size2; + else if (size2 === size4) + return property + ':' + size1 + ' ' + size2 + ' ' + size3; + else + return match; + }); + }; + + var from3Values = function() { + return data.replace(shorthandRegex(3, true), function(match, property, size1, size2, size3, suffix) { + if (size1 === size2 && size1 === size3) + return property + ':' + size1 + suffix; + else if (size1 === size3) + return property + ':' + size1 + ' ' + size2 + suffix; + else + return match; + }); + }; + + var from2Values = function() { + return data.replace(shorthandRegex(2, true), function(match, property, size1, size2, suffix) { + if (size1 === size2) + return property + ':' + size1 + suffix; + else + return match; + }); + }; + + return { + process: function() { + data = from4Values(); + data = from3Values(); + return from2Values(); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/empty-removal.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/empty-removal.js new file mode 100644 index 00000000..ee193c16 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/empty-removal.js @@ -0,0 +1,30 @@ +module.exports = function EmptyRemoval(data) { + var stripEmpty = function(cssData) { + var tempData = []; + var nextEmpty = 0; + var cursor = 0; + + for (; nextEmpty < cssData.length; ) { + nextEmpty = cssData.indexOf('{}', cursor); + if (nextEmpty == -1) + break; + + var startsAt = nextEmpty - 1; + while (cssData[startsAt] && cssData[startsAt] != '}' && cssData[startsAt] != '{') + startsAt--; + + tempData.push(cssData.substring(cursor, startsAt + 1)); + cursor = nextEmpty + 2; + } + + return tempData.length > 0 ? + stripEmpty(tempData.join('') + cssData.substring(cursor, cssData.length)) : + cssData; + }; + + return { + process: function() { + return stripEmpty(data); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/optimizer.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/optimizer.js new file mode 100644 index 00000000..7dbfc578 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/optimizer.js @@ -0,0 +1,221 @@ +var Tokenizer = require('./tokenizer'); +var PropertyOptimizer = require('../properties/optimizer'); + +module.exports = function Optimizer(data, context, options) { + var specialSelectors = { + '*': /\-(moz|ms|o|webkit)\-/, + 'ie8': /(\-moz\-|\-ms\-|\-o\-|\-webkit\-|:not|:target|:visited|:empty|:first\-of|:last|:nth|:only|:root)/ + }; + + var propertyOptimizer = new PropertyOptimizer(); + + var cleanUpSelector = function(selectors) { + var plain = []; + selectors = selectors.split(','); + + for (var i = 0, l = selectors.length; i < l; i++) { + var sel = selectors[i]; + + if (plain.indexOf(sel) == -1) + plain.push(sel); + } + + return plain.sort().join(','); + }; + + var isSpecial = function(selector) { + return specialSelectors[options.selectorsMergeMode || '*'].test(selector); + }; + + var removeDuplicates = function(tokens) { + var matched = {}; + var forRemoval = []; + + for (var i = 0, l = tokens.length; i < l; i++) { + if (typeof(tokens[i]) == 'string' || tokens[i].block) + continue; + + var selector = tokens[i].selector; + var body = tokens[i].body; + var id = body + '@' + selector; + var alreadyMatched = matched[id]; + + if (alreadyMatched) { + forRemoval.push(alreadyMatched[alreadyMatched.length - 1]); + alreadyMatched.push(i); + } else { + matched[id] = [i]; + } + } + + forRemoval = forRemoval.sort(function(a, b) { return a > b ? 1 : -1; }); + for (var j = 0, n = forRemoval.length; j < n; j++) { + tokens.splice(forRemoval[j] - j, 1); + } + }; + + var mergeAdjacent = function(tokens) { + var forRemoval = []; + var lastToken = { selector: null, body: null }; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + if (typeof(token) == 'string' || token.block) + continue; + + if (token.selector == lastToken.selector) { + var joinAt = [lastToken.body.split(';').length]; + lastToken.body = propertyOptimizer.process(lastToken.body + ';' + token.body, joinAt); + forRemoval.push(i); + } else if (token.body == lastToken.body && !isSpecial(token.selector) && !isSpecial(lastToken.selector)) { + lastToken.selector = cleanUpSelector(lastToken.selector + ',' + token.selector); + forRemoval.push(i); + } else { + lastToken = token; + } + } + + for (var j = 0, m = forRemoval.length; j < m; j++) { + tokens.splice(forRemoval[j] - j, 1); + } + }; + + var reduceNonAdjacent = function(tokens) { + var matched = {}; + var matchedMoreThanOnce = []; + var partiallyReduced = []; + var token, selector, selectors; + var removeEmpty = function(value) { + return value.length > 0 ? value : ''; + }; + + for (var i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + selector = token.selector; + + if (typeof(token) == 'string' || token.block) + continue; + + selectors = selector.split(','); + if (selectors.length > 1) + selectors.push(selector); + + for (var j = 0, m = selectors.length; j < m; j++) { + var sel = selectors[j]; + var alreadyMatched = matched[sel]; + if (alreadyMatched) { + if (alreadyMatched.length == 1) + matchedMoreThanOnce.push(sel); + alreadyMatched.push(i); + } else { + matched[sel] = [i]; + } + } + } + + matchedMoreThanOnce.forEach(function(selector) { + var matchPositions = matched[selector]; + var bodies = []; + var joinsAt = []; + for (var j = 0, m = matchPositions.length; j < m; j++) { + var body = tokens[matchPositions[j]].body; + bodies.push(body); + joinsAt.push((joinsAt[j - 1] || 0) + body.split(';').length); + } + + var optimizedBody = propertyOptimizer.process(bodies.join(';'), joinsAt); + var optimizedTokens = optimizedBody.split(';'); + + var k = optimizedTokens.length - 1; + var currentMatch = matchPositions.length - 1; + + while (currentMatch >= 0) { + if (bodies[currentMatch].indexOf(optimizedTokens[k]) > -1 && k > -1) { + k -= 1; + continue; + } + + var tokenIndex = matchPositions[currentMatch]; + var token = tokens[tokenIndex]; + var reducedBody = optimizedTokens + .splice(k + 1) + .filter(removeEmpty) + .join(';'); + + if (token.selector == selector) { + token.body = reducedBody; + } else { + token._partials = token._partials || []; + token._partials.push(reducedBody); + + if (partiallyReduced.indexOf(tokenIndex) == -1) + partiallyReduced.push(tokenIndex); + } + + currentMatch -= 1; + } + }); + + // process those tokens which were partially reduced + // i.e. at least one of token's selectors saw reduction + // if all selectors were reduced to same value we can override it + for (i = 0, l = partiallyReduced.length; i < l; i++) { + token = tokens[partiallyReduced[i]]; + selectors = token.selector.split(','); + + if (token._partials.length == selectors.length && token.body != token._partials[0]) { + var newBody = token._partials[0]; + for (var k = 1, n = token._partials.length; k < n; k++) { + if (token._partials[k] != newBody) + break; + } + + if (k == n) + token.body = newBody; + } + + delete token._partials; + } + }; + + var optimize = function(tokens) { + tokens = (Array.isArray(tokens) ? tokens : [tokens]); + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + if (token.selector) { + token.selector = cleanUpSelector(token.selector); + token.body = propertyOptimizer.process(token.body, false); + } else if (token.block) { + optimize(token.body); + } + } + + removeDuplicates(tokens); + mergeAdjacent(tokens); + reduceNonAdjacent(tokens); + }; + + var rebuild = function(tokens) { + return (Array.isArray(tokens) ? tokens : [tokens]) + .map(function(token) { + if (typeof token == 'string') + return token; + + if (token.block) + return token.block + '{' + rebuild(token.body) + '}'; + else + return token.selector + '{' + token.body + '}'; + }) + .join(options.keepBreaks ? options.lineBreak : ''); + }; + + return { + process: function() { + var tokenized = new Tokenizer(data, context).process(); + optimize(tokenized); + return rebuild(tokenized); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/tokenizer.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/tokenizer.js new file mode 100644 index 00000000..e826efb0 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/selectors/tokenizer.js @@ -0,0 +1,129 @@ +module.exports = function Tokenizer(data, minifyContext) { + var flatBlock = /^@(font\-face|page|\-ms\-viewport|\-o\-viewport|viewport)/; + + var whatsNext = function(context) { + var cursor = context.cursor; + var mode = context.mode; + var closest; + + if (mode == 'body') { + closest = data.indexOf('}', cursor); + return closest > -1 ? + [closest, 'bodyEnd'] : + null; + } + + var nextSpecial = data.indexOf('@', cursor); + var nextEscape = mode == 'top' ? data.indexOf('__ESCAPED_COMMENT_CLEAN_CSS', cursor) : -1; + var nextBodyStart = data.indexOf('{', cursor); + var nextBodyEnd = data.indexOf('}', cursor); + + closest = nextSpecial; + if (closest == -1 || (nextEscape > -1 && nextEscape < closest)) + closest = nextEscape; + if (closest == -1 || (nextBodyStart > -1 && nextBodyStart < closest)) + closest = nextBodyStart; + if (closest == -1 || (nextBodyEnd > -1 && nextBodyEnd < closest)) + closest = nextBodyEnd; + + if (closest == -1) + return; + if (nextEscape === closest) + return [closest, 'escape']; + if (nextBodyStart === closest) + return [closest, 'bodyStart']; + if (nextBodyEnd === closest) + return [closest, 'bodyEnd']; + if (nextSpecial === closest) + return [closest, 'special']; + }; + + var tokenize = function(context) { + var tokenized = []; + + context = context || { cursor: 0, mode: 'top' }; + + while (true) { + var next = whatsNext(context); + if (!next) { + var whatsLeft = data.substring(context.cursor); + if (whatsLeft.length > 0) { + tokenized.push(whatsLeft); + context.cursor += whatsLeft.length; + } + break; + } + + var nextSpecial = next[0]; + var what = next[1]; + var nextEnd; + var oldMode; + + if (what == 'special') { + var fragment = data.substring(nextSpecial, context.cursor + '@font-face'.length + 1); + var isSingle = fragment.indexOf('@import') === 0 || fragment.indexOf('@charset') === 0; + if (isSingle) { + nextEnd = data.indexOf(';', nextSpecial + 1); + tokenized.push(data.substring(context.cursor, nextEnd + 1)); + + context.cursor = nextEnd + 1; + } else { + nextEnd = data.indexOf('{', nextSpecial + 1); + var block = data.substring(context.cursor, nextEnd).trim(); + + var isFlat = flatBlock.test(block); + oldMode = context.mode; + context.cursor = nextEnd + 1; + context.mode = isFlat ? 'body' : 'block'; + var specialBody = tokenize(context); + context.mode = oldMode; + + tokenized.push({ block: block, body: specialBody }); + } + } else if (what == 'escape') { + nextEnd = data.indexOf('__', nextSpecial + 1); + var escaped = data.substring(context.cursor, nextEnd + 2); + tokenized.push(escaped); + + context.cursor = nextEnd + 2; + } else if (what == 'bodyStart') { + var selector = data.substring(context.cursor, nextSpecial).trim(); + + oldMode = context.mode; + context.cursor = nextSpecial + 1; + context.mode = 'body'; + var body = tokenize(context); + context.mode = oldMode; + + tokenized.push({ selector: selector, body: body }); + } else if (what == 'bodyEnd') { + // extra closing brace at the top level can be safely ignored + if (context.mode == 'top') { + var at = context.cursor; + var warning = data[context.cursor] == '}' ? + 'Unexpected \'}\' in \'' + data.substring(at - 20, at + 20) + '\'. Ignoring.' : + 'Unexpected content: \'' + data.substring(at, nextSpecial + 1) + '\'. Ignoring.'; + + minifyContext.warnings.push(warning); + context.cursor = nextSpecial + 1; + continue; + } + + if (context.mode != 'block') + tokenized = data.substring(context.cursor, nextSpecial); + + context.cursor = nextSpecial + 1; + + break; + } + } + + return tokenized; + }; + + return { + process: function() { + return tokenize(); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/comments.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/comments.js new file mode 100644 index 00000000..5667e7ec --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/comments.js @@ -0,0 +1,59 @@ +var EscapeStore = require('./escape-store'); + +module.exports = function Comments(keepSpecialComments, keepBreaks, lineBreak) { + var comments = new EscapeStore('COMMENT'); + + return { + // Strip special comments (/*! ... */) by replacing them by a special marker + // for further restoring. Plain comments are removed. It's done by scanning data using + // String#indexOf scanning instead of regexps to speed up the process. + escape: function(data) { + var tempData = []; + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + + for (; nextEnd < data.length; ) { + nextStart = data.indexOf('/*', nextEnd); + nextEnd = data.indexOf('*/', nextStart + 2); + if (nextStart == -1 || nextEnd == -1) + break; + + tempData.push(data.substring(cursor, nextStart)); + if (data[nextStart + 2] == '!') { + // in case of special comments, replace them with a placeholder + var comment = data.substring(nextStart, nextEnd + 2); + var placeholder = comments.store(comment); + tempData.push(placeholder); + } + cursor = nextEnd + 2; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }, + + restore: function(data) { + var restored = 0; + var breakSuffix = keepBreaks ? lineBreak : ''; + + return data.replace(new RegExp(comments.placeholderPattern + '(' + lineBreak + '| )?', 'g'), function(match, placeholder) { + restored++; + + switch (keepSpecialComments) { + case '*': + return comments.restore(placeholder) + breakSuffix; + case 1: + case '1': + return restored == 1 ? + comments.restore(placeholder) + breakSuffix : + ''; + case 0: + case '0': + return ''; + } + }); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/escape-store.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/escape-store.js new file mode 100644 index 00000000..8c2f07f9 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/escape-store.js @@ -0,0 +1,32 @@ +module.exports = function EscapeStore(placeholderRoot) { + placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS'; + + var placeholderToData = {}; + var dataToPlaceholder = {}; + var count = 0; + var nextPlaceholder = function() { + return '__' + placeholderRoot + (count++) + '__'; + }; + var pattern = '(__' + placeholderRoot + '\\d{1,}__)'; + + return { + placeholderPattern: pattern, + + placeholderRegExp: new RegExp(pattern, 'g'), + + store: function(data) { + var placeholder = dataToPlaceholder[data]; + if (!placeholder) { + placeholder = nextPlaceholder(); + placeholderToData[placeholder] = data; + dataToPlaceholder[data] = placeholder; + } + + return placeholder; + }, + + restore: function(placeholder) { + return placeholderToData[placeholder]; + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/expressions.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/expressions.js new file mode 100644 index 00000000..2ca193bc --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/expressions.js @@ -0,0 +1,69 @@ +var EscapeStore = require('./escape-store'); + +module.exports = function Expressions() { + var expressions = new EscapeStore('EXPRESSION'); + + var findEnd = function(data, start) { + var end = start + 'expression'.length; + var level = 0; + var quoted = false; + + while(true) { + var next = data[end++]; + + if (quoted) { + quoted = next != '\'' && next != '"'; + } else { + quoted = next == '\'' || next == '"'; + + if (next == '(') + level++; + if (next == ')') + level--; + if (next == '}' && level == 1) { + end--; + level--; + } + } + + if (level === 0 || !next) + break; + } + + return end; + }; + + return { + // Escapes expressions by replacing them by a special + // marker for further restoring. It's done via string scanning + // instead of regexps to speed up the process. + escape: function(data) { + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + var tempData = []; + + for (; nextEnd < data.length; ) { + nextStart = data.indexOf('expression(', nextEnd); + if (nextStart == -1) + break; + + nextEnd = findEnd(data, nextStart); + + var expression = data.substring(nextStart, nextEnd); + var placeholder = expressions.store(expression); + tempData.push(data.substring(cursor, nextStart)); + tempData.push(placeholder); + cursor = nextEnd; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }, + + restore: function(data) { + return data.replace(expressions.placeholderRegExp, expressions.restore); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/free.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/free.js new file mode 100644 index 00000000..7ffee633 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/free.js @@ -0,0 +1,76 @@ +var EscapeStore = require('./escape-store'); + +module.exports = function Free() { + var texts = new EscapeStore('FREE_TEXT'); + + var findNonEscapedEnd = function(data, matched, start) { + var end = start; + while (true) { + end = data.indexOf(matched, end); + + if (end > -1 && data[end - 1] == '\\') { + end += 1; + continue; + } else { + break; + } + } + + return end; + }; + + return { + // Strip content tags by replacing them by the a special + // marker for further restoring. It's done via string scanning + // instead of regexps to speed up the process. + escape: function(data) { + var tempData = []; + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + var matchedParenthesis = null; + var singleParenthesis = '\''; + var doubleParenthesis = '"'; + var dataLength = data.length; + + for (; nextEnd < data.length; ) { + var nextStartSingle = data.indexOf(singleParenthesis, nextEnd + 1); + var nextStartDouble = data.indexOf(doubleParenthesis, nextEnd + 1); + + if (nextStartSingle == -1) + nextStartSingle = dataLength; + if (nextStartDouble == -1) + nextStartDouble = dataLength; + + if (nextStartSingle < nextStartDouble) { + nextStart = nextStartSingle; + matchedParenthesis = singleParenthesis; + } else { + nextStart = nextStartDouble; + matchedParenthesis = doubleParenthesis; + } + + if (nextStart == -1) + break; + + nextEnd = findNonEscapedEnd(data, matchedParenthesis, nextStart + 1); + if (nextEnd == -1) + break; + + var text = data.substring(nextStart, nextEnd + 1); + var placeholder = texts.store(text); + tempData.push(data.substring(cursor, nextStart)); + tempData.push(placeholder); + cursor = nextEnd + 1; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }, + + restore: function(data) { + return data.replace(texts.placeholderRegExp, texts.restore); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/urls.js b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/urls.js new file mode 100644 index 00000000..007e41d2 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/lib/text/urls.js @@ -0,0 +1,39 @@ +var EscapeStore = require('./escape-store'); + +module.exports = function Urls() { + var urls = new EscapeStore('URL'); + + return { + // Strip urls by replacing them by a special + // marker for further restoring. It's done via string scanning + // instead of regexps to speed up the process. + escape: function(data) { + var nextStart = 0; + var nextEnd = 0; + var cursor = 0; + var tempData = []; + + for (; nextEnd < data.length; ) { + nextStart = data.indexOf('url(', nextEnd); + if (nextStart == -1) + break; + + nextEnd = data.indexOf(')', nextStart); + + var url = data.substring(nextStart, nextEnd + 1); + var placeholder = urls.store(url); + tempData.push(data.substring(cursor, nextStart)); + tempData.push(placeholder); + cursor = nextEnd + 1; + } + + return tempData.length > 0 ? + tempData.join('') + data.substring(cursor, data.length) : + data; + }, + + restore: function(data) { + return data.replace(urls.placeholderRegExp, urls.restore); + } + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/History.md b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/History.md new file mode 100644 index 00000000..2e665828 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/History.md @@ -0,0 +1,179 @@ + +2.0.0 / 2013-07-18 +================== + + * remove input methods (.prompt, .confirm, etc) + +1.3.2 / 2013-07-18 +================== + + * add support for sub-commands to co-exist with the original command + +1.3.1 / 2013-07-18 +================== + + * add quick .runningCommand hack so you can opt-out of other logic when running a sub command + +1.3.0 / 2013-07-09 +================== + + * add EACCES error handling + * fix sub-command --help + +1.2.0 / 2013-06-13 +================== + + * allow "-" hyphen as an option argument + * support for RegExp coercion + +1.1.1 / 2012-11-20 +================== + + * add more sub-command padding + * fix .usage() when args are present. Closes #106 + +1.1.0 / 2012-11-16 +================== + + * add git-style executable subcommand support. Closes #94 + +1.0.5 / 2012-10-09 +================== + + * fix `--name` clobbering. Closes #92 + * fix examples/help. Closes #89 + +1.0.4 / 2012-09-03 +================== + + * add `outputHelp()` method. + +1.0.3 / 2012-08-30 +================== + + * remove invalid .version() defaulting + +1.0.2 / 2012-08-24 +================== + + * add `--foo=bar` support [arv] + * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus] + +1.0.1 / 2012-08-03 +================== + + * fix issue #56 + * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode()) + +1.0.0 / 2012-07-05 +================== + + * add support for optional option descriptions + * add defaulting of `.version()` to package.json's version + +0.6.1 / 2012-06-01 +================== + + * Added: append (yes or no) on confirmation + * Added: allow node.js v0.7.x + +0.6.0 / 2012-04-10 +================== + + * Added `.prompt(obj, callback)` support. Closes #49 + * Added default support to .choose(). Closes #41 + * Fixed the choice example + +0.5.1 / 2011-12-20 +================== + + * Fixed `password()` for recent nodes. Closes #36 + +0.5.0 / 2011-12-04 +================== + + * Added sub-command option support [itay] + +0.4.3 / 2011-12-04 +================== + + * Fixed custom help ordering. Closes #32 + +0.4.2 / 2011-11-24 +================== + + * Added travis support + * Fixed: line-buffered input automatically trimmed. Closes #31 + +0.4.1 / 2011-11-18 +================== + + * Removed listening for "close" on --help + +0.4.0 / 2011-11-15 +================== + + * Added support for `--`. Closes #24 + +0.3.3 / 2011-11-14 +================== + + * Fixed: wait for close event when writing help info [Jerry Hamlet] + +0.3.2 / 2011-11-01 +================== + + * Fixed long flag definitions with values [felixge] + +0.3.1 / 2011-10-31 +================== + + * Changed `--version` short flag to `-V` from `-v` + * Changed `.version()` so it's configurable [felixge] + +0.3.0 / 2011-10-31 +================== + + * Added support for long flags only. Closes #18 + +0.2.1 / 2011-10-24 +================== + + * "node": ">= 0.4.x < 0.7.0". Closes #20 + +0.2.0 / 2011-09-26 +================== + + * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] + +0.1.0 / 2011-08-24 +================== + + * Added support for custom `--help` output + +0.0.5 / 2011-08-18 +================== + + * Changed: when the user enters nothing prompt for password again + * Fixed issue with passwords beginning with numbers [NuckChorris] + +0.0.4 / 2011-08-15 +================== + + * Fixed `Commander#args` + +0.0.3 / 2011-08-15 +================== + + * Added default option value support + +0.0.2 / 2011-08-15 +================== + + * Added mask support to `Command#password(str[, mask], fn)` + * Added `Command#password(str, fn)` + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/Readme.md b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/Readme.md new file mode 100644 index 00000000..d1644012 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/Readme.md @@ -0,0 +1,195 @@ +# Commander.js + + The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). + + [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) + +## Installation + + $ npm install commander + +## Option parsing + + Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander'); + +program + .version('0.0.1') + .option('-p, --peppers', 'Add peppers') + .option('-P, --pineapple', 'Add pineapple') + .option('-b, --bbq', 'Add bbq sauce') + .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') + .parse(process.argv); + +console.log('you ordered a pizza with:'); +if (program.peppers) console.log(' - peppers'); +if (program.pineapple) console.log(' - pineapple'); +if (program.bbq) console.log(' - bbq'); +console.log(' - %s cheese', program.cheese); +``` + + Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +``` + $ ./examples/pizza --help + + Usage: pizza [options] + + Options: + + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineapple + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese [marble] + -h, --help output usage information + +``` + +## Coercion + +```js +function range(val) { + return val.split('..').map(Number); +} + +function list(val) { + return val.split(','); +} + +program + .version('0.0.1') + .usage('[options] ') + .option('-i, --integer ', 'An integer argument', parseInt) + .option('-f, --float ', 'A float argument', parseFloat) + .option('-r, --range ..', 'A range', range) + .option('-l, --list ', 'A list', list) + .option('-o, --optional [value]', 'An optional value') + .parse(process.argv); + +console.log(' int: %j', program.integer); +console.log(' float: %j', program.float); +console.log(' optional: %j', program.optional); +program.range = program.range || []; +console.log(' range: %j..%j', program.range[0], program.range[1]); +console.log(' list: %j', program.list); +console.log(' args: %j', program.args); +``` + +## Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviours, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('../'); + +function list(val) { + return val.split(',').map(Number); +} + +program + .version('0.0.1') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); + console.log(''); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +yielding the following help output: + +``` + +Usage: custom-help [options] + +Options: + + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + + $ custom-help --help + $ custom-help -h + +``` + +## .outputHelp() + + Output help information without exiting. + +## .help() + + Output help information and exit immediately. + +## Links + + - [API documentation](http://visionmedia.github.com/commander.js/) + - [ascii tables](https://github.com/LearnBoost/cli-table) + - [progress bars](https://github.com/visionmedia/node-progress) + - [more progress bars](https://github.com/substack/node-multimeter) + - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) + +## License + +(The MIT License) + +Copyright (c) 2011 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/gulp-minify-css/node_modules/clean-css/node_modules/commander/index.js b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/index.js new file mode 100644 index 00000000..d5778a75 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/index.js @@ -0,0 +1,847 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter; +var spawn = require('child_process').spawn; +var fs = require('fs'); +var exists = fs.existsSync; +var path = require('path'); +var dirname = path.dirname; +var basename = path.basename; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command; + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = ~flags.indexOf('<'); + this.optional = ~flags.indexOf('['); + this.bool = !~flags.indexOf('-no-'); + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description || ''; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function(){ + return this.long + .replace('--', '') + .replace('no-', ''); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg){ + return arg == this.short + || arg == this.long; +}; + +/** + * Initialize a new `Command`. + * + * @param {String} name + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this._execs = []; + this._args = []; + this._name = name; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Command.prototype.__proto__ = EventEmitter.prototype; + +/** + * Add command `name`. + * + * The `.action()` callback is invoked when the + * command `name` is specified via __ARGV__, + * and the remaining arguments are applied to the + * function for access. + * + * When the `name` is "*" an un-matched command + * will be passed as the first arg, followed by + * the rest of __ARGV__ remaining. + * + * Examples: + * + * program + * .version('0.0.1') + * .option('-C, --chdir ', 'change the working directory') + * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + * .option('-T, --no-tests', 'ignore test hook') + * + * program + * .command('setup') + * .description('run remote setup commands') + * .action(function(){ + * console.log('setup'); + * }); + * + * program + * .command('exec ') + * .description('run the given remote command') + * .action(function(cmd){ + * console.log('exec "%s"', cmd); + * }); + * + * program + * .command('*') + * .description('deploy the given env') + * .action(function(env){ + * console.log('deploying "%s"', env); + * }); + * + * program.parse(process.argv); + * + * @param {String} name + * @param {String} [desc] + * @return {Command} the new command + * @api public + */ + +Command.prototype.command = function(name, desc){ + var args = name.split(/ +/); + var cmd = new Command(args.shift()); + if (desc) cmd.description(desc); + if (desc) this.executables = true; + if (desc) this._execs[cmd._name] = true; + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + if (desc) return this; + return cmd; +}; + +/** + * Add an implicit `help [cmd]` subcommand + * which invokes `--help` for the given command. + * + * @api private + */ + +Command.prototype.addImplicitHelpCommand = function() { + this.command('help [cmd]', 'display help for [cmd]'); +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args){ + if (!args.length) return; + var self = this; + args.forEach(function(arg){ + switch (arg[0]) { + case '<': + self._args.push({ required: true, name: arg.slice(1, -1) }); + break; + case '[': + self._args.push({ required: false, name: arg.slice(1, -1) }); + break; + } + }); + return this; +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function(){ + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn){ + var self = this; + this.parent.on(this._name, function(args, unknown){ + // Parse any so-far unknown options + unknown = unknown || []; + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfNecessary(self, parsed.unknown); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + // Leftover arguments need to be pushed back. Fixes issue #56 + if (parsed.args.length) args = parsed.args.concat(args); + + self._args.forEach(function(arg, i){ + if (arg.required && null == args[i]) { + self.missingArgument(arg.name); + } + }); + + // Always append ourselves to the end of the arguments, + // to make sure we match the number of arguments the user + // expects + if (self._args.length) { + args[self._args.length] = self; + } else { + args.push(self); + } + + fn.apply(this, args); + }); + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to false + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => true + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|Mixed} fn or default + * @param {Mixed} defaultValue + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue){ + var self = this + , option = new Option(flags, description) + , oname = option.name() + , name = camelcase(oname); + + // default as 3rd arg + if ('function' != typeof fn) defaultValue = fn, fn = null; + + // preassign default value only for --no-*, [optional], or + if (false == option.bool || option.optional || option.required) { + // when --no-* we make sure default is true + if (false == option.bool) defaultValue = true; + // preassign only if we have a default + if (undefined !== defaultValue) self[name] = defaultValue; + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on(oname, function(val){ + // coercion + if (null != val && fn) val = fn(val); + + // unassigned or bool + if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { + // if no value, bool true, and we have a default, then use it! + if (null == val) { + self[name] = option.bool + ? defaultValue || true + : false; + } else { + self[name] = val; + } + } else if (null !== val) { + // reassign + self[name] = val; + } + }); + + return this; +}; + +/** + * Parse `argv`, settings options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv){ + // implicit help + if (this.executables) this.addImplicitHelpCommand(); + + // store raw args + this.rawArgs = argv; + + // guess name + this._name = this._name || basename(argv[1]); + + // process argv + var parsed = this.parseOptions(this.normalize(argv.slice(2))); + var args = this.args = parsed.args; + + var result = this.parseArgs(this.args, parsed.unknown); + + // executable sub-commands + var name = result.args[0]; + if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown); + + return result; +}; + +/** + * Execute a sub-command executable. + * + * @param {Array} argv + * @param {Array} args + * @param {Array} unknown + * @api private + */ + +Command.prototype.executeSubCommand = function(argv, args, unknown) { + args = args.concat(unknown); + + if (!args.length) this.help(); + if ('help' == args[0] && 1 == args.length) this.help(); + + // --help + if ('help' == args[0]) { + args[0] = args[1]; + args[1] = '--help'; + } + + // executable + var dir = dirname(argv[1]); + var bin = basename(argv[1]) + '-' + args[0]; + + // check for ./ first + var local = path.join(dir, bin); + + // run it + args = args.slice(1); + var proc = spawn(local, args, { stdio: 'inherit', customFds: [0, 1, 2] }); + proc.on('error', function(err){ + if (err.code == "ENOENT") { + console.error('\n %s(1) does not exist, try --help\n', bin); + } else if (err.code == "EACCES") { + console.error('\n %s(1) not executable. try chmod or run with root\n', bin); + } + }); + + this.runningCommand = proc; +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * This also normalizes equal sign and splits "--abc=def" into "--abc def". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args){ + var ret = [] + , arg + , index; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { + arg.slice(1).split('').forEach(function(c){ + ret.push('-' + c); + }); + } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { + ret.push(arg.slice(0, index), arg.slice(index + 1)); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown){ + var cmds = this.commands + , len = cmds.length + , name; + + if (args.length) { + name = args[0]; + if (this.listeners(name).length) { + this.emit(args.shift(), args, unknown); + } else { + this.emit('*', args); + } + } else { + outputHelpIfNecessary(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0) { + this.unknownOption(unknown[0]); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg){ + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {Array} + * @api public + */ + +Command.prototype.parseOptions = function(argv){ + var args = [] + , len = argv.length + , literal + , option + , arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if ('--' == arg) { + literal = true; + continue; + } + + if (literal) { + args.push(arg); + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (null == arg) return this.optionMissingArgument(option); + if ('-' == arg[0] && '-' != arg) return this.optionMissingArgument(option, arg); + this.emit(option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i+1]; + if (null == arg || ('-' == arg[0] && '-' != arg)) { + arg = null; + } else { + ++i; + } + this.emit(option.name(), arg); + // bool + } else { + this.emit(option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && '-' == arg[0]) { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if (argv[i+1] && '-' != argv[i+1][0]) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name){ + console.error(); + console.error(" error: missing required argument `%s'", name); + console.error(); + process.exit(1); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {String} option + * @param {String} flag + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag){ + console.error(); + if (flag) { + console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); + } else { + console.error(" error: option `%s' argument missing", option.flags); + } + console.error(); + process.exit(1); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag){ + console.error(); + console.error(" error: unknown option `%s'", flag); + console.error(); + process.exit(1); +}; + + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * @param {String} str + * @param {String} flags + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags){ + if (0 == arguments.length) return this._version; + this._version = str; + flags = flags || '-V, --version'; + this.option(flags, 'output the version number'); + this.on('version', function(){ + console.log(str); + process.exit(0); + }); + return this; +}; + +/** + * Set the description `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str){ + if (0 == arguments.length) return this._description; + this._description = str; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str){ + var args = this._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }); + + var usage = '[options' + + (this.commands.length ? '] [command' : '') + + ']' + + (this._args.length ? ' ' + args : ''); + + if (0 == arguments.length) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function(){ + return this.options.reduce(function(max, option){ + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function(){ + var width = this.largestOptionLength(); + + // Prepend the help information + return [pad('-h, --help', width) + ' ' + 'output usage information'] + .concat(this.options.map(function(option){ + return pad(option.flags, width) + + ' ' + option.description; + })) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function(){ + if (!this.commands.length) return ''; + return [ + '' + , ' Commands:' + , '' + , this.commands.map(function(cmd){ + var args = cmd._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }).join(' '); + + return pad(cmd._name + + (cmd.options.length + ? ' [options]' + : '') + ' ' + args, 22) + + (cmd.description() + ? ' ' + cmd.description() + : ''); + }).join('\n').replace(/^/gm, ' ') + , '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function(){ + return [ + '' + , ' Usage: ' + this._name + ' ' + this.usage() + , '' + this.commandHelp() + , ' Options:' + , '' + , '' + this.optionHelp().replace(/^/gm, ' ') + , '' + , '' + ].join('\n'); +}; + +/** + * Output help information for this command + * + * @api public + */ + +Command.prototype.outputHelp = function(){ + process.stdout.write(this.helpInformation()); + this.emit('--help'); +}; + +/** + * Output help information and exit. + * + * @api public + */ + +Command.prototype.help = function(){ + this.outputHelp(); + process.exit(); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word){ + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Output help information if necessary + * + * @param {Command} command to output help for + * @param {Array} array of options to search for -h or --help + * @api private + */ + +function outputHelpIfNecessary(cmd, options) { + options = options || []; + for (var i = 0; i < options.length; i++) { + if (options[i] == '--help' || options[i] == '-h') { + cmd.outputHelp(); + process.exit(0); + } + } +} diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/package.json b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/package.json new file mode 100644 index 00000000..0fe5fa89 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/node_modules/commander/package.json @@ -0,0 +1,38 @@ +{ + "name": "commander", + "version": "2.0.0", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "command", + "option", + "parser", + "prompt", + "stdin" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/commander.js.git" + }, + "devDependencies": { + "should": ">= 0.0.1" + }, + "scripts": { + "test": "make test" + }, + "main": "index", + "engines": { + "node": ">= 0.6.x" + }, + "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineapple');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineapple\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .outputHelp()\n\n Output help information without exiting.\n\n## .help()\n\n Output help information and exit immediately.\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "homepage": "https://github.com/visionmedia/commander.js", + "_id": "commander@2.0.0", + "_from": "commander@2.0.x" +} diff --git a/node_modules/gulp-minify-css/node_modules/clean-css/package.json b/node_modules/gulp-minify-css/node_modules/clean-css/package.json new file mode 100644 index 00000000..82a0cd91 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clean-css/package.json @@ -0,0 +1,72 @@ +{ + "name": "clean-css", + "version": "2.0.8", + "author": { + "name": "Jakub Pawlowicz", + "email": "jakub@goalsmashers.com", + "url": "http://twitter.com/GoalSmashers" + }, + "description": "A well-tested CSS minifier", + "license": "MIT", + "keywords": [ + "css", + "minifier" + ], + "homepage": "https://github.com/GoalSmashers/clean-css", + "repository": { + "type": "git", + "url": "https://github.com/GoalSmashers/clean-css.git" + }, + "bugs": { + "url": "https://github.com/GoalSmashers/clean-css/issues" + }, + "bin": { + "cleancss": "./bin/cleancss" + }, + "main": "index.js", + "files": [ + "bin", + "lib", + "History.md", + "index.js", + "LICENSE" + ], + "scripts": { + "bench": "node ./test/bench.js", + "check": "jshint .", + "prepublish": "jshint .", + "test": "vows" + }, + "dependencies": { + "commander": "2.0.x" + }, + "devDependencies": { + "jshint": "2.3.x", + "vows": "0.7.x" + }, + "jshintConfig": { + "browser": false, + "camelcase": true, + "curly": false, + "eqeqeq": false, + "eqnull": true, + "immed": true, + "latedef": true, + "multistr": true, + "noarg": true, + "node": true, + "plusplus": false, + "quotmark": "single", + "strict": false, + "trailing": true, + "undef": true, + "unused": true + }, + "engines": { + "node": ">=0.8.0" + }, + "readme": "[![NPM version](https://badge.fury.io/js/clean-css.png)](https://badge.fury.io/js/clean-css)\n[![Build Status](https://secure.travis-ci.org/GoalSmashers/clean-css.png)](https://travis-ci.org/GoalSmashers/clean-css)\n[![Dependency Status](https://david-dm.org/GoalSmashers/clean-css.png)](https://david-dm.org/GoalSmashers/clean-css)\n[![devDependency Status](https://david-dm.org/GoalSmashers/clean-css/dev-status.png)](https://david-dm.org/GoalSmashers/clean-css#info=devDependencies)\n\n## What is clean-css?\n\nClean-css is a fast and efficient [node.js](http://nodejs.org/) library for minifying CSS files.\n\nAccording to [tests](https://github.com/GoalSmashers/css-minification-benchmark) it is one of the best available.\n\n\n## Usage\n\n### What are the requirements?\n\n```\nnode.js 0.8.0+ (tested on CentOS, Ubuntu, OS X 10.6+, and Windows 7+)\n```\n\n### How to install clean-css?\n\n```\nnpm install clean-css\n```\n\n### How to upgrade clean-css from 1.x to 2.x?\n\n#### Command-line interface (CLI)\n\n```\nnpm update clean-css\n```\n\nor point `package.json` to version 2.x. That's it!\n\n#### Node.js module\n\nUpdate `clean-css` as for CLI above.\nThen change your JavaScript code from:\n\n```js\nvar minimized = CleanCSS.process(source, options);\n```\n\ninto\n\n```js\nvar minimized = new CleanCSS(options).minify(source);\n```\n\nAnd you are done.\n\n### How to use clean-css CLI?\n\nClean-css accepts the following command line arguments (please make sure\nyou use `` as the very last argument to avoid potential issues):\n\n```\ncleancss [options] \n\n-h, --help Output usage information\n-v, --version Output the version number\n-b, --keep-line-breaks Keep line breaks\n--s0 Remove all special comments, i.e. /*! comment */\n--s1 Remove all special comments but the first one\n-r, --root [root-path] A root path to which resolve absolute @import rules\n and rebase relative URLs\n-o, --output [output-file] Use [output-file] as output instead of STDOUT\n-s, --skip-import Disable @import processing\n--skip-rebase Disable URLs rebasing\n--skip-advanced Disable advanced optimizations - selector & property merging,\n reduction, etc.\n--selectors-merge-mode [ie8|*] Use `ie8` for compatibility mode, `*` for merge all (default)\n-d, --debug Shows debug information (minification time & compression efficiency)\n```\n\n#### Examples:\n\nTo minify a **public.css** file into **public-min.css** do:\n\n```\ncleancss -o public-min.css public.css\n```\n\nTo minify the same **public.css** into the standard output skip the `-o` parameter:\n\n```\ncleancss public.css\n```\n\nMore likely you would like to concatenate a couple of files.\nIf you are on a Unix-like system:\n\n```bash\ncat one.css two.css three.css | cleancss -o merged-and-minified.css\n```\n\nOn Windows:\n\n```bat\ntype one.css two.css three.css | cleancss -o merged-and-minified.css\n```\n\nOr even gzip the result at once:\n\n```bash\ncat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz\n```\n\n### How to use clean-css programmatically?\n\n```js\nvar CleanCSS = require('clean-css');\nvar source = 'a{font-weight:bold;}';\nvar minimized = new CleanCSS().minify(source);\n```\n\nCleanCSS constructor accepts a hash as a parameter, i.e.,\n`new CleanCSS(options).minify(source)` with the following options available:\n\n* `keepSpecialComments` - `*` for keeping all (default), `1` for keeping first one only, `0` for removing all\n* `keepBreaks` - whether to keep line breaks (default is false)\n* `benchmark` - turns on benchmarking mode measuring time spent on cleaning up\n (run `npm run bench` to see example)\n* `root` - path to resolve absolute `@import` rules and rebase relative URLs\n* `relativeTo` - path with which to resolve relative `@import` rules and URLs\n* `processImport` - whether to process `@import` rules\n* `noRebase` - whether to skip URLs rebasing\n* `noAdvanced` - set to true to disable advanced optimizations - selector & property merging, reduction, etc.\n* `selectorsMergeMode` - `ie8` for IE8 compatibility mode, `*` for merging all (default)\n* `debug` - set to true to get minification statistics under `stats` property (see `test/custom-test.js` for examples)\n\n### What are the clean-css' dev commands?\n\nFirst clone the source, then run:\n\n* `npm run bench` for clean-css benchmarks (see [test/bench.js](https://github.com/GoalSmashers/clean-css/blob/master/test/bench.js) for details)\n* `npm run check` to check JS sources with [JSHint](https://github.com/jshint/jshint/)\n* `npm test` for the test suite\n\n## Tips & Tricks\n\n### How to preserve a comment block?\n\nUse the `/*!` notation instead of the standard one `/*`:\n\n```css\n/*!\n Important comments included in minified output.\n*/\n```\n\n### How to rebase relative image URLs\n\nClean-css will handle it automatically for you (since version 1.1) in the following cases:\n\n* When using the CLI:\n 1. Use an output path via `-o`/`--output` to rebase URLs as relative to the output file.\n 2. Use a root path via `-r`/`--root` to rebase URLs as absolute from the given root path.\n 3. If you specify both then `-r`/`--root` takes precendence.\n* When using clean-css as a library:\n 1. Use a combination of `relativeTo` and `target` options for relative rebase (same as 1 in CLI).\n 2. Use a combination of `relativeTo` and `root` options for absolute rebase (same as 2 in CLI).\n 3. `root` takes precendence over `target` as in CLI.\n\n## Acknowledgments\n\n* Vincent Voyer ([@vvo](https://github.com/vvo)) for a patch with better\n empty element regex and for inspiring us to do many performance improvements\n in 0.4 release.\n* Isaac ([@facelessuser](https://github.com/facelessuser)) for pointing out\n a flaw in clean-css' stateless mode.\n* Jan Michael Alonzo ([@jmalonzo](https://github.com/jmalonzo)) for a patch\n removing node.js' old `sys` package.\n* [@XhmikosR](https://github.com/XhmikosR) for suggesting new features\n (option to remove special comments and strip out URLs quotation) and\n pointing out numerous improvements (JSHint, media queries).\n* Anthony Barre ([@abarre](https://github.com/abarre)) for improvements to\n `@import` processing, namely introducing the `--skip-import` /\n `processImport` options.\n* Simon Altschuler ([@altschuler](https://github.com/altschuler)) for fixing\n `@import` processing inside comments.\n\n## License\n\nClean-css is released under the [MIT License](https://github.com/GoalSmashers/clean-css/blob/master/LICENSE).\n", + "readmeFilename": "README.md", + "_id": "clean-css@2.0.8", + "_from": "clean-css@~2.0.7" +} diff --git a/node_modules/gulp-minify-css/node_modules/clone/.npmignore b/node_modules/gulp-minify-css/node_modules/clone/.npmignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/gulp-minify-css/node_modules/clone/.travis.yml b/node_modules/gulp-minify-css/node_modules/clone/.travis.yml new file mode 100644 index 00000000..58f23716 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - 0.10 diff --git a/node_modules/gulp-minify-css/node_modules/clone/LICENSE b/node_modules/gulp-minify-css/node_modules/clone/LICENSE new file mode 100644 index 00000000..f6514e9a --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/LICENSE @@ -0,0 +1,18 @@ +Copyright © 2011-2013 Paul Vorbach + +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, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/gulp-minify-css/node_modules/clone/README.md b/node_modules/gulp-minify-css/node_modules/clone/README.md new file mode 100644 index 00000000..6fe17b0b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/README.md @@ -0,0 +1,124 @@ +# clone + +[![build status](https://secure.travis-ci.org/pvorb/node-clone.png)](http://travis-ci.org/pvorb/node-clone) + +offers foolproof _deep cloning_ of variables in JavaScript. + + +## Installation + + npm install clone + +or + + ender build clone + + +## Example + +~~~ javascript +var clone = require('clone'); + +var a, b; + +a = { foo: { bar: 'baz' } }; // inital value of a + +b = clone(a); // clone a -> b +a.foo.bar = 'foo'; // change a + +console.log(a); // show a +console.log(b); // show b +~~~ + +This will print: + +~~~ javascript +{ foo: { bar: 'foo' } } +{ foo: { bar: 'baz' } } +~~~ + +**clone** masters cloning simple objects (even with custom prototype), arrays, +Date objects, and RegExp objects. Everything is cloned recursively, so that you +can clone dates in arrays in objects, for example. + + +## API + +`clone(val, circular)` + + * `val` -- the value that you want to clone, any type allowed + * `circular` -- boolean + + Call `clone` with `circular` set to `false` if you are certain that `obj` + contains no circular references. This will give better performance if needed. + There is no error if `undefined` or `null` is passed as `obj`. + +`clone.clonePrototype(obj)` + + * `obj` -- the object that you want to clone + +Does a prototype clone as +[described by Oran Looney](http://oranlooney.com/functional-javascript/). + + +## Circular References + +~~~ javascript +var a, b; + +a = { hello: 'world' }; + +a.myself = a; +b = clone(a); + +console.log(b); +~~~ + +This will print: + +~~~ javascript +{ hello: "world", myself: [Circular] } +~~~ + +So, `b.myself` points to `b`, not `a`. Neat! + + +## Test + + npm test + + +## Caveat + +Some special objects like a socket or `process.stdout`/`stderr` are known to not +be cloneable. If you find other objects that cannot be cloned, please [open an +issue](https://github.com/pvorb/node-clone/issues/new). + + +## Bugs and Issues + +If you encounter any bugs or issues, feel free to +[open an issue at github](https://github.com/pvorb/node-clone/issues) or send me +an email to . I also always like to hear from you, if you’re using +my code. + +## License + +Copyright © 2011-2013 Paul Vorbach + +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, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/gulp-minify-css/node_modules/clone/clone.js b/node_modules/gulp-minify-css/node_modules/clone/clone.js new file mode 100644 index 00000000..814056e4 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/clone.js @@ -0,0 +1,159 @@ +"use strict"; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +var util = { + isArray: function (ar) { + return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]'); + }, + isDate: function (d) { + return typeof d === 'object' && objectToString(d) === '[object Date]'; + }, + isRegExp: function (re) { + return typeof re === 'object' && objectToString(re) === '[object RegExp]'; + }, + getRegExpFlags: function (re) { + var flags = ''; + re.global && (flags += 'g'); + re.ignoreCase && (flags += 'i'); + re.multiline && (flags += 'm'); + return flags; + } +}; + +if (typeof module === 'object') + module.exports = clone; + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) +*/ +function clone(parent, circular) { + if (typeof circular == 'undefined') + circular = true; + + var useBuffer = typeof Buffer != 'undefined'; + + var circularParent = {}; + var circularResolved = {}; + var circularReplace = []; + + function _clone(parent, context, child, cIndex) { + var i; // Use local context within this function + // Deep clone all properties of parent into child + if (typeof parent == 'object') { + if (parent == null) + return parent; + // Check for circular references + for(i in circularParent) + if (circularParent[i] === parent) { + // We found a circular reference + circularReplace.push({'resolveTo': i, 'child': child, 'i': cIndex}); + return null; //Just return null for now... + // we will resolve circular references later + } + + // Add to list of all parent objects + circularParent[context] = parent; + // Now continue cloning... + if (util.isArray(parent)) { + child = []; + for(i in parent) + child[i] = _clone(parent[i], context + '[' + i + ']', child, i); + } + else if (util.isDate(parent)) + child = new Date(parent.getTime()); + else if (util.isRegExp(parent)) { + child = new RegExp(parent.source, util.getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (useBuffer && Buffer.isBuffer(parent)) + { + child = new Buffer(parent.length); + parent.copy(child); + } + else { + child = {}; + + // Also copy prototype over to new cloned object + child.__proto__ = parent.__proto__; + for(i in parent) + child[i] = _clone(parent[i], context + '[' + i + ']', child, i); + } + + // Add to list of all cloned objects + circularResolved[context] = child; + } + else + child = parent; //Just a simple shallow copy will do + return child; + } + + var i; + if (circular) { + var cloned = _clone(parent, '*'); + + // Now this object has been cloned. Let's check to see if there are any + // circular references for it + for(i in circularReplace) { + var c = circularReplace[i]; + if (c && c.child && c.i in c.child) { + c.child[c.i] = circularResolved[c.resolveTo]; + } + } + return cloned; + } else { + // Deep clone all properties of parent into child + var child; + if (typeof parent == 'object') { + if (parent == null) + return parent; + if (parent.constructor.name === 'Array') { + child = []; + for(i in parent) + child[i] = clone(parent[i], circular); + } + else if (util.isDate(parent)) + child = new Date(parent.getTime() ); + else if (util.isRegExp(parent)) { + child = new RegExp(parent.source, util.getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else { + child = {}; + child.__proto__ = parent.__proto__; + for(i in parent) + child[i] = clone(parent[i], circular); + } + } + else + child = parent; // Just a simple shallow clone will do + return child; + } +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; diff --git a/node_modules/gulp-minify-css/node_modules/clone/package.json b/node_modules/gulp-minify-css/node_modules/clone/package.json new file mode 100644 index 00000000..c30ff568 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/package.json @@ -0,0 +1,89 @@ +{ + "name": "clone", + "description": "deep cloning of objects and arrays", + "tags": [ + "clone", + "object", + "array", + "function", + "date" + ], + "version": "0.1.11", + "repository": { + "type": "git", + "url": "git://github.com/pvorb/node-clone.git" + }, + "bugs": { + "url": "https://github.com/pvorb/node-clone/issues" + }, + "main": "clone.js", + "author": { + "name": "Paul Vorbach", + "email": "paul@vorb.de", + "url": "http://vorb.de" + }, + "contributors": [ + { + "name": "Blake Miner", + "email": "miner.blake@gmail.com", + "url": "http://www.blakeminer.com/" + }, + { + "name": "Tian You", + "email": "axqd001@gmail.com", + "url": "http://blog.axqd.net/" + }, + { + "name": "George Stagas", + "email": "gstagas@gmail.com", + "url": "http://stagas.com/" + }, + { + "name": "Tobiasz Cudnik", + "email": "tobiasz.cudnik@gmail.com", + "url": "https://github.com/TobiaszCudnik" + }, + { + "name": "Pavel Lang", + "email": "langpavel@phpskelet.org", + "url": "https://github.com/langpavel" + }, + { + "name": "Dan MacTough", + "url": "http://yabfog.com/" + }, + { + "name": "w1nk", + "url": "https://github.com/w1nk" + }, + { + "name": "Hugh Kennedy", + "url": "http://twitter.com/hughskennedy" + }, + { + "name": "Dustin Diaz", + "url": "http://dustindiaz.com" + }, + { + "name": "Ilya Shaisultanov", + "url": "https://github.com/diversario" + } + ], + "engines": { + "node": "*" + }, + "dependencies": {}, + "devDependencies": { + "underscore": "*", + "nodeunit": "*" + }, + "optionalDependencies": {}, + "scripts": { + "test": "nodeunit test.js" + }, + "readme": "# clone\n\n[![build status](https://secure.travis-ci.org/pvorb/node-clone.png)](http://travis-ci.org/pvorb/node-clone)\n\noffers foolproof _deep cloning_ of variables in JavaScript.\n\n\n## Installation\n\n npm install clone\n\nor\n\n ender build clone\n\n\n## Example\n\n~~~ javascript\nvar clone = require('clone');\n\nvar a, b;\n\na = { foo: { bar: 'baz' } }; // inital value of a\n\nb = clone(a); // clone a -> b\na.foo.bar = 'foo'; // change a\n\nconsole.log(a); // show a\nconsole.log(b); // show b\n~~~\n\nThis will print:\n\n~~~ javascript\n{ foo: { bar: 'foo' } }\n{ foo: { bar: 'baz' } }\n~~~\n\n**clone** masters cloning simple objects (even with custom prototype), arrays,\nDate objects, and RegExp objects. Everything is cloned recursively, so that you\ncan clone dates in arrays in objects, for example.\n\n\n## API\n\n`clone(val, circular)`\n\n * `val` -- the value that you want to clone, any type allowed\n * `circular` -- boolean\n\n Call `clone` with `circular` set to `false` if you are certain that `obj`\n contains no circular references. This will give better performance if needed.\n There is no error if `undefined` or `null` is passed as `obj`.\n\n`clone.clonePrototype(obj)`\n\n * `obj` -- the object that you want to clone\n\nDoes a prototype clone as\n[described by Oran Looney](http://oranlooney.com/functional-javascript/).\n\n\n## Circular References\n\n~~~ javascript\nvar a, b;\n\na = { hello: 'world' };\n\na.myself = a;\nb = clone(a);\n\nconsole.log(b);\n~~~\n\nThis will print:\n\n~~~ javascript\n{ hello: \"world\", myself: [Circular] }\n~~~\n\nSo, `b.myself` points to `b`, not `a`. Neat!\n\n\n## Test\n\n npm test\n\n\n## Caveat\n\nSome special objects like a socket or `process.stdout`/`stderr` are known to not\nbe cloneable. If you find other objects that cannot be cloned, please [open an\nissue](https://github.com/pvorb/node-clone/issues/new).\n\n\n## Bugs and Issues\n\nIf you encounter any bugs or issues, feel free to\n[open an issue at github](https://github.com/pvorb/node-clone/issues) or send me\nan email to . I also always like to hear from you, if you’re using\nmy code.\n\n## License\n\nCopyright © 2011-2013 Paul Vorbach\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/pvorb/node-clone", + "_id": "clone@0.1.11", + "_from": "clone@~0.1.11" +} diff --git a/node_modules/gulp-minify-css/node_modules/clone/test.js b/node_modules/gulp-minify-css/node_modules/clone/test.js new file mode 100644 index 00000000..09804f82 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/clone/test.js @@ -0,0 +1,217 @@ +if(module.parent === null) { + console.log('Run this test file with nodeunit:'); + console.log('$ nodeunit test.js'); +} + + +var clone = require('./'); +var util = require('util'); +var _ = require('underscore'); + + + +exports["clone string"] = function(test) { + test.expect(2); // how many tests? + + var a = "foo"; + test.strictEqual(clone(a), a); + a = ""; + test.strictEqual(clone(a), a); + + test.done(); +}; + + + +exports["clone number"] = function(test) { + test.expect(5); // how many tests? + + var a = 0; + test.strictEqual(clone(a), a); + a = 1; + test.strictEqual(clone(a), a); + a = -1000; + test.strictEqual(clone(a), a); + a = 3.1415927; + test.strictEqual(clone(a), a); + a = -3.1415927; + test.strictEqual(clone(a), a); + + test.done(); +}; + + + +exports["clone date"] = function(test) { + test.expect(3); // how many tests? + + var a = new Date; + var c = clone(a); + test.ok(a instanceof Date); + test.ok(c instanceof Date); + test.equal(c.getTime(), a.getTime()); + + test.done(); +}; + + + +exports["clone object"] = function(test) { + test.expect(2); // how many tests? + + var a = { foo: { bar: "baz" } }; + var b = clone(a); + + test.ok(_(a).isEqual(b), "underscore equal"); + test.deepEqual(b, a); + + test.done(); +}; + + + +exports["clone array"] = function(test) { + test.expect(2); // how many tests? + + var a = [ + { foo: "bar" }, + "baz" + ]; + var b = clone(a); + + test.ok(_(a).isEqual(b), "underscore equal"); + test.deepEqual(b, a); + + test.done(); +}; + +exports["clone buffer"] = function(test) { + test.expect(1); + + var a = new Buffer("this is a test buffer"); + var b = clone(a); + + // no underscore equal since it has no concept of Buffers + test.deepEqual(b, a); + test.done(); +}; + + + +exports["clone regexp"] = function(test) { + test.expect(5); + + var a = /abc123/gi; + var b = clone(a); + + test.deepEqual(b, a); + + var c = /a/g; + test.ok(c.lastIndex === 0); + + c.exec('123a456a'); + test.ok(c.lastIndex === 4); + + var d = clone(c); + test.ok(d.global); + test.ok(d.lastIndex === 4); + + test.done(); +}; + + +exports["clone object containing array"] = function(test) { + test.expect(2); // how many tests? + + var a = { + arr1: [ { a: '1234', b: '2345' } ], + arr2: [ { c: '345', d: '456' } ] + }; + var b = clone(a); + + test.ok(_(a).isEqual(b), "underscore equal"); + test.deepEqual(b, a); + + test.done(); +}; + + + +exports["clone object with circular reference"] = function(test) { + test.expect(8); // how many tests? + + var _ = test.ok; + var c = [1, "foo", {'hello': 'bar'}, function() {}, false, [2]]; + var b = [c, 2, 3, 4]; + var a = {'b': b, 'c': c}; + a.loop = a; + a.loop2 = a; + c.loop = c; + c.aloop = a; + var aCopy = clone(a); + _(a != aCopy); + _(a.c != aCopy.c); + _(aCopy.c == aCopy.b[0]); + _(aCopy.c.loop.loop.aloop == aCopy); + _(aCopy.c[0] == a.c[0]); + + //console.log(util.inspect(aCopy, true, null) ); + //console.log("------------------------------------------------------------"); + //console.log(util.inspect(a, true, null) ); + _(eq(a, aCopy)); + aCopy.c[0] = 2; + _(!eq(a, aCopy)); + aCopy.c = "2"; + _(!eq(a, aCopy)); + //console.log("------------------------------------------------------------"); + //console.log(util.inspect(aCopy, true, null) ); + + function eq(x, y) { + return util.inspect(x, true, null) === util.inspect(y, true, null); + } + + test.done(); +}; + + + +exports['clonePrototype'] = function(test) { + test.expect(3); // how many tests? + + var a = { + a: "aaa", + x: 123, + y: 45.65 + }; + var b = clone.clonePrototype(a); + + test.strictEqual(b.a, a.a); + test.strictEqual(b.x, a.x); + test.strictEqual(b.y, a.y); + + test.done(); +} + +exports['cloneWithinNewVMContext'] = function(test) { + test.expect(3); + var vm = require('vm'); + var ctx = vm.createContext({ clone: clone }); + var script = "clone( {array: [1, 2, 3], date: new Date(), regex: /^foo$/ig} );"; + var results = vm.runInContext(script, ctx); + test.ok(results.array instanceof Array); + test.ok(results.date instanceof Date); + test.ok(results.regex instanceof RegExp); + test.done(); +} + +exports['cloneObjectWithNoConstructor'] = function(test) { + test.expect(3); + var n = null; + var a = { foo: 'bar' }; + a.__proto__ = n; + test.ok(typeof a === 'object'); + test.ok(typeof a !== null); + var b = clone(a); + test.ok(a.foo, b.foo); + test.done(); +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/.npmignore new file mode 100644 index 00000000..13abef4f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/.travis.yml new file mode 100644 index 00000000..895dbd36 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/LICENCE b/node_modules/gulp-minify-css/node_modules/event-stream/LICENCE new file mode 100644 index 00000000..171dd970 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/LICENCE @@ -0,0 +1,22 @@ +Copyright (c) 2011 Dominic Tarr + +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. \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/examples/pretty.js b/node_modules/gulp-minify-css/node_modules/event-stream/examples/pretty.js new file mode 100644 index 00000000..af043401 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/examples/pretty.js @@ -0,0 +1,25 @@ + +var inspect = require('util').inspect + +if(!module.parent) { + var es = require('..') //load event-stream + es.pipe( //pipe joins streams together + process.openStdin(), //open stdin + es.split(), //split stream to break on newlines + es.map(function (data, callback) {//turn this async function into a stream + var j + try { + j = JSON.parse(data) //try to parse input into json + } catch (err) { + return callback(null, data) //if it fails just pass it anyway + } + callback(null, inspect(j)) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) + } + +// run this +// +// curl -sS registry.npmjs.org/event-stream | node pretty.js +// diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/index.js new file mode 100644 index 00000000..a7c05bbb --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/index.js @@ -0,0 +1,302 @@ +//filter will reemit the data if cb(err,pass) pass is truthy + +// reduce is more tricky +// maybe we want to group the reductions or emit progress updates occasionally +// the most basic reduce just emits one 'data' event after it has recieved 'end' + +var Stream = require('stream').Stream + , es = exports + , through = require('through') + , from = require('from') + , duplex = require('duplexer') + , map = require('map-stream') + , pause = require('pause-stream') + , split = require('split') + , pipeline = require('stream-combiner') + +es.Stream = Stream //re-export Stream from core +es.through = through +es.from = from +es.duplex = duplex +es.map = map +es.pause = pause +es.split = split +es.pipeline = es.connect = es.pipe = pipeline +// merge / concat +// +// combine multiple streams into a single stream. +// will emit end only once + +es.concat = //actually this should be called concat +es.merge = function (/*streams...*/) { + var toMerge = [].slice.call(arguments) + var stream = new Stream() + var endCount = 0 + stream.writable = stream.readable = true + + toMerge.forEach(function (e) { + e.pipe(stream, {end: false}) + var ended = false + e.on('end', function () { + if(ended) return + ended = true + endCount ++ + if(endCount == toMerge.length) + stream.emit('end') + }) + }) + stream.write = function (data) { + this.emit('data', data) + } + stream.destroy = function () { + merge.forEach(function (e) { + if(e.destroy) e.destroy() + }) + } + return stream +} + + +// writable stream, collects all events into an array +// and calls back when 'end' occurs +// mainly I'm using this to test the other functions + +es.writeArray = function (done) { + if ('function' !== typeof done) + throw new Error('function writeArray (done): done must be function') + + var a = new Stream () + , array = [], isDone = false + a.write = function (l) { + array.push(l) + } + a.end = function () { + isDone = true + done(null, array) + } + a.writable = true + a.readable = false + a.destroy = function () { + a.writable = a.readable = false + if(isDone) return + done(new Error('destroyed before end'), array) + } + return a +} + +//return a Stream that reads the properties of an object +//respecting pause() and resume() + +es.readArray = function (array) { + var stream = new Stream() + , i = 0 + , paused = false + , ended = false + + stream.readable = true + stream.writable = false + + if(!Array.isArray(array)) + throw new Error('event-stream.read expects an array') + + stream.resume = function () { + if(ended) return + paused = false + var l = array.length + while(i < l && !paused && !ended) { + stream.emit('data', array[i++]) + } + if(i == l && !ended) + ended = true, stream.readable = false, stream.emit('end') + } + process.nextTick(stream.resume) + stream.pause = function () { + paused = true + } + stream.destroy = function () { + ended = true + stream.emit('close') + } + return stream +} + +// +// readable (asyncFunction) +// return a stream that calls an async function while the stream is not paused. +// +// the function must take: (count, callback) {... +// + +es.readable = +function (func, continueOnError) { + var stream = new Stream() + , i = 0 + , paused = false + , ended = false + , reading = false + + stream.readable = true + stream.writable = false + + if('function' !== typeof func) + throw new Error('event-stream.readable expects async function') + + stream.on('end', function () { ended = true }) + + function get (err, data) { + + if(err) { + stream.emit('error', err) + if(!continueOnError) stream.emit('end') + } else if (arguments.length > 1) + stream.emit('data', data) + + process.nextTick(function () { + if(ended || paused || reading) return + try { + reading = true + func.call(stream, i++, function () { + reading = false + get.apply(null, arguments) + }) + } catch (err) { + stream.emit('error', err) + } + }) + } + stream.resume = function () { + paused = false + get() + } + process.nextTick(get) + stream.pause = function () { + paused = true + } + stream.destroy = function () { + stream.emit('end') + stream.emit('close') + ended = true + } + return stream +} + + +// +// map sync +// + +es.mapSync = function (sync) { + return es.through(function write(data) { + var mappedData = sync(data) + if (typeof mappedData !== 'undefined') + this.emit('data', mappedData) + }) +} + +// +// log just print out what is coming through the stream, for debugging +// + +es.log = function (name) { + return es.through(function (data) { + var args = [].slice.call(arguments) + if(name) console.error(name, data) + else console.error(data) + this.emit('data', data) + }) +} + + +// +// child -- pipe through a child process +// + +es.child = function (child) { + + return es.duplex(child.stdin, child.stdout) + +} + +// +// parse +// +// must be used after es.split() to ensure that each chunk represents a line +// source.pipe(es.split()).pipe(es.parse()) + +es.parse = function () { + return es.through(function (data) { + var obj + try { + if(data) //ignore empty lines + obj = JSON.parse(data.toString()) + } catch (err) { + return console.error(err, 'attemping to parse:', data) + } + //ignore lines that where only whitespace. + if(obj !== undefined) + this.emit('data', obj) + }) +} +// +// stringify +// + +es.stringify = function () { + var Buffer = require('buffer').Buffer + return es.mapSync(function (e){ + return JSON.stringify(Buffer.isBuffer(e) ? e.toString() : e) + '\n' + }) +} + +// +// replace a string within a stream. +// +// warn: just concatenates the string and then does str.split().join(). +// probably not optimal. +// for smallish responses, who cares? +// I need this for shadow-npm so it's only relatively small json files. + +es.replace = function (from, to) { + return es.pipeline(es.split(from), es.join(to)) +} + +// +// join chunks with a joiner. just like Array#join +// also accepts a callback that is passed the chunks appended together +// this is still supported for legacy reasons. +// + +es.join = function (str) { + + //legacy api + if('function' === typeof str) + return es.wait(str) + + var first = true + return es.through(function (data) { + if(!first) + this.emit('data', str) + first = false + this.emit('data', data) + return true + }) +} + + +// +// wait. callback when 'end' is emitted, with all chunks appended as string. +// + +es.wait = function (callback) { + var body = '' + return es.through(function (data) { body += data }, + function () { + this.emit('data', body) + this.emit('end') + if(callback) callback(null, body) + }) +} + +es.pipeable = function () { + throw new Error('[EVENT-STREAM] es.pipeable is deprecated') +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.npmignore new file mode 100644 index 00000000..062c11e8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +*.err \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.travis.yml new file mode 100644 index 00000000..ed05f88d --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.11" + - "0.10" + - "0.8" + - "0.6" diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/LICENCE b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/LICENCE new file mode 100644 index 00000000..a23e08a8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/LICENCE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Raynos. + +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. \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/README.md b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/README.md new file mode 100644 index 00000000..61ff71aa --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/README.md @@ -0,0 +1,47 @@ +# duplexer + +[![build status][1]][2] [![dependency status][3]][4] + +[![browser support][5]][6] + +Creates a duplex stream + +Taken from [event-stream][7] + +## duplex (writeStream, readStream) + +Takes a writable stream and a readable stream and makes them appear as a readable writable stream. + +It is assumed that the two streams are connected to each other in some way. + +## Example + +```js +var grep = cp.exec('grep Stream') + +duplex(grep.stdin, grep.stdout) +``` + +## Installation + +`npm install duplexer` + +## Tests + +`npm test` + +## Contributors + + - Dominictarr + - Raynos + - samccone + +## MIT Licenced + + [1]: https://secure.travis-ci.org/Raynos/duplexer.png + [2]: https://travis-ci.org/Raynos/duplexer + [3]: https://david-dm.org/Raynos/duplexer.png + [4]: https://david-dm.org/Raynos/duplexer + [5]: https://ci.testling.com/Raynos/duplexer.png + [6]: https://ci.testling.com/Raynos/duplexer + [7]: https://github.com/dominictarr/event-stream#duplex-writestream-readstream diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/index.js new file mode 100644 index 00000000..a188a210 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/index.js @@ -0,0 +1,87 @@ +var Stream = require("stream") +var writeMethods = ["write", "end", "destroy"] +var readMethods = ["resume", "pause"] +var readEvents = ["data", "close"] +var slice = Array.prototype.slice + +module.exports = duplex + +function forEach (arr, fn) { + if (arr.forEach) { + return arr.forEach(fn) + } + + for (var i = 0; i < arr.length; i++) { + fn(arr[i], i) + } +} + +function duplex(writer, reader) { + var stream = new Stream() + var ended = false + + forEach(writeMethods, proxyWriter) + + forEach(readMethods, proxyReader) + + forEach(readEvents, proxyStream) + + reader.on("end", handleEnd) + + writer.on("drain", function() { + stream.emit("drain") + }) + + writer.on("error", reemit) + reader.on("error", reemit) + + stream.writable = writer.writable + stream.readable = reader.readable + + return stream + + function proxyWriter(methodName) { + stream[methodName] = method + + function method() { + return writer[methodName].apply(writer, arguments) + } + } + + function proxyReader(methodName) { + stream[methodName] = method + + function method() { + stream.emit(methodName) + var func = reader[methodName] + if (func) { + return func.apply(reader, arguments) + } + reader.emit(methodName) + } + } + + function proxyStream(methodName) { + reader.on(methodName, reemit) + + function reemit() { + var args = slice.call(arguments) + args.unshift(methodName) + stream.emit.apply(stream, args) + } + } + + function handleEnd() { + if (ended) { + return + } + ended = true + var args = slice.call(arguments) + args.unshift("end") + stream.emit.apply(stream, args) + } + + function reemit(err) { + stream.emit("error", err) + } +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/package.json new file mode 100644 index 00000000..86ab2145 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/package.json @@ -0,0 +1,57 @@ +{ + "name": "duplexer", + "version": "0.1.1", + "description": "Creates a duplex stream", + "keywords": [], + "author": { + "name": "Raynos", + "email": "raynos2@gmail.com" + }, + "repository": { + "type": "git", + "url": "git://github.com/Raynos/duplexer.git" + }, + "main": "index", + "homepage": "https://github.com/Raynos/duplexer", + "contributors": [ + { + "name": "Jake Verbaten" + } + ], + "bugs": { + "url": "https://github.com/Raynos/duplexer/issues", + "email": "raynos2@gmail.com" + }, + "devDependencies": { + "tape": "0.3.3", + "through": "~0.1.4" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/Raynos/duplexer/raw/master/LICENSE" + } + ], + "scripts": { + "test": "node test" + }, + "testling": { + "files": "test/index.js", + "browsers": [ + "ie/8..latest", + "firefox/16..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest" + ] + }, + "readme": "# duplexer\n\n[![build status][1]][2] [![dependency status][3]][4]\n\n[![browser support][5]][6]\n\nCreates a duplex stream\n\nTaken from [event-stream][7]\n\n## duplex (writeStream, readStream)\n\nTakes a writable stream and a readable stream and makes them appear as a readable writable stream.\n\nIt is assumed that the two streams are connected to each other in some way.\n\n## Example\n\n```js\nvar grep = cp.exec('grep Stream')\n\nduplex(grep.stdin, grep.stdout)\n```\n\n## Installation\n\n`npm install duplexer`\n\n## Tests\n\n`npm test`\n\n## Contributors\n\n - Dominictarr\n - Raynos\n - samccone\n\n## MIT Licenced\n\n [1]: https://secure.travis-ci.org/Raynos/duplexer.png\n [2]: https://travis-ci.org/Raynos/duplexer\n [3]: https://david-dm.org/Raynos/duplexer.png\n [4]: https://david-dm.org/Raynos/duplexer\n [5]: https://ci.testling.com/Raynos/duplexer.png\n [6]: https://ci.testling.com/Raynos/duplexer\n [7]: https://github.com/dominictarr/event-stream#duplex-writestream-readstream\n", + "readmeFilename": "README.md", + "_id": "duplexer@0.1.1", + "_from": "duplexer@~0.1.1" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/test/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/test/index.js new file mode 100644 index 00000000..4988e0d9 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/duplexer/test/index.js @@ -0,0 +1,31 @@ +var through = require("through") +var test = require("tape") + +var duplex = require("../index") + +var readable = through() +var writable = through(write) +var written = 0 +var data = 0 + +var stream = duplex(writable, readable) + +function write() { + written++ +} + +stream.on("data", ondata) + +function ondata() { + data++ +} + +test("emit and write", function(t) { + t.plan(2) + + stream.write() + readable.emit("data") + + t.equal(written, 1, "should have written once") + t.equal(data, 1, "should have recived once") +}) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.APACHE2 b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.APACHE2 new file mode 100644 index 00000000..6366c047 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.APACHE2 @@ -0,0 +1,15 @@ +Apache License, Version 2.0 + +Copyright (c) 2011 Dominic Tarr + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.MIT b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.MIT new file mode 100644 index 00000000..6eafbd73 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/LICENSE.MIT @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2011 Dominic Tarr + +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/gulp-minify-css/node_modules/event-stream/node_modules/from/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/index.js new file mode 100644 index 00000000..bba40da8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/index.js @@ -0,0 +1,68 @@ + +'use strict'; + +var Stream = require('stream') + +// from +// +// a stream that reads from an source. +// source may be an array, or a function. +// from handles pause behaviour for you. + +module.exports = +function from (source) { + if(Array.isArray(source)) { + source = source.slice() + return from (function (i) { + if(source.length) + this.emit('data', source.shift()) + else + this.emit('end') + return true + }) + } + var s = new Stream(), i = 0 + s.ended = false + s.started = false + s.readable = true + s.writable = false + s.paused = false + s.ended = false + s.pause = function () { + s.started = true + s.paused = true + } + function next () { + s.started = true + if(s.ended) return + while(!s.ended && !s.paused && source.call(s, i++, function () { + if(!s.ended && !s.paused) + next() + })) + ; + } + s.resume = function () { + s.started = true + s.paused = false + next() + } + s.on('end', function () { + s.ended = true + s.readable = false + process.nextTick(s.destroy) + }) + s.destroy = function () { + s.ended = true + s.emit('close') + } + /* + by default, the stream will start emitting at nextTick + if you want, you can pause it, after pipeing. + you can also resume before next tick, and that will also + work. + */ + process.nextTick(function () { + if(!s.started) s.resume() + }) + return s +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/package.json new file mode 100644 index 00000000..225113d8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/package.json @@ -0,0 +1,38 @@ +{ + "name": "from", + "version": "0.1.3", + "description": "Easy way to make a Readable Stream", + "main": "index.js", + "scripts": { + "test": "asynct test/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/from.git" + }, + "keywords": [ + "stream", + "streams", + "readable", + "easy" + ], + "devDependencies": { + "asynct": "1", + "stream-spec": "0", + "assertions": "~2.3.0" + }, + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "license": "MIT", + "readme": "# from\n\nAn easy way to create a `readable Stream`.\n\n## from(function getChunk(count, next))\n\nfrom takes a `getChunk` function and returns a stream. \n\n`getChunk` is called again and again, after each time the user calls `next()`, \nuntil the user emits `'end'`\n\nif `pause()` is called, the `getChunk` won't be called again untill `resume()` is called.\n\n\n```js\nvar from = require('from')\n\nvar stream = \n from(function getChunk(count, next) {\n //do some sort of data\n this.emit('data', whatever)\n \n if(itsOver)\n this.emit('end')\n\n //ready to handle the next chunk\n next()\n //or, if it's sync:\n return true \n })\n```\n\n## from(array)\n\nfrom also takes an `Array` whose elements it emits one after another.\n\n## License\nMIT / Apache2\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/from/issues" + }, + "homepage": "https://github.com/dominictarr/from", + "_id": "from@0.1.3", + "_from": "from@~0" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/readme.markdown new file mode 100644 index 00000000..a619163c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/readme.markdown @@ -0,0 +1,38 @@ +# from + +An easy way to create a `readable Stream`. + +## from(function getChunk(count, next)) + +from takes a `getChunk` function and returns a stream. + +`getChunk` is called again and again, after each time the user calls `next()`, +until the user emits `'end'` + +if `pause()` is called, the `getChunk` won't be called again untill `resume()` is called. + + +```js +var from = require('from') + +var stream = + from(function getChunk(count, next) { + //do some sort of data + this.emit('data', whatever) + + if(itsOver) + this.emit('end') + + //ready to handle the next chunk + next() + //or, if it's sync: + return true + }) +``` + +## from(array) + +from also takes an `Array` whose elements it emits one after another. + +## License +MIT / Apache2 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/test/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/test/index.js new file mode 100644 index 00000000..fafea576 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/from/test/index.js @@ -0,0 +1,141 @@ +var from = require('..') +var spec = require('stream-spec') +var a = require('assertions') + +function read(stream, callback) { + var actual = [] + stream.on('data', function (data) { + actual.push(data) + }) + stream.once('end', function () { + callback(null, actual) + }) + stream.once('error', function (err) { + callback(err) + }) +} + +function pause(stream) { + stream.on('data', function () { + if(Math.random() > 0.1) return + stream.pause() + process.nextTick(function () { + stream.resume() + }) + }) +} + +exports['inc'] = function (test) { + + var fs = from(function (i) { + this.emit('data', i) + if(i >= 99) + return this.emit('end') + return true + }) + + spec(fs).readable().validateOnExit() + + read(fs, function (err, arr) { + test.equal(arr.length, 100) + test.done() + }) +} + +exports['simple'] = function (test) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = from(expected.slice()) + + spec(t) + .readable() + .pausable({strict: true}) + .validateOnExit() + + read(t, function (err, actual) { + if(err) test.error(err) //fail + a.deepEqual(actual, expected) + test.done() + }) + +} + +exports['simple pausable'] = function (test) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = from(expected.slice()) + + spec(t) + .readable() + .pausable({strict: true}) + .validateOnExit() + + pause(t) + + read(t, function (err, actual) { + if(err) test.error(err) //fail + a.deepEqual(actual, expected) + test.done() + }) + +} + +exports['simple (not strictly pausable) setTimeout'] = function (test) { + + var l = 10 + , expected = [] + while(l--) expected.push(l * Math.random()) + + + var _expected = expected.slice() + var t = from(function (i, n) { + var self = this + setTimeout(function () { + if(_expected.length) + self.emit('data', _expected.shift()) + else + self.emit('end') + n() + }, 3) + }) + + /* + using from in this way will not be strictly pausable. + it could be extended to buffer outputs, but I think a better + way would be to use a PauseStream that implements strict pause. + */ + + spec(t) + .readable() + .pausable({strict: false }) + .validateOnExit() + + //pause(t) + var paused = false + var i = setInterval(function () { + if(!paused) t.pause() + else t.resume() + paused = !paused + }, 2) + + t.on('end', function () { + clearInterval(i) + }) + + read(t, function (err, actual) { + if(err) test.error(err) //fail + a.deepEqual(actual, expected) + test.done() + }) + +} + + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.npmignore new file mode 100644 index 00000000..13abef4f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.travis.yml new file mode 100644 index 00000000..895dbd36 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/LICENCE b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/LICENCE new file mode 100644 index 00000000..171dd970 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/LICENCE @@ -0,0 +1,22 @@ +Copyright (c) 2011 Dominic Tarr + +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. \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/examples/pretty.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/examples/pretty.js new file mode 100644 index 00000000..ab073987 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/examples/pretty.js @@ -0,0 +1,26 @@ + +var inspect = require('util').inspect + +if(!module.parent) { + var map = require('..') //load map-stream + var es = require('event-stream') //load event-stream + es.pipe( //pipe joins streams together + process.openStdin(), //open stdin + es.split(), //split stream to break on newlines + map(function (data, callback) { //turn this async function into a stream + var j + try { + j = JSON.parse(data) //try to parse input into json + } catch (err) { + return callback(null, data) //if it fails just pass it anyway + } + callback(null, inspect(j)) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) + } + +// run this +// +// curl -sS registry.npmjs.org/event-stream | node pretty.js +// diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/index.js new file mode 100644 index 00000000..09ae829d --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/index.js @@ -0,0 +1,145 @@ +//filter will reemit the data if cb(err,pass) pass is truthy + +// reduce is more tricky +// maybe we want to group the reductions or emit progress updates occasionally +// the most basic reduce just emits one 'data' event after it has recieved 'end' + + +var Stream = require('stream').Stream + + +//create an event stream and apply function to each .write +//emitting each response as data +//unless it's an empty callback + +module.exports = function (mapper, opts) { + + var stream = new Stream() + , self = this + , inputs = 0 + , outputs = 0 + , ended = false + , paused = false + , destroyed = false + , lastWritten = 0 + , inNext = false + + this.opts = opts || {}; + var errorEventName = this.opts.failures ? 'failure' : 'error'; + + // Items that are not ready to be written yet (because they would come out of + // order) get stuck in a queue for later. + var writeQueue = {} + + stream.writable = true + stream.readable = true + + function queueData (data, number) { + var nextToWrite = lastWritten + 1 + + if (number === nextToWrite) { + // If it's next, and its not undefined write it + if (data !== undefined) { + stream.emit.apply(stream, ['data', data]) + } + lastWritten ++ + nextToWrite ++ + } else { + // Otherwise queue it for later. + writeQueue[number] = data + } + + // If the next value is in the queue, write it + if (writeQueue.hasOwnProperty(nextToWrite)) { + var dataToWrite = writeQueue[nextToWrite] + delete writeQueue[nextToWrite] + return queueData(dataToWrite, nextToWrite) + } + + outputs ++ + if(inputs === outputs) { + if(paused) paused = false, stream.emit('drain') //written all the incoming events + if(ended) end() + } + } + + function next (err, data, number) { + if(destroyed) return + inNext = true + + if (!err || self.opts.failures) { + queueData(data, number) + } + + if (err) { + stream.emit.apply(stream, [ errorEventName, err ]); + } + + inNext = false; + } + + // Wrap the mapper function by calling its callback with the order number of + // the item in the stream. + function wrappedMapper (input, number, callback) { + return mapper.call(null, input, function(err, data){ + callback(err, data, number) + }) + } + + stream.write = function (data) { + if(ended) throw new Error('map stream is not writable') + inNext = false + inputs ++ + + try { + //catch sync errors and handle them like async errors + var written = wrappedMapper(data, inputs, next) + paused = (written === false) + return !paused + } catch (err) { + //if the callback has been called syncronously, and the error + //has occured in an listener, throw it again. + if(inNext) + throw err + next(err) + return !paused + } + } + + function end (data) { + //if end was called with args, write it, + ended = true //write will emit 'end' if ended is true + stream.writable = false + if(data !== undefined) { + return queueData(data, inputs) + } else if (inputs == outputs) { //wait for processing + stream.readable = false, stream.emit('end'), stream.destroy() + } + } + + stream.end = function (data) { + if(ended) return + end() + } + + stream.destroy = function () { + ended = destroyed = true + stream.writable = stream.readable = paused = false + process.nextTick(function () { + stream.emit('close') + }) + } + stream.pause = function () { + paused = true + } + + stream.resume = function () { + paused = false + } + + return stream +} + + + + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/package.json new file mode 100644 index 00000000..e9c4ee04 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/package.json @@ -0,0 +1,34 @@ +{ + "name": "map-stream", + "version": "0.1.0", + "description": "construct pipes of streams of events", + "homepage": "http://github.com/dominictarr/map-stream", + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/map-stream.git" + }, + "dependencies": {}, + "devDependencies": { + "asynct": "*", + "it-is": "1", + "ubelt": "~2.9", + "stream-spec": "~0.2", + "event-stream": "~2.1", + "from": "0.0.2" + }, + "scripts": { + "test": "asynct test/" + }, + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "http://dominictarr.com" + }, + "readme": "# MapStream\n\nRefactored out of [event-stream](https://github.com/dominictarr/event-stream)\n\n##map (asyncFunction[, options])\n\nCreate a through stream from an asyncronous function. \n\n``` js\nvar map = require('map-stream')\n\nmap(function (data, callback) {\n //transform data\n // ...\n callback(null, data)\n})\n\n```\n\nEach map MUST call the callback. It may callback with data, with an error or with no arguments, \n\n * `callback()` drop this data. \n this makes the map work like `filter`, \n note:`callback(null,null)` is not the same, and will emit `null`\n\n * `callback(null, newData)` turn data into newData\n \n * `callback(error)` emit an error for this item.\n\n>Note: if a callback is not called, `map` will think that it is still being processed, \n>every call must be answered or the stream will not know when to end. \n>\n>Also, if the callback is called more than once, every call but the first will be ignored.\n\n##Options \n\n * `failures` - `boolean` continue mapping even if error occured. On error `map-stream` will emit `failure` event. (default: `false`)\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/map-stream/issues" + }, + "_id": "map-stream@0.1.0", + "_from": "map-stream@~0.1.0" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/readme.markdown new file mode 100644 index 00000000..18971588 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/readme.markdown @@ -0,0 +1,37 @@ +# MapStream + +Refactored out of [event-stream](https://github.com/dominictarr/event-stream) + +##map (asyncFunction[, options]) + +Create a through stream from an asyncronous function. + +``` js +var map = require('map-stream') + +map(function (data, callback) { + //transform data + // ... + callback(null, data) +}) + +``` + +Each map MUST call the callback. It may callback with data, with an error or with no arguments, + + * `callback()` drop this data. + this makes the map work like `filter`, + note:`callback(null,null)` is not the same, and will emit `null` + + * `callback(null, newData)` turn data into newData + + * `callback(error)` emit an error for this item. + +>Note: if a callback is not called, `map` will think that it is still being processed, +>every call must be answered or the stream will not know when to end. +> +>Also, if the callback is called more than once, every call but the first will be ignored. + +##Options + + * `failures` - `boolean` continue mapping even if error occured. On error `map-stream` will emit `failure` event. (default: `false`) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/test/simple-map.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/test/simple-map.asynct.js new file mode 100644 index 00000000..2b9a2922 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/map-stream/test/simple-map.asynct.js @@ -0,0 +1,318 @@ +'use strict'; + +var map = require('../') + , it = require('it-is') + , u = require('ubelt') + , spec = require('stream-spec') + , from = require('from') + , Stream = require('stream') + , es = require('event-stream') + +//REFACTOR THIS TEST TO USE es.readArray and es.writeArray + +function writeArray(array, stream) { + + array.forEach( function (j) { + stream.write(j) + }) + stream.end() + +} + +function readStream(stream, done) { + + var array = [] + stream.on('data', function (data) { + array.push(data) + }) + stream.on('error', done) + stream.on('end', function (data) { + done(null, array) + }) + +} + +//call sink on each write, +//and complete when finished. + +function pauseStream (prob, delay) { + var pauseIf = ( + 'number' == typeof prob + ? function () { + return Math.random() < prob + } + : 'function' == typeof prob + ? prob + : 0.1 + ) + var delayer = ( + !delay + ? process.nextTick + : 'number' == typeof delay + ? function (next) { setTimeout(next, delay) } + : delay + ) + + return es.through(function (data) { + if(!this.paused && pauseIf()) { + console.log('PAUSE STREAM PAUSING') + this.pause() + var self = this + delayer(function () { + console.log('PAUSE STREAM RESUMING') + self.resume() + }) + } + console.log("emit ('data', " + data + ')') + this.emit('data', data) + }) +} + +exports ['simple map applied to a stream'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + //create event stream from + + var doubler = map(function (data, cb) { + cb(null, data * 2) + }) + + spec(doubler).through().validateOnExit() + + //a map is only a middle man, so it is both readable and writable + + it(doubler).has({ + readable: true, + writable: true, + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.map(function (j) { + return j * 2 + })) +// process.nextTick(x.validate) + test.done() + }) + + writeArray(input, doubler) + +} + +exports ['stream comes back in the correct order'] = function (test) { + var input = [3, 2, 1] + + var delayer = map(function(data, cb){ + setTimeout(function () { + cb(null, data) + }, 100 * data) + }) + + readStream(delayer, function (err, output) { + it(output).deepEqual(input) + test.done() + }) + + writeArray(input, delayer) +} + +exports ['continues on error event with failures `true`'] = function (test) { + var input = [1, 2, 3] + + var delayer = map(function(data, cb){ + cb(new Error('Something gone wrong'), data) + }, { failures: true }) + + readStream(delayer, function (err, output) { + it(output).deepEqual(input) + test.done() + }) + + writeArray(input, delayer) +} + +exports['pipe two maps together'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + //create event stream from + function dd (data, cb) { + cb(null, data * 2) + } + var doubler1 = map(dd), doubler2 = map(dd) + + doubler1.pipe(doubler2) + + spec(doubler1).through().validateOnExit() + spec(doubler2).through().validateOnExit() + + readStream(doubler2, function (err, output) { + it(output).deepEqual(input.map(function (j) { + return j * 4 + })) + test.done() + }) + + writeArray(input, doubler1) + +} + +//next: +// +// test pause, resume and drian. +// + +// then make a pipe joiner: +// +// plumber (evStr1, evStr2, evStr3, evStr4, evStr5) +// +// will return a single stream that write goes to the first + +exports ['map will not call end until the callback'] = function (test) { + + var ticker = map(function (data, cb) { + process.nextTick(function () { + cb(null, data * 2) + }) + }) + + spec(ticker).through().validateOnExit() + + ticker.write('x') + ticker.end() + + ticker.on('end', function () { + test.done() + }) +} + +exports ['emit failures with opts.failures === `ture`'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , mapper = + map(function () { + throw err + }, { failures: true }) + + mapper.on('failure', function (_err) { + it(_err).equal(err) + test.done() + }) + + mapper.write('hello') + +} + +exports ['emit error thrown'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , mapper = + map(function () { + throw err + }) + + mapper.on('error', function (_err) { + it(_err).equal(err) + test.done() + }) + + mapper.write('hello') + +} + +exports ['emit error calledback'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , mapper = + map(function (data, callback) { + callback(err) + }) + + mapper.on('error', function (_err) { + it(_err).equal(err) + test.done() + }) + + mapper.write('hello') + +} + +exports ['do not emit drain if not paused'] = function (test) { + + var maps = map(function (data, callback) { + u.delay(callback)(null, 1) + return true + }) + + spec(maps).through().pausable().validateOnExit() + + maps.on('drain', function () { + it(false).ok('should not emit drain unless the stream is paused') + }) + + it(maps.write('hello')).equal(true) + it(maps.write('hello')).equal(true) + it(maps.write('hello')).equal(true) + setTimeout(function () {maps.end()},10) + maps.on('end', test.done) +} + +exports ['emits drain if paused, when all '] = function (test) { + var active = 0 + var drained = false + var maps = map(function (data, callback) { + active ++ + u.delay(function () { + active -- + callback(null, 1) + })() + console.log('WRITE', false) + return false + }) + + spec(maps).through().validateOnExit() + + maps.on('drain', function () { + drained = true + it(active).equal(0, 'should emit drain when all maps are done') + }) + + it(maps.write('hello')).equal(false) + it(maps.write('hello')).equal(false) + it(maps.write('hello')).equal(false) + + process.nextTick(function () {maps.end()},10) + + maps.on('end', function () { + console.log('end') + it(drained).ok('shoud have emitted drain before end') + test.done() + }) + +} + +exports ['map applied to a stream with filtering'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + + var doubler = map(function (data, callback) { + if (data % 2) + callback(null, data * 2) + else + callback() + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.filter(function (j) { + return j % 2 + }).map(function (j) { + return j * 2 + })) + test.done() + }) + + spec(doubler).through().validateOnExit() + + writeArray(input, doubler) + +} + + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/.npmignore new file mode 100644 index 00000000..13abef4f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/LICENSE b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/LICENSE new file mode 100644 index 00000000..6a477d4c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/LICENSE @@ -0,0 +1,231 @@ +Dual Licensed MIT and Apache 2 + +The MIT License + +Copyright (c) 2013 Dominic Tarr + +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. + + + ----------------------------------------------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2013 Dominic Tarr + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/index.js new file mode 100644 index 00000000..0e0bf96b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/index.js @@ -0,0 +1,3 @@ +//through@2 handles this by default! +module.exports = require('through') + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/package.json new file mode 100644 index 00000000..12224533 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/package.json @@ -0,0 +1,47 @@ +{ + "name": "pause-stream", + "version": "0.0.11", + "description": "a ThroughStream that strictly buffers all readable events when paused.", + "main": "index.js", + "directories": { + "test": "test" + }, + "devDependencies": { + "stream-tester": "0.0.2", + "stream-spec": "~0.2.0" + }, + "scripts": { + "test": "node test/index.js && node test/pause-end.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/pause-stream.git" + }, + "keywords": [ + "stream", + "pipe", + "pause", + "drain", + "buffer" + ], + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + }, + "readme": "# PauseStream\n\nThis is a `Stream` that will strictly buffer when paused.\nConnect it to anything you need buffered.\n\n``` js\n var ps = require('pause-stream')();\n\n badlyBehavedStream.pipe(ps.pause())\n\n aLittleLater(function (err, data) {\n ps.pipe(createAnotherStream(data))\n ps.resume()\n })\n```\n\n`PauseStream` will buffer whenever paused.\nit will buffer when yau have called `pause` manually.\nbut also when it's downstream `dest.write()===false`.\nit will attempt to drain the buffer when you call resume\nor the downstream emits `'drain'`\n\n`PauseStream` is tested using [stream-spec](https://github.com/dominictarr/stream-spec)\nand [stream-tester](https://github.com/dominictarr/stream-tester)\n\nThis is now the default case of \n[through](https://github.com/dominictarr/through)\n\nhttps://github.com/dominictarr/pause-stream/commit/4a6fe3dc2c11091b1efbfde912e0473719ed9cc0\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/pause-stream/issues" + }, + "homepage": "https://github.com/dominictarr/pause-stream", + "_id": "pause-stream@0.0.11", + "_from": "pause-stream@0.0.11" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/readme.markdown new file mode 100644 index 00000000..23669391 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/readme.markdown @@ -0,0 +1,29 @@ +# PauseStream + +This is a `Stream` that will strictly buffer when paused. +Connect it to anything you need buffered. + +``` js + var ps = require('pause-stream')(); + + badlyBehavedStream.pipe(ps.pause()) + + aLittleLater(function (err, data) { + ps.pipe(createAnotherStream(data)) + ps.resume() + }) +``` + +`PauseStream` will buffer whenever paused. +it will buffer when yau have called `pause` manually. +but also when it's downstream `dest.write()===false`. +it will attempt to drain the buffer when you call resume +or the downstream emits `'drain'` + +`PauseStream` is tested using [stream-spec](https://github.com/dominictarr/stream-spec) +and [stream-tester](https://github.com/dominictarr/stream-tester) + +This is now the default case of +[through](https://github.com/dominictarr/through) + +https://github.com/dominictarr/pause-stream/commit/4a6fe3dc2c11091b1efbfde912e0473719ed9cc0 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/index.js new file mode 100644 index 00000000..db8778da --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/index.js @@ -0,0 +1,17 @@ +var spec = require('stream-spec') +var tester = require('stream-tester') +var ps = require('..')() + +spec(ps) + .through({strict: false}) + .validateOnExit() + +var master = tester.createConsistent + +tester.createRandomStream(1000) //1k random numbers + .pipe(master = tester.createConsistentStream()) + .pipe(tester.createUnpauseStream()) + .pipe(ps) + .pipe(tester.createPauseStream()) + .pipe(master.createSlave()) + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/pause-end.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/pause-end.js new file mode 100644 index 00000000..a6c27ef1 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/pause-stream/test/pause-end.js @@ -0,0 +1,33 @@ + +var pause = require('..') +var assert = require('assert') + +var ps = pause() +var read = [], ended = false + +ps.on('data', function (i) { + read.push(i) +}) + +ps.on('end', function () { + ended = true +}) + +assert.deepEqual(read, []) + +ps.write(0) +ps.write(1) +ps.write(2) + +assert.deepEqual(read, [0, 1, 2]) + +ps.pause() + +assert.deepEqual(read, [0, 1, 2]) + +ps.end() +assert.equal(ended, false) +ps.resume() +assert.equal(ended, true) + + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.npmignore new file mode 100644 index 00000000..13abef4f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.travis.yml new file mode 100644 index 00000000..dad2273c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 + - "0.10" diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/LICENCE b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/LICENCE new file mode 100644 index 00000000..171dd970 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/LICENCE @@ -0,0 +1,22 @@ +Copyright (c) 2011 Dominic Tarr + +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. \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/examples/pretty.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/examples/pretty.js new file mode 100644 index 00000000..2e891316 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/examples/pretty.js @@ -0,0 +1,26 @@ + +var inspect = require('util').inspect +var es = require('event-stream') //load event-stream +var split = require('../') + +if(!module.parent) { + es.pipe( //pipe joins streams together + process.openStdin(), //open stdin + split(), //split stream to break on newlines + es.map(function (data, callback) {//turn this async function into a stream + var j + try { + j = JSON.parse(data) //try to parse input into json + } catch (err) { + return callback(null, data) //if it fails just pass it anyway + } + callback(null, inspect(j)) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) + } + +// run this +// +// curl -sS registry.npmjs.org/event-stream | node pretty.js +// diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/index.js new file mode 100644 index 00000000..ca57e0f7 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/index.js @@ -0,0 +1,59 @@ +//filter will reemit the data if cb(err,pass) pass is truthy + +// reduce is more tricky +// maybe we want to group the reductions or emit progress updates occasionally +// the most basic reduce just emits one 'data' event after it has recieved 'end' + + +var through = require('through') +var Decoder = require('string_decoder').StringDecoder + +module.exports = split + +//TODO pass in a function to map across the lines. + +function split (matcher, mapper) { + var decoder = new Decoder() + var soFar = '' + if('function' === typeof matcher) + mapper = matcher, matcher = null + if (!matcher) + matcher = /\r?\n/ + + function emit(stream, piece) { + if(mapper) { + try { + piece = mapper(piece) + } + catch (err) { + return stream.emit('error', err) + } + if('undefined' !== typeof piece) + stream.queue(piece) + } + else + stream.queue(piece) + } + + function next (stream, buffer) { + var pieces = (soFar + buffer).split(matcher) + soFar = pieces.pop() + + for (var i = 0; i < pieces.length; i++) { + var piece = pieces[i] + emit(stream, piece) + } + } + + return through(function (b) { + next(this, decoder.write(b)) + }, + function () { + if(decoder.end) + next(this, decoder.end()) + if(soFar != null) + emit(this, soFar) + this.queue(null) + }) +} + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/package.json new file mode 100644 index 00000000..b95a7d9b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/package.json @@ -0,0 +1,39 @@ +{ + "name": "split", + "version": "0.2.10", + "description": "split a Text Stream into a Line Stream", + "homepage": "http://github.com/dominictarr/split", + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/split.git" + }, + "dependencies": { + "through": "2" + }, + "devDependencies": { + "asynct": "*", + "it-is": "1", + "ubelt": "~2.9", + "stream-spec": "~0.2", + "event-stream": "~3.0.2" + }, + "scripts": { + "test": "asynct test/" + }, + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "http://bit.ly/dominictarr" + }, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "readme": "# Split (matcher)\n\n[![build status](https://secure.travis-ci.org/dominictarr/split.png)](http://travis-ci.org/dominictarr/split)\n\nBreak up a stream and reassemble it so that each line is a chunk. matcher may be a `String`, or a `RegExp` \n\nExample, read every line in a file ...\n\n``` js\n fs.createReadStream(file)\n .pipe(split())\n .on('data', function (line) {\n //each chunk now is a seperate line!\n })\n\n```\n\n`split` takes the same arguments as `string.split` except it defaults to '/\\r?\\n/' instead of ',', and the optional `limit` paremeter is ignored.\n[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split)\n\n# NDJ - Newline Delimited Json\n\n`split` accepts a function which transforms each line.\n\n``` js\nfs.createReadStream(file)\n .pipe(split(JSON.parse))\n .on('data', function (obj) {\n //each chunk now is a a js object\n })\n .on('error', function (err) {\n //syntax errors will land here\n //note, this ends the stream.\n })\n```\n\n# License\n\nMIT\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/split/issues" + }, + "_id": "split@0.2.10", + "_from": "split@0.2" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/readme.markdown new file mode 100644 index 00000000..55b8ba86 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/readme.markdown @@ -0,0 +1,39 @@ +# Split (matcher) + +[![build status](https://secure.travis-ci.org/dominictarr/split.png)](http://travis-ci.org/dominictarr/split) + +Break up a stream and reassemble it so that each line is a chunk. matcher may be a `String`, or a `RegExp` + +Example, read every line in a file ... + +``` js + fs.createReadStream(file) + .pipe(split()) + .on('data', function (line) { + //each chunk now is a seperate line! + }) + +``` + +`split` takes the same arguments as `string.split` except it defaults to '/\r?\n/' instead of ',', and the optional `limit` paremeter is ignored. +[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split) + +# NDJ - Newline Delimited Json + +`split` accepts a function which transforms each line. + +``` js +fs.createReadStream(file) + .pipe(split(JSON.parse)) + .on('data', function (obj) { + //each chunk now is a a js object + }) + .on('error', function (err) { + //syntax errors will land here + //note, this ends the stream. + }) +``` + +# License + +MIT diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/partitioned_unicode.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/partitioned_unicode.js new file mode 100644 index 00000000..aff3d5da --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/partitioned_unicode.js @@ -0,0 +1,34 @@ +var it = require('it-is').style('colour') + , split = require('..') + +exports ['split data with partitioned unicode character'] = function (test) { + var s = split(/,/g) + , caughtError = false + , rows = [] + + s.on('error', function (err) { + caughtError = true + }) + + s.on('data', function (row) { rows.push(row) }) + + var x = 'テスト試験今日とても,よい天気で' + unicodeData = new Buffer(x); + + // partition of 日 + piece1 = unicodeData.slice(0, 20); + piece2 = unicodeData.slice(20, unicodeData.length); + + s.write(piece1); + s.write(piece2); + + s.end() + + it(caughtError).equal(false) + + it(rows).deepEqual(['テスト試験今日とても', 'よい天気で']); + + it(rows).deepEqual(x.split(',')) + + test.done() +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/split.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/split.asynct.js new file mode 100644 index 00000000..fb15b288 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/split.asynct.js @@ -0,0 +1,85 @@ +var es = require('event-stream') + , it = require('it-is').style('colour') + , d = require('ubelt') + , split = require('..') + , join = require('path').join + , fs = require('fs') + , Stream = require('stream').Stream + , spec = require('stream-spec') + +exports ['split() works like String#split'] = function (test) { + var readme = join(__filename) + , expected = fs.readFileSync(readme, 'utf-8').split('\n') + , cs = split() + , actual = [] + , ended = false + , x = spec(cs).through() + + var a = new Stream () + + a.write = function (l) { + actual.push(l.trim()) + } + a.end = function () { + + ended = true + expected.forEach(function (v,k) { + //String.split will append an empty string '' + //if the string ends in a split pattern. + //es.split doesn't which was breaking this test. + //clearly, appending the empty string is correct. + //tests are passing though. which is the current job. + if(v) + it(actual[k]).like(v) + }) + //give the stream time to close + process.nextTick(function () { + test.done() + x.validate() + }) + } + a.writable = true + + fs.createReadStream(readme, {flags: 'r'}).pipe(cs) + cs.pipe(a) + +} + +exports ['split() takes mapper function'] = function (test) { + var readme = join(__filename) + , expected = fs.readFileSync(readme, 'utf-8').split('\n') + , cs = split(function (line) { return line.toUpperCase() }) + , actual = [] + , ended = false + , x = spec(cs).through() + + var a = new Stream () + + a.write = function (l) { + actual.push(l.trim()) + } + a.end = function () { + + ended = true + expected.forEach(function (v,k) { + //String.split will append an empty string '' + //if the string ends in a split pattern. + //es.split doesn't which was breaking this test. + //clearly, appending the empty string is correct. + //tests are passing though. which is the current job. + if(v) + it(actual[k]).equal(v.trim().toUpperCase()) + }) + //give the stream time to close + process.nextTick(function () { + test.done() + x.validate() + }) + } + a.writable = true + + fs.createReadStream(readme, {flags: 'r'}).pipe(cs) + cs.pipe(a) + +} + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/try_catch.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/try_catch.asynct.js new file mode 100644 index 00000000..39e49f73 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/split/test/try_catch.asynct.js @@ -0,0 +1,51 @@ +var it = require('it-is').style('colour') + , split = require('..') + +exports ['emit mapper exceptions as error events'] = function (test) { + var s = split(JSON.parse) + , caughtError = false + , rows = [] + + s.on('error', function (err) { + caughtError = true + }) + + s.on('data', function (row) { rows.push(row) }) + + s.write('{"a":1}\n{"') + it(caughtError).equal(false) + it(rows).deepEqual([ { a: 1 } ]) + + s.write('b":2}\n{"c":}\n') + it(caughtError).equal(true) + it(rows).deepEqual([ { a: 1 }, { b: 2 } ]) + + s.end() + test.done() +} + +exports ['mapper error events on trailing chunks'] = function (test) { + var s = split(JSON.parse) + , caughtError = false + , rows = [] + + s.on('error', function (err) { + caughtError = true + }) + + s.on('data', function (row) { rows.push(row) }) + + s.write('{"a":1}\n{"') + it(caughtError).equal(false) + it(rows).deepEqual([ { a: 1 } ]) + + s.write('b":2}\n{"c":}') + it(caughtError).equal(false) + it(rows).deepEqual([ { a: 1 }, { b: 2 } ]) + + s.end() + it(caughtError).equal(true) + it(rows).deepEqual([ { a: 1 }, { b: 2 } ]) + + test.done() +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.npmignore b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.npmignore new file mode 100644 index 00000000..13abef4f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.travis.yml new file mode 100644 index 00000000..895dbd36 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/LICENSE b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/LICENSE new file mode 100644 index 00000000..6d03581f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 'Dominic Tarr' + +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/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/README.md b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/README.md new file mode 100644 index 00000000..565e0e26 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/README.md @@ -0,0 +1,29 @@ +# stream-combiner + + + +## Combine (stream1,...,streamN) + +Turn a pipeline into a single stream. `pipeline` returns a stream that writes to the first stream +and reads from the last stream. + +Listening for 'error' will recieve errors from all streams inside the pipe. + +``` js + var Combine = require('stream-combiner') + var es = require('event-stream') + + Combine( //connect streams together with `pipe` + process.openStdin(), //open stdin + es.split(), //split stream to break on newlines + es.map(function (data, callback) {//turn this async function into a stream + callback(null + , inspect(JSON.parse(data))) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) +``` + +## License + +MIT diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/index.js new file mode 100644 index 00000000..99cf5b61 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/index.js @@ -0,0 +1,39 @@ +var duplexer = require('duplexer') + +module.exports = function () { + + var streams = [].slice.call(arguments) + , first = streams[0] + , last = streams[streams.length - 1] + , thepipe = duplexer(first, last) + + if(streams.length == 1) + return streams[0] + else if (!streams.length) + throw new Error('connect called with empty args') + + //pipe all the streams together + + function recurse (streams) { + if(streams.length < 2) + return + streams[0].pipe(streams[1]) + recurse(streams.slice(1)) + } + + recurse(streams) + + function onerror () { + var args = [].slice.call(arguments) + args.unshift('error') + thepipe.emit.apply(thepipe, args) + } + + //es.duplex already reemits the error from the first and last stream. + //add a listener for the inner streams in the pipeline. + for(var i = 1; i < streams.length - 1; i ++) + streams[i].on('error', onerror) + + return thepipe +} + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/package.json new file mode 100644 index 00000000..d0e2977a --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/package.json @@ -0,0 +1,33 @@ +{ + "name": "stream-combiner", + "version": "0.0.4", + "homepage": "https://github.com/dominictarr/stream-combiner", + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/stream-combiner.git" + }, + "dependencies": { + "duplexer": "~0.1.1" + }, + "devDependencies": { + "tape": "~2.3.0", + "event-stream": "~3.0.7" + }, + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "author": { + "name": "'Dominic Tarr'", + "email": "dominic.tarr@gmail.com", + "url": "http://dominictarr.com" + }, + "license": "MIT", + "readme": "# stream-combiner\n\n\n\n## Combine (stream1,...,streamN)\n\nTurn a pipeline into a single stream. `pipeline` returns a stream that writes to the first stream\nand reads from the last stream. \n\nListening for 'error' will recieve errors from all streams inside the pipe.\n\n``` js\n var Combine = require('stream-combiner')\n var es = require('event-stream')\n\n Combine( //connect streams together with `pipe`\n process.openStdin(), //open stdin\n es.split(), //split stream to break on newlines\n es.map(function (data, callback) {//turn this async function into a stream\n callback(null\n , inspect(JSON.parse(data))) //render it nicely\n }),\n process.stdout // pipe it to stdout !\n )\n```\n\n## License\n\nMIT\n", + "readmeFilename": "README.md", + "description": "", + "bugs": { + "url": "https://github.com/dominictarr/stream-combiner/issues" + }, + "_id": "stream-combiner@0.0.4", + "_from": "stream-combiner@~0.0.4" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/test/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/test/index.js new file mode 100644 index 00000000..d17ddada --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/stream-combiner/test/index.js @@ -0,0 +1,52 @@ +var es = require('event-stream') +var combine = require('..') +var test = require('tape') + +test('do not duplicate errors', function (test) { + + var errors = 0; + var pipe = combine( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }) + ) + + pipe.on('error', function(err) { + errors++ + test.ok(errors, 'expected error count') + process.nextTick(function () { + return test.end(); + }) + }) + + return pipe.write('meh'); +}) + +test('3 pipe do not duplicate errors', function (test) { + + var errors = 0; + var pipe = combine( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }), + es.through() + ) + + pipe.on('error', function(err) { + errors++ + test.ok(errors, 'expected error count') + process.nextTick(function () { + return test.end(); + }) + }) + + return pipe.write('meh'); + +}) + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/.travis.yml b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/.travis.yml new file mode 100644 index 00000000..c693a939 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - "0.10" diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.APACHE2 b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.APACHE2 new file mode 100644 index 00000000..6366c047 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.APACHE2 @@ -0,0 +1,15 @@ +Apache License, Version 2.0 + +Copyright (c) 2011 Dominic Tarr + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.MIT b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.MIT new file mode 100644 index 00000000..6eafbd73 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/LICENSE.MIT @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2011 Dominic Tarr + +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/gulp-minify-css/node_modules/event-stream/node_modules/through/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/index.js new file mode 100644 index 00000000..7b935bf9 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/index.js @@ -0,0 +1,108 @@ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end, opts) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [], _ended = false + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + +// stream.autoPause = !(opts && opts.autoPause === false) + stream.autoDestroy = !(opts && opts.autoDestroy === false) + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = stream.push = function (data) { +// console.error(ended) + if(_ended) return stream + if(data == null) _ended = true + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable && stream.autoDestroy) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable && stream.autoDestroy) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + return stream + } + + stream.resume = function () { + if(stream.paused) { + stream.paused = false + stream.emit('resume') + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/package.json new file mode 100644 index 00000000..52155427 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/package.json @@ -0,0 +1,46 @@ +{ + "name": "through", + "version": "2.3.4", + "description": "simplified stream contsruction", + "main": "index.js", + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "devDependencies": { + "stream-spec": "~0.3.5", + "tape": "~0.2.2" + }, + "keywords": [ + "stream", + "streams", + "user-streams", + "pipe" + ], + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/dominictarr/through.git" + }, + "homepage": "http://github.com/dominictarr/through", + "testling": { + "browsers": [ + "ie/8..latest", + "ff/15..latest", + "chrome/20..latest", + "safari/5.1..latest" + ], + "files": "test/*.js" + }, + "readme": "#through\n\n[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through)\n\nEasy way to create a `Stream` that is both `readable` and `writable`. \n\n* Pass in optional `write` and `end` methods.\n* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`.\n* Use `this.pause()` and `this.resume()` to manage flow.\n* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`).\n\nThis function is the basis for most of the synchronous streams in \n[event-stream](http://github.com/dominictarr/event-stream).\n\n``` js\nvar through = require('through')\n\nthrough(function write(data) {\n this.queue(data) //data *must* not be null\n },\n function end () { //optional\n this.queue(null)\n })\n```\n\nOr, can also be used _without_ buffering on pause, use `this.emit('data', data)`,\nand this.emit('end')\n\n``` js\nvar through = require('through')\n\nthrough(function write(data) {\n this.emit('data', data)\n //this.pause() \n },\n function end () { //optional\n this.emit('end')\n })\n```\n\n## Extended Options\n\nYou will probably not need these 99% of the time.\n\n### autoDestroy=false\n\nBy default, `through` emits close when the writable\nand readable side of the stream has ended.\nIf that is not desired, set `autoDestroy=false`.\n\n``` js\nvar through = require('through')\n\n//like this\nvar ts = through(write, end, {autoDestroy: false})\n//or like this\nvar ts = through(write, end)\nts.autoDestroy = false\n```\n\n## License\n\nMIT / Apache2\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/through/issues" + }, + "_id": "through@2.3.4", + "_from": "through@~2.3.1" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/readme.markdown new file mode 100644 index 00000000..b20bc9a8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/readme.markdown @@ -0,0 +1,63 @@ +#through + +[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through) + +Easy way to create a `Stream` that is both `readable` and `writable`. + +* Pass in optional `write` and `end` methods. +* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`. +* Use `this.pause()` and `this.resume()` to manage flow. +* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`). + +This function is the basis for most of the synchronous streams in +[event-stream](http://github.com/dominictarr/event-stream). + +``` js +var through = require('through') + +through(function write(data) { + this.queue(data) //data *must* not be null + }, + function end () { //optional + this.queue(null) + }) +``` + +Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`, +and this.emit('end') + +``` js +var through = require('through') + +through(function write(data) { + this.emit('data', data) + //this.pause() + }, + function end () { //optional + this.emit('end') + }) +``` + +## Extended Options + +You will probably not need these 99% of the time. + +### autoDestroy=false + +By default, `through` emits close when the writable +and readable side of the stream has ended. +If that is not desired, set `autoDestroy=false`. + +``` js +var through = require('through') + +//like this +var ts = through(write, end, {autoDestroy: false}) +//or like this +var ts = through(write, end) +ts.autoDestroy = false +``` + +## License + +MIT / Apache2 diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/auto-destroy.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/auto-destroy.js new file mode 100644 index 00000000..9a8fd000 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/auto-destroy.js @@ -0,0 +1,30 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + ts.autoDestroy = false + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.notOk(closed) + ts.destroy() + assert.ok(closed) + assert.end() +}) + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/buffering.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/buffering.js new file mode 100644 index 00000000..b0084bfc --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/buffering.js @@ -0,0 +1,71 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('buffering', function(assert) { + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + assert.deepEqual(actual, [1, 2, 3]) + ts.pause() + ts.write(4) + ts.write(5) + ts.write(6) + assert.deepEqual(actual, [1, 2, 3]) + ts.resume() + assert.deepEqual(actual, [1, 2, 3, 4, 5, 6]) + ts.pause() + ts.end() + assert.ok(!ended) + ts.resume() + assert.ok(ended) + assert.end() +}) + +test('buffering has data in queue, when ends', function (assert) { + + /* + * If stream ends while paused with data in the queue, + * stream should still emit end after all data is written + * on resume. + */ + + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.pause() + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.deepEqual(actual, [], 'no data written yet, still paused') + assert.ok(!ended, 'end not emitted yet, still paused') + ts.resume() + assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered') + assert.ok(ended, 'end should be emitted once all data was delivered') + assert.end(); +}) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/end.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/end.js new file mode 100644 index 00000000..fa113f58 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/end.js @@ -0,0 +1,45 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.ok(closed) + assert.end() +}) + +test('end only once', function (t) { + + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + t.equal(ended, false) + ended = true + }) + + ts.queue(null) + ts.queue(null) + ts.queue(null) + + ts.resume() + + t.end() +}) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/index.js new file mode 100644 index 00000000..33e33f96 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/node_modules/through/test/index.js @@ -0,0 +1,114 @@ + +var test = require('tape') +var spec = require('stream-spec') +var through = require('../') + +/* + I'm using these two functions, and not streams and pipe + so there is less to break. if this test fails it must be + the implementation of _through_ +*/ + +function write(array, stream) { + array = array.slice() + function next() { + while(array.length) + if(stream.write(array.shift()) === false) + return stream.once('drain', next) + + stream.end() + } + + next() +} + +function read(stream, callback) { + var actual = [] + stream.on('data', function (data) { + actual.push(data) + }) + stream.once('end', function () { + callback(null, actual) + }) + stream.once('error', function (err) { + callback(err) + }) +} + +test('simple defaults', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through() + spec(t) + .through() + .pausable() + .validateOnExit() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + write(expected, t) +}); + +test('simple functions', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through(function (data) { + this.emit('data', data*2) + }) + spec(t) + .through() + .pausable() + .validateOnExit() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected.map(function (data) { + return data*2 + })) + assert.end() + }) + + write(expected, t) +}) + +test('pauses', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l) //Math.random()) + + var t = through() + spec(t) + .through() + .pausable() + .validateOnExit() + + t.on('data', function () { + if(Math.random() > 0.1) return + t.pause() + process.nextTick(function () { + t.resume() + }) + }) + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + write(expected, t) +}) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/package.json b/node_modules/gulp-minify-css/node_modules/event-stream/package.json new file mode 100644 index 00000000..735afd1b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/package.json @@ -0,0 +1,63 @@ +{ + "name": "event-stream", + "version": "3.1.0", + "description": "construct pipes of streams of events", + "homepage": "http://github.com/dominictarr/event-stream", + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/event-stream.git" + }, + "dependencies": { + "through": "~2.3.1", + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.2", + "stream-combiner": "~0.0.4" + }, + "devDependencies": { + "asynct": "*", + "it-is": "1", + "ubelt": "~3.2.2", + "stream-spec": "~0.3.5", + "tape": "~2.3.0" + }, + "scripts": { + "test": "asynct test/", + "test_tap": "set -e; for t in test/*.js; do node $t; done" + }, + "testling": { + "files": "test/*.js", + "browsers": { + "ie": [ + 8, + 9 + ], + "firefox": [ + 13 + ], + "chrome": [ + 20 + ], + "safari": [ + 5.1 + ], + "opera": [ + 12 + ] + } + }, + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "http://bit.ly/dominictarr" + }, + "readme": "# EventStream\n\n\n\n[![browser status](http://ci.testling.com/dominictarr/event-stream.png)]\n(http://ci.testling.com/dominictarr/event-stream)\n\n[Streams](http://nodejs.org/api/stream.html \"Stream\") are node's best and most misunderstood idea, and \n_EventStream_ is a toolkit to make creating and working with streams easy. \n\nNormally, streams are only used of IO, \nbut in event stream we send all kinds of objects down the pipe. \nIf your application's input and output are streams, \nshouldn't the throughput be a stream too? \n\nThe *EventStream* functions resemble the array functions, \nbecause Streams are like Arrays, but laid out in time, rather than in memory. \n\nAll the `event-stream` functions return instances of `Stream`.\n\n`event-stream` creates \n[0.8 streams](https://github.com/joyent/node/blob/v0.8/doc/api/stream.markdown)\n, which are compatible with [0.10 streams](http://nodejs.org/api/stream.html \"Stream\")\n\n>NOTE: I shall use the term \"through stream\" to refer to a stream that is writable and readable. \n\n###[simple example](https://github.com/dominictarr/event-stream/blob/master/examples/pretty.js):\n\n``` js\n\n//pretty.js\n\nif(!module.parent) {\n var es = require('event-stream')\n es.pipeline( //connect streams together with `pipe`\n process.openStdin(), //open stdin\n es.split(), //split stream to break on newlines\n es.map(function (data, callback) {//turn this async function into a stream\n callback(null\n , inspect(JSON.parse(data))) //render it nicely\n }),\n process.stdout // pipe it to stdout !\n )\n }\n```\nrun it ...\n\n``` bash \ncurl -sS registry.npmjs.org/event-stream | node pretty.js\n```\n \n[node Stream documentation](http://nodejs.org/api/stream.html)\n\n## through (write?, end?)\n\nReemits data synchronously. Easy way to create syncronous through streams.\nPass in an optional `write` and `end` methods. They will be called in the \ncontext of the stream. Use `this.pause()` and `this.resume()` to manage flow.\nCheck `this.paused` to see current flow state. (write always returns `!this.paused`)\n\nthis function is the basis for most of the syncronous streams in `event-stream`.\n\n``` js\n\nes.through(function write(data) {\n this.emit('data', data)\n //this.pause() \n },\n function end () { //optional\n this.emit('end')\n })\n\n```\n\n##map (asyncFunction)\n\nCreate a through stream from an asyncronous function. \n\n``` js\nvar es = require('event-stream')\n\nes.map(function (data, callback) {\n //transform data\n // ...\n callback(null, data)\n})\n\n```\n\nEach map MUST call the callback. It may callback with data, with an error or with no arguments, \n\n * `callback()` drop this data. \n this makes the map work like `filter`, \n note:`callback(null,null)` is not the same, and will emit `null`\n\n * `callback(null, newData)` turn data into newData\n \n * `callback(error)` emit an error for this item.\n\n>Note: if a callback is not called, `map` will think that it is still being processed, \n>every call must be answered or the stream will not know when to end. \n>\n>Also, if the callback is called more than once, every call but the first will be ignored.\n\n## mapSync (syncFunction)\n\nSame as `map`, but the callback is called synchronously. Based on `es.through`\n\n## split (matcher)\n\nBreak up a stream and reassemble it so that each line is a chunk. matcher may be a `String`, or a `RegExp` \n\nExample, read every line in a file ...\n\n``` js\n es.pipeline(\n fs.createReadStream(file, {flags: 'r'}),\n es.split(),\n es.map(function (line, cb) {\n //do something with the line \n cb(null, line)\n })\n )\n\n```\n\n`split` takes the same arguments as `string.split` except it defaults to '\\n' instead of ',', and the optional `limit` paremeter is ignored.\n[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split)\n\n## join (separator)\n\nCreate a through stream that emits `separator` between each chunk, just like Array#join.\n\n(for legacy reasons, if you pass a callback instead of a string, join is a synonym for `es.wait`)\n\n## merge (stream1,...,streamN)\n> concat → merge\n\nMerges streams into one and returns it.\nIncoming data will be emitted as soon it comes into - no ordering will be applied (for example: `data1 data1 data2 data1 data2` - where `data1` and `data2` is data from two streams).\nCounts how many streams was passed to it and emits end only when all streams emitted end.\n\n```js\nes.merge(\n process.stdout,\n process.stderr\n).pipe(fs.createWriteStream('output.log'));\n```\n\n## replace (from, to)\n\nReplace all occurences of `from` with `to`. `from` may be a `String` or a `RegExp`. \nWorks just like `string.split(from).join(to)`, but streaming.\n\n\n## parse\n\nConvienience function for parsing JSON chunks. For newline separated JSON,\nuse with `es.split`\n\n``` js\nfs.createReadStream(filename)\n .pipe(es.split()) //defaults to lines.\n .pipe(es.parse())\n```\n\n## stringify\n\nconvert javascript objects into lines of text. The text will have whitespace escaped and have a `\\n` appended, so it will be compatible with `es.parse`\n\n``` js\nobjectStream\n .pipe(es.stringify())\n .pipe(fs.createWriteStream(filename))\n```\n\n##readable (asyncFunction) \n\ncreate a readable stream (that respects pause) from an async function. \nwhile the stream is not paused, \nthe function will be polled with `(count, callback)`, \nand `this` will be the readable stream.\n\n``` js\n\nes.readable(function (count, callback) {\n if(streamHasEnded)\n return this.emit('end')\n \n //...\n \n this.emit('data', data) //use this way to emit multiple chunks per call.\n \n callback() // you MUST always call the callback eventually.\n // the function will not be called again until you do this.\n})\n```\nyou can also pass the data and the error to the callback. \nyou may only call the callback once. \ncalling the same callback more than once will have no effect. \n\n##readArray (array)\n\nCreate a readable stream from an Array.\n\nJust emit each item as a data event, respecting `pause` and `resume`.\n\n``` js\n var es = require('event-stream')\n , reader = es.readArray([1,2,3])\n\n reader.pipe(...)\n```\n\n## writeArray (callback)\n\ncreate a writeable stream from a callback, \nall `data` events are stored in an array, which is passed to the callback when the stream ends.\n\n``` js\n var es = require('event-stream')\n , reader = es.readArray([1, 2, 3])\n , writer = es.writeArray(function (err, array){\n //array deepEqual [1, 2, 3]\n })\n\n reader.pipe(writer)\n```\n\n## pipeline (stream1,...,streamN)\n\nTurn a pipeline into a single stream. `pipeline` returns a stream that writes to the first stream\nand reads from the last stream. \n\nListening for 'error' will recieve errors from all streams inside the pipe.\n\n> `connect` is an alias for `pipeline`.\n\n``` js\n\n es.pipeline( //connect streams together with `pipe`\n process.openStdin(), //open stdin\n es.split(), //split stream to break on newlines\n es.map(function (data, callback) {//turn this async function into a stream\n callback(null\n , inspect(JSON.parse(data))) //render it nicely\n }),\n process.stdout // pipe it to stdout !\n )\n```\n\n## pause () \n\nA stream that buffers all chunks when paused.\n\n\n``` js\n var ps = es.pause()\n ps.pause() //buffer the stream, also do not allow 'end' \n ps.resume() //allow chunks through\n```\n\n## duplex (writeStream, readStream)\n\nTakes a writable stream and a readable stream and makes them appear as a readable writable stream.\n\nIt is assumed that the two streams are connected to each other in some way. \n\n(This is used by `pipeline` and `child`.)\n\n``` js\n var grep = cp.exec('grep Stream')\n\n es.duplex(grep.stdin, grep.stdout)\n```\n\n## child (child_process)\n\nCreate a through stream from a child process ...\n\n``` js\n var cp = require('child_process')\n\n es.child(cp.exec('grep Stream')) // a through stream\n\n```\n\n## wait (callback)\n\nwaits for stream to emit 'end'.\njoins chunks of a stream into a single string. \ntakes an optional callback, which will be passed the \ncomplete string when it receives the 'end' event.\n\nalso, emits a single 'data' event.\n\n``` js\n\nreadStream.pipe(es.wait(function (err, text) {\n // have complete text here.\n}))\n\n```\n\n# Other Stream Modules\n\nThese modules are not included as a part of *EventStream* but may be\nuseful when working with streams.\n\n## [reduce (syncFunction, initial)](https://github.com/parshap/node-stream-reduce)\n\nLike `Array.prototype.reduce` but for streams. Given a sync reduce\nfunction and an initial value it will return a through stream that emits\na single data event with the reduced value once the input stream ends.\n\n``` js\nvar reduce = require(\"stream-reduce\");\nprocess.stdin.pipe(reduce(function(acc, data) {\n return acc + data.length;\n}, 0)).on(\"data\", function(length) {\n console.log(\"stdin size:\", length);\n});\n```\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/event-stream/issues" + }, + "_id": "event-stream@3.1.0", + "_from": "event-stream@~3.1.0" +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/readme.markdown b/node_modules/gulp-minify-css/node_modules/event-stream/readme.markdown new file mode 100644 index 00000000..5fc24497 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/readme.markdown @@ -0,0 +1,323 @@ +# EventStream + + + +[![browser status](http://ci.testling.com/dominictarr/event-stream.png)] +(http://ci.testling.com/dominictarr/event-stream) + +[Streams](http://nodejs.org/api/stream.html "Stream") are node's best and most misunderstood idea, and +_EventStream_ is a toolkit to make creating and working with streams easy. + +Normally, streams are only used of IO, +but in event stream we send all kinds of objects down the pipe. +If your application's input and output are streams, +shouldn't the throughput be a stream too? + +The *EventStream* functions resemble the array functions, +because Streams are like Arrays, but laid out in time, rather than in memory. + +All the `event-stream` functions return instances of `Stream`. + +`event-stream` creates +[0.8 streams](https://github.com/joyent/node/blob/v0.8/doc/api/stream.markdown) +, which are compatible with [0.10 streams](http://nodejs.org/api/stream.html "Stream") + +>NOTE: I shall use the term "through stream" to refer to a stream that is writable and readable. + +###[simple example](https://github.com/dominictarr/event-stream/blob/master/examples/pretty.js): + +``` js + +//pretty.js + +if(!module.parent) { + var es = require('event-stream') + es.pipeline( //connect streams together with `pipe` + process.openStdin(), //open stdin + es.split(), //split stream to break on newlines + es.map(function (data, callback) {//turn this async function into a stream + callback(null + , inspect(JSON.parse(data))) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) + } +``` +run it ... + +``` bash +curl -sS registry.npmjs.org/event-stream | node pretty.js +``` + +[node Stream documentation](http://nodejs.org/api/stream.html) + +## through (write?, end?) + +Reemits data synchronously. Easy way to create syncronous through streams. +Pass in an optional `write` and `end` methods. They will be called in the +context of the stream. Use `this.pause()` and `this.resume()` to manage flow. +Check `this.paused` to see current flow state. (write always returns `!this.paused`) + +this function is the basis for most of the syncronous streams in `event-stream`. + +``` js + +es.through(function write(data) { + this.emit('data', data) + //this.pause() + }, + function end () { //optional + this.emit('end') + }) + +``` + +##map (asyncFunction) + +Create a through stream from an asyncronous function. + +``` js +var es = require('event-stream') + +es.map(function (data, callback) { + //transform data + // ... + callback(null, data) +}) + +``` + +Each map MUST call the callback. It may callback with data, with an error or with no arguments, + + * `callback()` drop this data. + this makes the map work like `filter`, + note:`callback(null,null)` is not the same, and will emit `null` + + * `callback(null, newData)` turn data into newData + + * `callback(error)` emit an error for this item. + +>Note: if a callback is not called, `map` will think that it is still being processed, +>every call must be answered or the stream will not know when to end. +> +>Also, if the callback is called more than once, every call but the first will be ignored. + +## mapSync (syncFunction) + +Same as `map`, but the callback is called synchronously. Based on `es.through` + +## split (matcher) + +Break up a stream and reassemble it so that each line is a chunk. matcher may be a `String`, or a `RegExp` + +Example, read every line in a file ... + +``` js + es.pipeline( + fs.createReadStream(file, {flags: 'r'}), + es.split(), + es.map(function (line, cb) { + //do something with the line + cb(null, line) + }) + ) + +``` + +`split` takes the same arguments as `string.split` except it defaults to '\n' instead of ',', and the optional `limit` paremeter is ignored. +[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split) + +## join (separator) + +Create a through stream that emits `separator` between each chunk, just like Array#join. + +(for legacy reasons, if you pass a callback instead of a string, join is a synonym for `es.wait`) + +## merge (stream1,...,streamN) +> concat → merge + +Merges streams into one and returns it. +Incoming data will be emitted as soon it comes into - no ordering will be applied (for example: `data1 data1 data2 data1 data2` - where `data1` and `data2` is data from two streams). +Counts how many streams was passed to it and emits end only when all streams emitted end. + +```js +es.merge( + process.stdout, + process.stderr +).pipe(fs.createWriteStream('output.log')); +``` + +## replace (from, to) + +Replace all occurences of `from` with `to`. `from` may be a `String` or a `RegExp`. +Works just like `string.split(from).join(to)`, but streaming. + + +## parse + +Convienience function for parsing JSON chunks. For newline separated JSON, +use with `es.split` + +``` js +fs.createReadStream(filename) + .pipe(es.split()) //defaults to lines. + .pipe(es.parse()) +``` + +## stringify + +convert javascript objects into lines of text. The text will have whitespace escaped and have a `\n` appended, so it will be compatible with `es.parse` + +``` js +objectStream + .pipe(es.stringify()) + .pipe(fs.createWriteStream(filename)) +``` + +##readable (asyncFunction) + +create a readable stream (that respects pause) from an async function. +while the stream is not paused, +the function will be polled with `(count, callback)`, +and `this` will be the readable stream. + +``` js + +es.readable(function (count, callback) { + if(streamHasEnded) + return this.emit('end') + + //... + + this.emit('data', data) //use this way to emit multiple chunks per call. + + callback() // you MUST always call the callback eventually. + // the function will not be called again until you do this. +}) +``` +you can also pass the data and the error to the callback. +you may only call the callback once. +calling the same callback more than once will have no effect. + +##readArray (array) + +Create a readable stream from an Array. + +Just emit each item as a data event, respecting `pause` and `resume`. + +``` js + var es = require('event-stream') + , reader = es.readArray([1,2,3]) + + reader.pipe(...) +``` + +## writeArray (callback) + +create a writeable stream from a callback, +all `data` events are stored in an array, which is passed to the callback when the stream ends. + +``` js + var es = require('event-stream') + , reader = es.readArray([1, 2, 3]) + , writer = es.writeArray(function (err, array){ + //array deepEqual [1, 2, 3] + }) + + reader.pipe(writer) +``` + +## pipeline (stream1,...,streamN) + +Turn a pipeline into a single stream. `pipeline` returns a stream that writes to the first stream +and reads from the last stream. + +Listening for 'error' will recieve errors from all streams inside the pipe. + +> `connect` is an alias for `pipeline`. + +``` js + + es.pipeline( //connect streams together with `pipe` + process.openStdin(), //open stdin + es.split(), //split stream to break on newlines + es.map(function (data, callback) {//turn this async function into a stream + callback(null + , inspect(JSON.parse(data))) //render it nicely + }), + process.stdout // pipe it to stdout ! + ) +``` + +## pause () + +A stream that buffers all chunks when paused. + + +``` js + var ps = es.pause() + ps.pause() //buffer the stream, also do not allow 'end' + ps.resume() //allow chunks through +``` + +## duplex (writeStream, readStream) + +Takes a writable stream and a readable stream and makes them appear as a readable writable stream. + +It is assumed that the two streams are connected to each other in some way. + +(This is used by `pipeline` and `child`.) + +``` js + var grep = cp.exec('grep Stream') + + es.duplex(grep.stdin, grep.stdout) +``` + +## child (child_process) + +Create a through stream from a child process ... + +``` js + var cp = require('child_process') + + es.child(cp.exec('grep Stream')) // a through stream + +``` + +## wait (callback) + +waits for stream to emit 'end'. +joins chunks of a stream into a single string. +takes an optional callback, which will be passed the +complete string when it receives the 'end' event. + +also, emits a single 'data' event. + +``` js + +readStream.pipe(es.wait(function (err, text) { + // have complete text here. +})) + +``` + +# Other Stream Modules + +These modules are not included as a part of *EventStream* but may be +useful when working with streams. + +## [reduce (syncFunction, initial)](https://github.com/parshap/node-stream-reduce) + +Like `Array.prototype.reduce` but for streams. Given a sync reduce +function and an initial value it will return a through stream that emits +a single data event with the reduced value once the input stream ends. + +``` js +var reduce = require("stream-reduce"); +process.stdin.pipe(reduce(function(acc, data) { + return acc + data.length; +}, 0)).on("data", function(length) { + console.log("stdin size:", length); +}); +``` diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/connect.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/connect.asynct.js new file mode 100644 index 00000000..e6a442bb --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/connect.asynct.js @@ -0,0 +1,86 @@ +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + +function makeExamplePipe() { + + return es.connect( + es.map(function (data, callback) { + callback(null, data * 2) + }), + es.map(function (data, callback) { + d.delay(callback)(null, data) + }), + es.map(function (data, callback) { + callback(null, data + 2) + })) +} + +exports['simple pipe'] = function (test) { + + var pipe = makeExamplePipe() + + pipe.on('data', function (data) { + it(data).equal(18) + test.done() + }) + + pipe.write(8) + +} + +exports['read array then map'] = function (test) { + + var readThis = d.map(3, 6, 100, d.id) //array of multiples of 3 < 100 + , first = es.readArray(readThis) + , read = [] + , pipe = + es.connect( + first, + es.map(function (data, callback) { + callback(null, {data: data}) + }), + es.map(function (data, callback) { + callback(null, {data: data}) + }), + es.writeArray(function (err, array) { + it(array).deepEqual(d.map(readThis, function (data) { + return {data: {data: data}} + })) + test.done() + }) + ) +} + +exports ['connect returns a stream'] = function (test) { + + var rw = + es.connect( + es.map(function (data, callback) { + callback(null, data * 2) + }), + es.map(function (data, callback) { + callback(null, data * 5) + }) + ) + + it(rw).has({readable: true, writable: true}) + + var array = [190, 24, 6, 7, 40, 57, 4, 6] + , _array = [] + , c = + es.connect( + es.readArray(array), + rw, + es.log('after rw:'), + es.writeArray(function (err, _array) { + it(_array).deepEqual(array.map(function (e) { return e * 10 })) + test.done() + }) + ) + +} + + +require('./helper')(module) + diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/helper/index.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/helper/index.js new file mode 100644 index 00000000..96abaebe --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/helper/index.js @@ -0,0 +1,12 @@ +var tape = require('tape') + +module.exports = function (m) { + if(m.parent) return + for(var name in m.exports) { + tape(name, function (t) { + console.log('start', name) + t.done = t.end + m.exports[name](t) + }) + } +} diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/merge.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/merge.asynct.js new file mode 100644 index 00000000..6ac65f32 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/merge.asynct.js @@ -0,0 +1,21 @@ +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + +exports.merge = function (t) { + var odd = d.map(1, 3, 100, d.id) //array of multiples of 3 < 100 + var even = d.map(2, 4, 100, d.id) //array of multiples of 3 < 100 + + var r1 = es.readArray(even) + var r2 = es.readArray(odd) + + var writer = es.writeArray(function (err, array){ + if(err) throw err //unpossible + it(array.sort()).deepEqual(even.concat(odd).sort()) + t.done() + }) + + es.merge(r1, r2).pipe(writer) + +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/pause.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/pause.asynct.js new file mode 100644 index 00000000..b0736040 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/pause.asynct.js @@ -0,0 +1,39 @@ + +var es = require('../') + , it = require('it-is') + , d = require('ubelt') + +exports ['gate buffers when shut'] = function (test) { + + var hundy = d.map(1,100, d.id) + , gate = es.pause() + , ten = 10 + es.connect( + es.readArray(hundy), + es.log('after readArray'), + gate, + //es.log('after gate'), + es.map(function (num, next) { + //stick a map in here to check that gate never emits when open + it(gate.paused).equal(false) + console.log('data', num) + if(!--ten) { + console.log('PAUSE') + gate.pause()//.resume() + d.delay(gate.resume.bind(gate), 10)() + ten = 10 + } + + next(null, num) + }), + es.writeArray(function (err, array) { //just realized that I should remove the error param. errors will be emitted + console.log('eonuhoenuoecbulc') + it(array).deepEqual(hundy) + test.done() + }) + ) + + gate.resume() + +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/pipeline.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/pipeline.asynct.js new file mode 100644 index 00000000..f07c6fa5 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/pipeline.asynct.js @@ -0,0 +1,52 @@ +var es = require('..') + +exports['do not duplicate errors'] = function (test) { + + var errors = 0; + var pipe = es.pipeline( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }) + ) + + pipe.on('error', function(err) { + errors++ + console.log('error count', errors) + process.nextTick(function () { + return test.done(); + }) + }) + + return pipe.write('meh'); + +} + +exports['3 pipe do not duplicate errors'] = function (test) { + + var errors = 0; + var pipe = es.pipeline( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }), + es.through() + ) + + pipe.on('error', function(err) { + errors++ + console.log('error count', errors) + process.nextTick(function () { + return test.done(); + }) + }) + + return pipe.write('meh'); + +} + +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/readArray.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/readArray.asynct.js new file mode 100644 index 00000000..3eeb90a3 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/readArray.asynct.js @@ -0,0 +1,89 @@ + +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + +function readStream(stream, pauseAt, done) { + if(!done) done = pauseAt, pauseAt = -1 + var array = [] + stream.on('data', function (data) { + array.push(data) + if(!--pauseAt ) + stream.pause(), done(null, array) + }) + stream.on('error', done) + stream.on('end', function (data) { + done(null, array) + }) + +} + +exports ['read an array'] = function (test) { + + var readThis = d.map(3, 6, 100, d.id) //array of multiples of 3 < 100 + + var reader = es.readArray(readThis) + + var writer = es.writeArray(function (err, array){ + if(err) throw err //unpossible + it(array).deepEqual(readThis) + test.done() + }) + + reader.pipe(writer) +} + +exports ['read an array and pause it.'] = function (test) { + + var readThis = d.map(3, 6, 100, d.id) //array of multiples of 3 < 100 + + var reader = es.readArray(readThis) + + readStream(reader, 10, function (err, data) { + if(err) throw err + it(data).deepEqual([3, 6, 9, 12, 15, 18, 21, 24, 27, 30]) + readStream(reader, 10, function (err, data) { + it(data).deepEqual([33, 36, 39, 42, 45, 48, 51, 54, 57, 60]) + test.done() + }) + reader.resume() + }) + +} + +exports ['reader is readable, but not writeable'] = function (test) { + var reader = es.readArray([1]) + it(reader).has({ + readable: true, + writable: false + }) + + test.done() +} + + +exports ['read one item per tick'] = function (test) { + var readThis = d.map(3, 6, 100, d.id) //array of multiples of 3 < 100 + var drains = 0 + var reader = es.readArray(readThis) + var tickMapper = es.map(function (data,callback) { + process.nextTick(function () { + callback(null, data) + }) + //since tickMapper is returning false + //pipe should pause the writer until a drain occurs + return false + }) + reader.pipe(tickMapper) + readStream(tickMapper, function (err, array) { + it(array).deepEqual(readThis) + it(array.length).deepEqual(readThis.length) + it(drains).equal(readThis.length) + test.done() + }) + tickMapper.on('drain', function () { + drains ++ + }) + +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/readable.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/readable.asynct.js new file mode 100644 index 00000000..a33988cd --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/readable.asynct.js @@ -0,0 +1,175 @@ + +var es = require('../') + , it = require('it-is').style('colour') + , u = require('ubelt') + +exports ['read an array'] = function (test) { + + + console.log('readable') + return test.end() + var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 + + console.log('readable') + + var reader = + es.readable(function (i, callback) { + if(i >= readThis.length) + return this.emit('end') + console.log('readable') + callback(null, readThis[i]) + }) + + var writer = es.writeArray(function (err, array){ + if(err) throw err + it(array).deepEqual(readThis) + test.done() + }) + + reader.pipe(writer) +} + +exports ['read an array - async'] = function (test) { + + var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 + + var reader = + es.readable(function (i, callback) { + if(i >= readThis.length) + return this.emit('end') + u.delay(callback)(null, readThis[i]) + }) + + var writer = es.writeArray(function (err, array){ + if(err) throw err + it(array).deepEqual(readThis) + test.done() + }) + + reader.pipe(writer) +} + + +exports ['emit data then call next() also works'] = function (test) { + + var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 + + var reader = + es.readable(function (i, next) { + if(i >= readThis.length) + return this.emit('end') + this.emit('data', readThis[i]) + next() + }) + + var writer = es.writeArray(function (err, array){ + if(err) throw err + it(array).deepEqual(readThis) + test.done() + }) + + reader.pipe(writer) +} + + +exports ['callback emits error, then stops'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , called = 0 + + var reader = + es.readable(function (i, callback) { + if(called++) + return + callback(err) + }) + + reader.on('error', function (_err){ + it(_err).deepEqual(err) + u.delay(function() { + it(called).equal(1) + test.done() + }, 50)() + }) +} + +exports['readable does not call read concurrently'] = function (test) { + + var current = 0 + var source = es.readable(function(count, cb){ + current ++ + if(count > 100) + return this.emit('end') + u.delay(function(){ + current -- + it(current).equal(0) + cb(null, {ok: true, n: count}); + })(); + }); + + var destination = es.map(function(data, cb){ + //console.info(data); + cb(); + }); + + var all = es.connect(source, destination); + + destination.on('end', test.done) +} + + +// +// emitting multiple errors is not supported by stream. +// +// I do not think that this is a good idea, at least, there should be an option to pipe to +// continue on error. it makes alot ef sense, if you are using Stream like I am, to be able to emit multiple errors. +// an error might not necessarily mean the end of the stream. it depends on the error, at least. +// +// I will start a thread on the mailing list. I'd rather that than use a custom `pipe` implementation. +// +// basically, I want to be able use pipe to transform objects, and if one object is invalid, +// the next might still be good, so I should get to choose if it's gonna stop. +// re-enstate this test when this issue progresses. +// +// hmm. I could add this to es.connect by deregistering the error listener, +// but I would rather it be an option in core. + +/* +exports ['emit multiple errors, with 2nd parameter (continueOnError)'] = function (test) { + + var readThis = d.map(1, 100, d.id) + , errors = 0 + var reader = + es.readable(function (i, callback) { + console.log(i, readThis.length) + if(i >= readThis.length) + return this.emit('end') + if(!(readThis[i] % 7)) + return callback(readThis[i]) + callback(null, readThis[i]) + }, true) + + var writer = es.writeArray(function (err, array) { + if(err) throw err + it(array).every(function (u){ + it(u % 7).notEqual(0) + }).property('length', 80) + it(errors).equal(14) + test.done() + }) + + reader.on('error', function (u) { + errors ++ + console.log(u) + if('number' !== typeof u) + throw u + + it(u % 7).equal(0) + + }) + + reader.pipe(writer) +} +*/ + +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/replace.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/replace.asynct.js new file mode 100644 index 00000000..524a915b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/replace.asynct.js @@ -0,0 +1,51 @@ +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + , spec = require('stream-spec') + +var next = process.nextTick + +var fizzbuzz = '12F4BF78FB11F1314FB1617F19BF2223FB26F2829FB3132F34BF3738FB41F4344FB4647F49BF5253FB56F5859FB6162F64BF6768FB71F7374FB7677F79BF8283FB86F8889FB9192F94BF9798FB' + , fizz7buzz = '12F4BFseven8FB11F1314FB161sevenF19BF2223FB26F2829FB3132F34BF3seven38FB41F4344FB464sevenF49BF5253FB56F5859FB6162F64BF6seven68FBseven1Fseven3seven4FBseven6sevensevenFseven9BF8283FB86F8889FB9192F94BF9seven98FB' + +exports ['fizz buzz'] = function (test) { + + var readThis = d.map(1, 100, function (i) { + return ( + ! (i % 3 || i % 5) ? "FB" : + !(i % 3) ? "F" : + !(i % 5) ? "B" : + ''+i + ) + }) //array of multiples of 3 < 100 + + var reader = es.readArray(readThis) + var join = es.wait(function (err, string){ + it(string).equal(fizzbuzz) + test.done() + }) + reader.pipe(join) + +} + + +exports ['fizz buzz replace'] = function (test) { + var split = es.split(/(1)/) + var replace = es.replace('7', 'seven') +// var x = spec(replace).through() + split + .pipe(replace) + .pipe(es.join(function (err, string) { + it(string).equal(fizz7buzz) + })) + + replace.on('close', function () { +// x.validate() + test.done() + }) + + split.write(fizzbuzz) + split.end() + +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/simple-map.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/simple-map.asynct.js new file mode 100644 index 00000000..25121f93 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/simple-map.asynct.js @@ -0,0 +1,343 @@ +'use strict'; + +var es = require('../') + , it = require('it-is') + , u = require('ubelt') + , spec = require('stream-spec') + , Stream = require('stream') + , from = require('from') + , through = require('through') + +//REFACTOR THIS TEST TO USE es.readArray and es.writeArray + +function writeArray(array, stream) { + + array.forEach( function (j) { + stream.write(j) + }) + stream.end() + +} + +function readStream(stream, done) { + + var array = [] + stream.on('data', function (data) { + array.push(data) + }) + stream.on('error', done) + stream.on('end', function (data) { + done(null, array) + }) + +} + +//call sink on each write, +//and complete when finished. + +function pauseStream (prob, delay) { + var pauseIf = ( + 'number' == typeof prob + ? function () { + return Math.random() < prob + } + : 'function' == typeof prob + ? prob + : 0.1 + ) + var delayer = ( + !delay + ? process.nextTick + : 'number' == typeof delay + ? function (next) { setTimeout(next, delay) } + : delay + ) + + return es.through(function (data) { + if(!this.paused && pauseIf()) { + console.log('PAUSE STREAM PAUSING') + this.pause() + var self = this + delayer(function () { + console.log('PAUSE STREAM RESUMING') + self.resume() + }) + } + console.log("emit ('data', " + data + ')') + this.emit('data', data) + }) +} + +exports ['simple map'] = function (test) { + + var input = u.map(1, 1000, function () { + return Math.random() + }) + var expected = input.map(function (v) { + return v * 2 + }) + + var pause = pauseStream(0.1) + var fs = from(input) + var ts = es.writeArray(function (err, ar) { + it(ar).deepEqual(expected) + test.done() + }) + var map = es.through(function (data) { + this.emit('data', data * 2) + }) + + spec(map).through().validateOnExit() + spec(pause).through().validateOnExit() + + fs.pipe(map).pipe(pause).pipe(ts) +} + +exports ['simple map applied to a stream'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + //create event stream from + + var doubler = es.map(function (data, cb) { + cb(null, data * 2) + }) + + spec(doubler).through().validateOnExit() + + //a map is only a middle man, so it is both readable and writable + + it(doubler).has({ + readable: true, + writable: true, + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.map(function (j) { + return j * 2 + })) +// process.nextTick(x.validate) + test.done() + }) + + writeArray(input, doubler) + +} + +exports['pipe two maps together'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + //create event stream from + function dd (data, cb) { + cb(null, data * 2) + } + var doubler1 = es.map(dd), doubler2 = es.map(dd) + + doubler1.pipe(doubler2) + + spec(doubler1).through().validateOnExit() + spec(doubler2).through().validateOnExit() + + readStream(doubler2, function (err, output) { + it(output).deepEqual(input.map(function (j) { + return j * 4 + })) + test.done() + }) + + writeArray(input, doubler1) + +} + +//next: +// +// test pause, resume and drian. +// + +// then make a pipe joiner: +// +// plumber (evStr1, evStr2, evStr3, evStr4, evStr5) +// +// will return a single stream that write goes to the first + +exports ['map will not call end until the callback'] = function (test) { + + var ticker = es.map(function (data, cb) { + process.nextTick(function () { + cb(null, data * 2) + }) + }) + + spec(ticker).through().validateOnExit() + + ticker.write('x') + ticker.end() + + ticker.on('end', function () { + test.done() + }) +} + + +exports ['emit error thrown'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , mapper = + es.map(function () { + throw err + }) + + mapper.on('error', function (_err) { + it(_err).equal(err) + test.done() + }) + +// onExit(spec(mapper).basic().validate) +//need spec that says stream may error. + + mapper.write('hello') + +} + +exports ['emit error calledback'] = function (test) { + + var err = new Error('INTENSIONAL ERROR') + , mapper = + es.map(function (data, callback) { + callback(err) + }) + + mapper.on('error', function (_err) { + it(_err).equal(err) + test.done() + }) + + mapper.write('hello') + +} + +exports ['do not emit drain if not paused'] = function (test) { + + var map = es.map(function (data, callback) { + u.delay(callback)(null, 1) + return true + }) + + spec(map).through().pausable().validateOnExit() + + map.on('drain', function () { + it(false).ok('should not emit drain unless the stream is paused') + }) + + it(map.write('hello')).equal(true) + it(map.write('hello')).equal(true) + it(map.write('hello')).equal(true) + setTimeout(function () {map.end()},10) + map.on('end', test.done) +} + +exports ['emits drain if paused, when all '] = function (test) { + var active = 0 + var drained = false + var map = es.map(function (data, callback) { + active ++ + u.delay(function () { + active -- + callback(null, 1) + })() + console.log('WRITE', false) + return false + }) + + spec(map).through().validateOnExit() + + map.on('drain', function () { + drained = true + it(active).equal(0, 'should emit drain when all maps are done') + }) + + it(map.write('hello')).equal(false) + it(map.write('hello')).equal(false) + it(map.write('hello')).equal(false) + + process.nextTick(function () {map.end()},10) + + map.on('end', function () { + console.log('end') + it(drained).ok('shoud have emitted drain before end') + test.done() + }) + +} + +exports ['map applied to a stream with filtering'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + + var doubler = es.map(function (data, callback) { + if (data % 2) + callback(null, data * 2) + else + callback() + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.filter(function (j) { + return j % 2 + }).map(function (j) { + return j * 2 + })) + test.done() + }) + + spec(doubler).through().validateOnExit() + + writeArray(input, doubler) + +} + +exports ['simple mapSync applied to a stream'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + + var doubler = es.mapSync(function (data) { + return data * 2 + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.map(function (j) { + return j * 2 + })) + test.done() + }) + + spec(doubler).through().validateOnExit() + + writeArray(input, doubler) + +} + +exports ['mapSync applied to a stream with filtering'] = function (test) { + + var input = [1,2,3,7,5,3,1,9,0,2,4,6] + + var doubler = es.mapSync(function (data) { + if (data % 2) + return data * 2 + }) + + readStream(doubler, function (err, output) { + it(output).deepEqual(input.filter(function (j) { + return j % 2 + }).map(function (j) { + return j * 2 + })) + test.done() + }) + + spec(doubler).through().validateOnExit() + + writeArray(input, doubler) + +} + +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/spec.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/spec.asynct.js new file mode 100644 index 00000000..6d5fb6b8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/spec.asynct.js @@ -0,0 +1,86 @@ +/* + assert that data is called many times + assert that end is called eventually + + assert that when stream enters pause state, + on drain is emitted eventually. +*/ + +var es = require('..') +var it = require('it-is').style('colour') +var spec = require('stream-spec') + +exports['simple stream'] = function (test) { + + var stream = es.through() + var x = spec(stream).basic().pausable() + + stream.write(1) + stream.write(1) + stream.pause() + stream.write(1) + stream.resume() + stream.write(1) + stream.end(2) //this will call write() + + process.nextTick(function (){ + x.validate() + test.done() + }) +} + +exports['throw on write when !writable'] = function (test) { + + var stream = es.through() + var x = spec(stream).basic().pausable() + + stream.write(1) + stream.write(1) + stream.end(2) //this will call write() + stream.write(1) //this will be throwing..., but the spec will catch it. + + process.nextTick(function () { + x.validate() + test.done() + }) + +} + +exports['end fast'] = function (test) { + + var stream = es.through() + var x = spec(stream).basic().pausable() + + stream.end() //this will call write() + + process.nextTick(function () { + x.validate() + test.done() + }) + +} + + +/* + okay, that was easy enough, whats next? + + say, after you call paused(), write should return false + until resume is called. + + simple way to implement this: + write must return !paused + after pause() paused = true + after resume() paused = false + + on resume, if !paused drain is emitted again. + after drain, !paused + + there are lots of subtle ordering bugs in streams. + + example, set !paused before emitting drain. + + the stream api is stateful. +*/ + + +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/split.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/split.asynct.js new file mode 100644 index 00000000..7d44bac0 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/split.asynct.js @@ -0,0 +1,47 @@ +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + , join = require('path').join + , fs = require('fs') + , Stream = require('stream').Stream + , spec = require('stream-spec') + +exports ['es.split() works like String#split'] = function (test) { + var readme = join(__filename) + , expected = fs.readFileSync(readme, 'utf-8').split('\n') + , cs = es.split() + , actual = [] + , ended = false + , x = spec(cs).through() + + var a = new Stream () + + a.write = function (l) { + actual.push(l.trim()) + } + a.end = function () { + + ended = true + expected.forEach(function (v,k) { + //String.split will append an empty string '' + //if the string ends in a split pattern. + //es.split doesn't which was breaking this test. + //clearly, appending the empty string is correct. + //tests are passing though. which is the current job. + if(v) + it(actual[k]).like(v) + }) + //give the stream time to close + process.nextTick(function () { + test.done() + x.validate() + }) + } + a.writable = true + + fs.createReadStream(readme, {flags: 'r'}).pipe(cs) + cs.pipe(a) + +} + +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/stringify.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/stringify.js new file mode 100644 index 00000000..d158185a --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/stringify.js @@ -0,0 +1,15 @@ + + + +var es = require('../') + +exports['handle buffer'] = function (t) { + + + es.stringify().on('data', function (d) { + t.equal(d.trim(), JSON.stringify('HELLO')) + t.end() + }).write(new Buffer('HELLO')) + +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/event-stream/test/writeArray.asynct.js b/node_modules/gulp-minify-css/node_modules/event-stream/test/writeArray.asynct.js new file mode 100644 index 00000000..5d705de8 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/event-stream/test/writeArray.asynct.js @@ -0,0 +1,31 @@ + +var es = require('../') + , it = require('it-is').style('colour') + , d = require('ubelt') + +exports ['write an array'] = function (test) { + + var readThis = d.map(3, 6, 100, d.id) //array of multiples of 3 < 100 + + var writer = es.writeArray(function (err, array){ + if(err) throw err //unpossible + it(array).deepEqual(readThis) + test.done() + }) + + d.each(readThis, writer.write.bind(writer)) + writer.end() + +} + + +exports ['writer is writable, but not readable'] = function (test) { + var reader = es.writeArray(function () {}) + it(reader).has({ + readable: false, + writable: true + }) + + test.done() +} +require('./helper')(module) diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/.npmignore b/node_modules/gulp-minify-css/node_modules/gulp-util/.npmignore new file mode 100644 index 00000000..b5ef13a3 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/.npmignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +node_modules +build +*.node +components \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/.travis.yml b/node_modules/gulp-minify-css/node_modules/gulp-util/.travis.yml new file mode 100644 index 00000000..33ad9f8c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.9" + - "0.10" +after_script: + - npm run coveralls \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/LICENSE b/node_modules/gulp-minify-css/node_modules/gulp-util/LICENSE new file mode 100755 index 00000000..7cbe012c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Fractal + +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/gulp-minify-css/node_modules/gulp-util/README.md b/node_modules/gulp-minify-css/node_modules/gulp-util/README.md new file mode 100644 index 00000000..fd0e506e --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/README.md @@ -0,0 +1,166 @@ +# gulp-util [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status](https://david-dm.org/gulpjs/gulp-util.png?theme=shields.io)](https://david-dm.org/gulpjs/gulp-util) + +## Information + + + + + + + + + + + + + +
    Packagegulp-util
    DescriptionUtility functions for gulp plugins
    Node Version>= 0.9
    + +## Usage + +```javascript +var gutil = require('gulp-util'); + +gutil.log('stuff happened', 'Really it did', gutil.colors.cyan('123')); +gutil.beep(); + +gutil.replaceExtension('file.coffee', '.js'); // file.js + +var opt = { + name: 'todd', + file: someGulpFile +}; +gutil.template('test <%= name %> <%= file.path %>', opt) // test todd /js/hi.js +``` + +### log(msg...) + +Logs stuff. Already prefixed with [gulp] and all that. Use the right colors for values. If you pass in multiple arguments it will join them by a space. + +``` +values (files, module names, etc.) = magenta +numbers (times, counts, etc) = cyan +``` + +### colors + +This is an instance of [chalk](https://github.com/sindresorhus/chalk) + +### date + +This is an instance of [node-dateformat](https://github.com/felixge/node-dateformat). + +### linefeed + +Just `\n`. Use this. + +### replaceExtension(path, newExtension) + +Replaces a file extension in a path. Returns the new path. + +### isStream(obj) + +Returns true or false if an object is a stream. + +### isBuffer(obj) + +Returns true or false if an object is a Buffer. + +### template(string[, data]) + +This is a lodash.template function wrapper. You must pass in a valid gulp file object so it is available to the user or it will error. You can not configure any of the delimiters. Look at the [lodash docs](http://lodash.com/docs#template) for more info. + +## new File(obj) + +This is just [vinyl](https://github.com/wearefractal/vinyl) + +```javascript +var file = new gutil.File({ + base: join(__dirname, './fixtures/'), + cwd: __dirname, + path: join(__dirname, './fixtures/test.coffee') +}); +``` + +## noop() + +Returns a stream that does nothing but pass data straight through. + +```javascript +gulp.task('scripts', function() { + gulp.src('src/**/*.js') + .pipe(concat('script.js')) + .pipe(gulp.env.production ? uglify() : gutil.noop()) + .pipe(gulp.dest('dist/'); +}); +``` + +## combine(streams...) + +Argument may also be an array of streams. Returns a function that returns the combined stream. Useful for keeping things DRY. This is a simple wrapper around event-stream's `.pipeline` + +```javascript +var scripts = gutil.combine( + coffee({bare: true}), + uglify(), + concat('script.js'), + gulp.dest('dist/') +); + +gulp.task('default', function() { + gulp.src('*.coffee').pipe(scripts()); +}); +``` + +## buffer(cb) + +This is similar to es.wait but instead of buffering text into one string it buffers anything into an array (so very useful for file objects). + +Returns a stream that can be piped to. + +The stream will emit one data event after the stream piped to it has ended. The data will be the same array passed to the callback. + +Callback is optional and receives two arguments: error and data + +```javascript +gulp.src('stuff/*.js') + .pipe(gutil.buffer(function(err, files){ + + }); +``` + +## new PluginError(pluginName, message[, options]) + +- pluginName should be the module name of your plugin +- message can be a string or an existing error +- By default the stack will not be shown. Set `options.showStack` to true if you think the stack is important for your error. +- If you pass an error in as the message the stack will be pulled from that, otherwise one will be created. + +These are all acceptable forms of instantiation: + +```javascript +var err = new gutil.PluginError('test', { + message: 'something broke' +}); + +var err = new gutil.PluginError({ + plugin: 'test', + message: 'something broke' +}); + +var err = new gutil.PluginError('test', 'something broke'); + +var err = new gutil.PluginError('test', 'something broke', {showStack: true}); + +var existingError = new Error('OMG'); +var err = new gutil.PluginError('test', existingError, {showStack: true}); +``` + +[npm-url]: https://npmjs.org/package/gulp-util +[npm-image]: https://badge.fury.io/js/gulp-util.png +[travis-url]: https://travis-ci.org/gulpjs/gulp-util +[travis-image]: https://travis-ci.org/gulpjs/gulp-util.png?branch=master +[coveralls-url]: https://coveralls.io/r/gulpjs/gulp-util +[coveralls-image]: https://coveralls.io/repos/gulpjs/gulp-util/badge.png +[depstat-url]: https://david-dm.org/gulpjs/gulp-util +[depstat-image]: https://david-dm.org/gulpjs/gulp-util.png diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/index.js b/node_modules/gulp-minify-css/node_modules/gulp-util/index.js new file mode 100644 index 00000000..6746ee4b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/index.js @@ -0,0 +1,18 @@ +module.exports = { + File: require('./lib/File'), + replaceExtension: require('./lib/replaceExtension'), + colors: require('./lib/colors'), + date: require('./lib/date'), + log: require('./lib/log'), + template: require('./lib/template'), + env: require('./lib/env'), + beep: require('./lib/beep'), + noop: require('./lib/noop'), + isStream: require('./lib/isStream'), + isBuffer: require('./lib/isBuffer'), + isNull: require('./lib/isNull'), + linefeed: require('./lib/linefeed'), + combine: require('./lib/combine'), + buffer: require('./lib/buffer'), + PluginError: require('./lib/PluginError') +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/File.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/File.js new file mode 100644 index 00000000..690a508a --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/File.js @@ -0,0 +1 @@ +module.exports = require('vinyl'); \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/PluginError.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/PluginError.js new file mode 100644 index 00000000..96555672 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/PluginError.js @@ -0,0 +1,65 @@ +var util = require('util'); +var colors = require('./colors'); + +// wow what a clusterfuck +var parseOptions = function(plugin, message, opt) { + if (!opt) opt = {}; + if (typeof plugin === 'object') { + opt = plugin; + } else if (message instanceof Error) { + opt.message = message; + opt.plugin = plugin; + } else if (typeof message === 'object') { + opt = message; + opt.plugin = plugin; + } else if (typeof opt === 'object') { + opt.plugin = plugin; + opt.message = message; + } + return opt; +}; + +function PluginError(plugin, message, opt) { + if (!(this instanceof PluginError)) throw new Error('Call PluginError using new'); + + Error.call(this); + + var options = parseOptions(plugin, message, opt); + + this.plugin = options.plugin; + this.showStack = options.showStack; + + // if message is an Error grab crap off it + if (options.message instanceof Error) { + this.name = options.message.name; + this.message = options.message.message; + this.fileName = options.message.fileName; + this.lineNumber = options.message.lineNumber; + this.stack = options.message.stack; + } else { // else check options obj + this.name = options.name; + this.message = options.message; + this.fileName = options.fileName; + this.lineNumber = options.lineNumber; + this.stack = options.stack; + } + + // defaults + if (!this.name) this.name = 'Error'; + + // TODO: figure out why this explodes mocha + if (!this.stack) Error.captureStackTrace(this, arguments.callee || this.constructor); + + if (!this.plugin) throw new Error('Missing plugin name'); + if (!this.message) throw new Error('Missing error message'); +} + +util.inherits(PluginError, Error); + +PluginError.prototype.toString = function () { + var sig = '['+colors.green('gulp')+'] '+this.name+' in plugin \''+colors.cyan(this.plugin)+'\''; + var msg = this.showStack ? (this._stack || this.stack) : this.message; + return sig+': '+msg; +}; + +module.exports = PluginError; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/beep.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/beep.js new file mode 100644 index 00000000..5473d754 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/beep.js @@ -0,0 +1,3 @@ +module.exports = function() { + process.stdout.write('\x07'); +}; diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/buffer.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/buffer.js new file mode 100644 index 00000000..4cb064ac --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/buffer.js @@ -0,0 +1,15 @@ +var through = require('through2'); + +module.exports = function(fn) { + var buf = []; + var end = function(cb) { + this.push(buf); + cb(); + if(fn) fn(null, buf); + }; + var push = function(data, enc, cb) { + buf.push(data); + cb(); + }; + return through.obj(push, end); +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/colors.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/colors.js new file mode 100644 index 00000000..bc804940 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/colors.js @@ -0,0 +1 @@ +module.exports = require('chalk'); \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/combine.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/combine.js new file mode 100644 index 00000000..f20712d2 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/combine.js @@ -0,0 +1,11 @@ +var pipeline = require('multipipe'); + +module.exports = function(){ + var args = arguments; + if (args.length === 1 && Array.isArray(args[0])) { + args = args[0]; + } + return function(){ + return pipeline.apply(pipeline, args); + }; +}; diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/date.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/date.js new file mode 100644 index 00000000..935793cc --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/date.js @@ -0,0 +1 @@ +module.exports = require('dateformat'); \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/env.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/env.js new file mode 100644 index 00000000..ea1e03e4 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/env.js @@ -0,0 +1,4 @@ +var parseArgs = require('minimist'); +var argv = parseArgs(process.argv.slice(2)); + +module.exports = argv; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isBuffer.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isBuffer.js new file mode 100644 index 00000000..0e23782c --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isBuffer.js @@ -0,0 +1,7 @@ +var buf = require('buffer'); +var Buffer = buf.Buffer; + +// could use Buffer.isBuffer but this is the same exact thing... +module.exports = function(o) { + return typeof o === 'object' && o instanceof Buffer; +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isNull.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isNull.js new file mode 100644 index 00000000..403bb30e --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isNull.js @@ -0,0 +1,3 @@ +module.exports = function(v) { + return v === null; +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isStream.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isStream.js new file mode 100644 index 00000000..9ce0929b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/isStream.js @@ -0,0 +1,5 @@ +var Stream = require('stream').Stream; + +module.exports = function(o) { + return !!o && o instanceof Stream; +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/linefeed.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/linefeed.js new file mode 100644 index 00000000..5b0dfa4b --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/linefeed.js @@ -0,0 +1 @@ +module.exports = '\n'; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/log.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/log.js new file mode 100644 index 00000000..cdbb22fc --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/log.js @@ -0,0 +1,9 @@ +var colors = require('./colors'); + +module.exports = function(){ + var sig = '['+colors.green('gulp')+']'; + var args = Array.prototype.slice.call(arguments); + args.unshift(sig); + console.log.apply(console, args); + return this; +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/noop.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/noop.js new file mode 100644 index 00000000..7862cb16 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/noop.js @@ -0,0 +1,5 @@ +var through = require('through2'); + +module.exports = function () { + return through.obj(); +}; diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/replaceExtension.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/replaceExtension.js new file mode 100644 index 00000000..3f76938e --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/replaceExtension.js @@ -0,0 +1,9 @@ +var path = require('path'); + +module.exports = function(npath, ext) { + if (typeof npath !== 'string') return npath; + if (npath.length === 0) return npath; + + var nFileName = path.basename(npath, path.extname(npath))+ext; + return path.join(path.dirname(npath), nFileName); +}; \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/lib/template.js b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/template.js new file mode 100644 index 00000000..c467820f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/lib/template.js @@ -0,0 +1,19 @@ +var template = require('lodash.template'); +var reInterpolate = require('lodash._reinterpolate'); + +var forcedSettings = { + escape: /<%-([\s\S]+?)%>/g, + evaluate: /<%([\s\S]+?)%>/g, + interpolate: reInterpolate +}; + +module.exports = function(tmpl, data){ + var fn = template(tmpl, null, forcedSettings); + + var wrapped = function(o) { + if (typeof o === 'undefined' || typeof o.file === 'undefined') throw new Error('Failed to provide the current file as "file" to the template'); + return fn(o); + }; + + return (data ? wrapped(data) : wrapped); +}; diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/index.js b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/index.js new file mode 100644 index 00000000..a21f7022 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/index.js @@ -0,0 +1,63 @@ +'use strict'; +var ansi = require('ansi-styles'); +var stripAnsi = require('strip-ansi'); +var hasColor = require('has-color'); +var defineProps = Object.defineProperties; +var chalk = module.exports; + +var styles = (function () { + var ret = {}; + + ansi.grey = ansi.gray; + + Object.keys(ansi).forEach(function (key) { + ret[key] = { + get: function () { + this._styles.push(key); + return this; + } + }; + }); + + return ret; +})(); + +function init() { + var ret = {}; + + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + var obj = defineProps(function self() { + var str = [].slice.call(arguments).join(' '); + + if (!chalk.enabled) { + return str; + } + + return self._styles.reduce(function (str, name) { + var code = ansi[name]; + return str ? code.open + str + code.close : ''; + }, str); + }, styles); + + obj._styles = []; + + return obj[name]; + } + } + }); + + return ret; +} + +defineProps(chalk, init()); + +chalk.styles = ansi; +chalk.stripColor = stripAnsi; +chalk.supportsColor = hasColor; + +// detect mode if not set manually +if (chalk.enabled === undefined) { + chalk.enabled = chalk.supportsColor; +} diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi new file mode 120000 index 00000000..b65c9f81 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi @@ -0,0 +1 @@ +../strip-ansi/cli.js \ No newline at end of file diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js new file mode 100644 index 00000000..3da548c4 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js @@ -0,0 +1,38 @@ +'use strict'; +var styles = module.exports; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49] +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = {}; + style.open = '\x1b[' + val[0] + 'm'; + style.close = '\x1b[' + val[1] + 'm'; +}); diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json new file mode 100644 index 00000000..2d61dabe --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json @@ -0,0 +1,58 @@ +{ + "name": "ansi-styles", + "version": "1.0.0", + "description": "ANSI escape codes for colorizing strings in the terminal", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "homepage": "https://github.com/sindresorhus/ansi-styles", + "bugs": { + "url": "https://github.com/sindresorhus/ansi-styles/issues" + }, + "license": "MIT", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "files": [ + "ansi-styles.js" + ], + "main": "ansi-styles", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/ansi-styles.git" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "~1.12.0" + }, + "engines": { + "node": ">=0.8.0" + }, + "readme": "# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles)\n\n> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for colorizing strings in the terminal.\n\nYou probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.\n\n![screenshot](screenshot.png)\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles`\n\n\n## Example\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green.open + 'Hello world!' + ansi.green.close);\n```\n\n## API\n\nEach style has an `open` and `close` property.\n\n\n## Styles\n\n### General\n\n- reset\n- bold\n- italic\n- underline\n- inverse\n- strikethrough\n\n### Text colors\n\n- black\n- red\n- green\n- yellow\n- blue\n- magenta\n- cyan\n- white\n- gray\n\n### Background colors\n\n- bgBlack\n- bgRed\n- bgGreen\n- bgYellow\n- bgBlue\n- bgMagenta\n- bgCyan\n- bgWhite\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "_id": "ansi-styles@1.0.0", + "_from": "ansi-styles@~1.0.0" +} diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md new file mode 100644 index 00000000..4ac8cbd0 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md @@ -0,0 +1,65 @@ +# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for colorizing strings in the terminal. + +You probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings. + +![screenshot](screenshot.png) + + +## Install + +Install with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles` + + +## Example + +```js +var ansi = require('ansi-styles'); + +console.log(ansi.green.open + 'Hello world!' + ansi.green.close); +``` + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### General + +- reset +- bold +- italic +- underline +- inverse +- strikethrough + +### Text colors + +- black +- red +- green +- yellow +- blue +- magenta +- cyan +- white +- gray + +### Background colors + +- bgBlack +- bgRed +- bgGreen +- bgYellow +- bgBlue +- bgMagenta +- bgCyan +- bgWhite + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js new file mode 100644 index 00000000..27316b1f --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js @@ -0,0 +1,24 @@ +'use strict'; +module.exports = (function () { + if (process.argv.indexOf('--no-color') !== -1) { + return false; + } + + if (process.argv.indexOf('--color') !== -1) { + return true; + } + + if (!process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + return /^screen|^xterm|color|ansi|cygwin|linux/i.test(process.env.TERM); +})(); diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json new file mode 100644 index 00000000..e55a6244 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json @@ -0,0 +1,55 @@ +{ + "name": "has-color", + "version": "0.1.4", + "description": "Detect whether a terminal supports color", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "capability", + "detect" + ], + "homepage": "https://github.com/sindresorhus/has-color", + "bugs": { + "url": "https://github.com/sindresorhus/has-color/issues" + }, + "license": "MIT", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "files": [ + "has-color.js" + ], + "main": "has-color", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/has-color.git" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "~1.12.0" + }, + "engines": { + "node": ">=0.8.0" + }, + "readme": "# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color)\n\n> Detect whether a terminal supports color.\n\nUsed in the terminal color module [chalk](https://github.com/sindresorhus/chalk).\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/has-color): `npm install --save has-color`\n\n\n## Example\n\n```js\nvar hasColor = require('has-color');\n\nif (hasColor) {\n\tconsole.log('Terminal supports color.');\n}\n```\n\nIt obeys the CLI flags `--color` and `--no-color`.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "_id": "has-color@0.1.4", + "_from": "has-color@~0.1.0" +} diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md new file mode 100644 index 00000000..0918c851 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md @@ -0,0 +1,28 @@ +# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color) + +> Detect whether a terminal supports color. + +Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk). + + +## Install + +Install with [npm](https://npmjs.org/package/has-color): `npm install --save has-color` + + +## Example + +```js +var hasColor = require('has-color'); + +if (hasColor) { + console.log('Terminal supports color.'); +} +``` + +It obeys the CLI flags `--color` and `--no-color`. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js new file mode 100755 index 00000000..f8019cda --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js @@ -0,0 +1,27 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var strip = require('./index'); +var input = process.argv[2]; + +if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) { + console.log('strip-ansi > '); + console.log('or'); + console.log('cat | strip-ansi > '); + return; +} + +if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) { + console.log(require('./package').version); + return; +} + +if (input) { + process.stdout.write(strip(fs.readFileSync(input, 'utf8'))); + return; +} + +process.stdin.setEncoding('utf8'); +process.stdin.on('data', function (data) { + process.stdout.write(strip(data)); +}); diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js new file mode 100644 index 00000000..62320c59 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = function (str) { + return typeof str === 'string' ? str.replace(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/g, '') : str; +}; diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json new file mode 100644 index 00000000..7ca2b5d1 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json @@ -0,0 +1,64 @@ +{ + "name": "strip-ansi", + "version": "0.1.1", + "description": "Strip ANSI escape codes (used for colorizing strings in the terminal)", + "license": "MIT", + "bin": { + "strip-ansi": "cli.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/strip-ansi" + }, + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.8.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js", + "cli.js" + ], + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "devDependencies": { + "mocha": "~1.x" + }, + "readme": "# strip-ansi [![Build Status](https://secure.travis-ci.org/sindresorhus/strip-ansi.png?branch=master)](http://travis-ci.org/sindresorhus/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) (used for colorizing strings in the terminal)\n\nUsed in the terminal color module [chalk](https://github.com/sindresorhus/chalk).\n\n\n## Install\n\nInstall locally with [npm](https://npmjs.org/package/strip-ansi):\n\n```\nnpm install --save strip-ansi\n```\n\nOr globally if you want to use it as a CLI app:\n\n```\nnpm install --global strip-ansi\n```\n\nYou can then use it in your Terminal like:\n\n```\nstrip-ansi file-with-color-codes\n```\n\nOr pipe something to it:\n\n```\nls | strip-ansi\n```\n\n\n## Example\n\n```js\nvar stripAnsi = require('strip-ansi');\nstripAnsi('\\x1b[4mcake\\x1b[0m');\n//=> cake\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "bugs": { + "url": "https://github.com/sindresorhus/strip-ansi/issues" + }, + "homepage": "https://github.com/sindresorhus/strip-ansi", + "_id": "strip-ansi@0.1.1", + "_from": "strip-ansi@~0.1.0" +} diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md new file mode 100644 index 00000000..eb661b3d --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md @@ -0,0 +1,46 @@ +# strip-ansi [![Build Status](https://secure.travis-ci.org/sindresorhus/strip-ansi.png?branch=master)](http://travis-ci.org/sindresorhus/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) (used for colorizing strings in the terminal) + +Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk). + + +## Install + +Install locally with [npm](https://npmjs.org/package/strip-ansi): + +``` +npm install --save strip-ansi +``` + +Or globally if you want to use it as a CLI app: + +``` +npm install --global strip-ansi +``` + +You can then use it in your Terminal like: + +``` +strip-ansi file-with-color-codes +``` + +Or pipe something to it: + +``` +ls | strip-ansi +``` + + +## Example + +```js +var stripAnsi = require('strip-ansi'); +stripAnsi('\x1b[4mcake\x1b[0m'); +//=> cake +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/package.json b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/package.json new file mode 100644 index 00000000..853b0144 --- /dev/null +++ b/node_modules/gulp-minify-css/node_modules/gulp-util/node_modules/chalk/package.json @@ -0,0 +1,61 @@ +{ + "name": "chalk", + "version": "0.4.0", + "description": "Terminal string styling done right. Created because the `colors` module does some really horrible things.", + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/chalk" + }, + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.8.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "ansi", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "has-color": "~0.1.0", + "ansi-styles": "~1.0.0", + "strip-ansi": "~0.1.0" + }, + "devDependencies": { + "mocha": "~1.x" + }, + "readme": "# \"chalk\"\n\n> Terminal string styling done right\n\n[![Build Status](https://secure.travis-ci.org/sindresorhus/chalk.png?branch=master)](http://travis-ci.org/sindresorhus/chalk)\n\n[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![screenshot](screenshot.png)\n\n\n## Why\n\n- **Doesn't extend String.prototype**\n- Expressive API\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n- [Used by 150+ modules](https://npmjs.org/browse/depended/chalk)\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/chalk): `npm install --save chalk`\n\n\n## Example\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nconsole.log( chalk.blue('Hello world!') );\n\n// combine styled and normal strings\nconsole.log( chalk.blue('Hello'), 'World' + chalk.red('!') );\n\n// compose multiple styles using the chainable API\nconsole.log( chalk.blue.bgRed.bold('Hello world!') );\n\n// nest styles\nconsole.log( chalk.red('Hello', chalk.underline.bgBlue('world') + '!') );\n\n// pass in multiple arguments\nconsole.log( chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz') );\n```\n\nYou can easily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\n\n## API\n\n### chalk.` \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/xunit.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/xunit.js new file mode 100644 index 00000000..1ed5ee93 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/reporters/xunit.js @@ -0,0 +1,115 @@ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +XUnit.prototype.__proto__ = Base.prototype; + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: test.duration / 1000 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runnable.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runnable.js new file mode 100644 index 00000000..b34bf1e1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runnable.js @@ -0,0 +1,217 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Runnable.prototype.__proto__ = EventEmitter.prototype; + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runner.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runner.js new file mode 100644 index 00000000..dffc3c05 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/runner.js @@ -0,0 +1,561 @@ +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(['errno'])); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Runner.prototype.__proto__ = EventEmitter.prototype; + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + utils.forEach(arr, function(arr){ + this._globals.push(arr); + }, this); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + // check length - 2 ('errno' and 'location' globals) + if (isNode && 1 == ok.length - globals.length) return; + else if (2 == ok.length - globals.length) return; + + if(this.prevGlobalsLength == globals.length) return; + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures (currently) hard-end due + * to that fact that a failing hook will + * surely cause subsequent tests to fail, + * causing jumbled reporting. + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + this.emit('end'); +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) return self.failHook(hook, err); + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + self.suite = orig; + return fn(err); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + function next(err) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(){ + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next() { + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done() { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(); + }); + } + + this.hook('beforeAll', function(){ + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method not init at first + // it is assigned in some seconds + if (global.navigator && /^getInterface/.test(key)) return false; + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && /^\d+/.test(key)) return false; + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return false; + + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/suite.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/suite.js new file mode 100644 index 00000000..869bb88d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/suite.js @@ -0,0 +1,296 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Suite.prototype.__proto__ = EventEmitter.prototype; + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/template.html b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/template.html new file mode 100644 index 00000000..0590d4aa --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/template.html @@ -0,0 +1,18 @@ + + + + Mocha + + + + + +
    + + + + + + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/test.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/test.js new file mode 100644 index 00000000..11773e0c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/test.js @@ -0,0 +1,32 @@ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +Test.prototype.__proto__ = Runnable.prototype; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/utils.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/utils.js new file mode 100644 index 00000000..939a8aa6 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/lib/utils.js @@ -0,0 +1,281 @@ +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , join = path.join + , debug = require('debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee|litcoffee|coffee.md)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var whitespace = str.match(/^\n?(\s*)/)[1] + , re = new RegExp('^' + whitespace, 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.css b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.css new file mode 100644 index 00000000..274b9776 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.css @@ -0,0 +1,260 @@ +@charset "utf-8"; + +body { + margin:0; +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, #mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, #mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: #C09853; +} + +#mocha .test.pass.slow .duration { + background: #B94A48; +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #00d6b2; +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: white; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: #0b97c4; +} + +#mocha .test.pending::before { + content: '◦'; + color: #0b97c4; +} + +#mocha .test.fail { + color: #c00; +} + +#mocha .test.fail pre { + color: black; +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #c00; +} + +#mocha .test pre.error { + color: #c00; + max-height: 300px; + overflow: auto; +} + +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + border-bottom-color: #ddd; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-border-radius: 3px; + -moz-box-shadow: 0 1px 3px #eee; + border-radius: 3px; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: #eee; + font-size: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition: opacity 200ms; + -moz-transition: opacity 200ms; + transition: opacity 200ms; + opacity: 0.3; + color: #888; +} + +#mocha .test:hover a.replay { + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-report.pending .test.pass, +#mocha-report.pending .test.fail { + display: none; +} +#mocha-report.pending .test.pass.pending { + display: block; +} + +#mocha-error { + color: #c00; + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + position: fixed; + top: 15px; + right: 10px; + font-size: 12px; + margin: 0; + color: #888; + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; +} + +#mocha-stats em { + color: black; +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid #eee; +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: #ddd } +#mocha code .init { color: #2F6FAD } +#mocha code .string { color: #5890AD } +#mocha code .keyword { color: #8A6343 } +#mocha code .number { color: #2F6FAD } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.js new file mode 100644 index 00000000..0a04e204 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/mocha.js @@ -0,0 +1,5554 @@ +;(function(){ + +// CommonJS require() + +function require(p){ + var path = require.resolve(p) + , mod = require.modules[path]; + if (!mod) throw new Error('failed to require "' + p + '"'); + if (!mod.exports) { + mod.exports = {}; + mod.call(mod.exports, mod, mod.exports, require.relative(path)); + } + return mod.exports; + } + +require.modules = {}; + +require.resolve = function (path){ + var orig = path + , reg = path + '.js' + , index = path + '/index.js'; + return require.modules[reg] && reg + || require.modules[index] && index + || orig; + }; + +require.register = function (path, fn){ + require.modules[path] = fn; + }; + +require.relative = function (parent) { + return function(p){ + if ('.' != p.charAt(0)) return require(p); + + var path = parent.split('/') + , segs = p.split('/'); + path.pop(); + + for (var i = 0; i < segs.length; i++) { + var seg = segs[i]; + if ('..' == seg) path.pop(); + else if ('.' != seg) path.push(seg); + } + + return require(path.join('/')); + }; + }; + + +require.register("browser/debug.js", function(module, exports, require){ + +module.exports = function(type){ + return function(){ + } +}; + +}); // module: browser/debug.js + +require.register("browser/diff.js", function(module, exports, require){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + /*jshint maxparams: 5*/ + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + var Diff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + Diff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left === right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + Diff: Diff, + + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push('Index: ' + fileName); + ret.push('==================================================================='); + ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize) + + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'); + var diff = []; + var remEOFNL = false, + addEOFNL = false; + + for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) { + if(diffstr[i][0] === '@') { + var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + diff.unshift({ + start:meh[3], + oldlength:meh[2], + oldlines:[], + newlength:meh[4], + newlines:[] + }); + } else if(diffstr[i][0] === '+') { + diff[0].newlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '-') { + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === ' ') { + diff[0].newlines.push(diffstr[i].substr(1)); + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '\\') { + if (diffstr[i-1][0] === '+') { + remEOFNL = true; + } else if(diffstr[i-1][0] === '-') { + addEOFNL = true; + } + } + } + + var str = oldStr.split('\n'); + for (var i = diff.length - 1; i >= 0; i--) { + var d = diff[i]; + for (var j = 0; j < d.oldlength; j++) { + if(str[d.start-1+j] !== d.oldlines[j]) { + return false; + } + } + Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines)); + } + + if (remEOFNL) { + while (!str[str.length-1]) { + str.pop(); + } + } else if (addEOFNL) { + str.push(''); + } + return str.join('\n'); + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes){ + var ret = [], change; + for ( var i = 0; i < changes.length; i++) { + change = changes[i]; + ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); + } + return ret; + } + }; +})(); + +if (typeof module !== 'undefined') { + module.exports = JsDiff; +} + +}); // module: browser/diff.js + +require.register("browser/events.js", function(module, exports, require){ + +/** + * Module exports. + */ + +exports.EventEmitter = EventEmitter; + +/** + * Check if `obj` is an array. + */ + +function isArray(obj) { + return '[object Array]' == {}.toString.call(obj); +} + +/** + * Event emitter constructor. + * + * @api public + */ + +function EventEmitter(){}; + +/** + * Adds a listener. + * + * @api public + */ + +EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; +}; + +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +/** + * Adds a volatile listener. + * + * @api public + */ + +EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; +}; + +/** + * Removes a listener. + * + * @api public + */ + +EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; +}; + +/** + * Removes all listeners for an event. + * + * @api public + */ + +EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; +}; + +/** + * Gets all listeners for a certain event. + * + * @api public + */ + +EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; +}; + +/** + * Emits an event. + * + * @api public + */ + +EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = [].slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; +}; +}); // module: browser/events.js + +require.register("browser/fs.js", function(module, exports, require){ + +}); // module: browser/fs.js + +require.register("browser/path.js", function(module, exports, require){ + +}); // module: browser/path.js + +require.register("browser/progress.js", function(module, exports, require){ + +/** + * Expose `Progress`. + */ + +module.exports = Progress; + +/** + * Initialize a new `Progress` indicator. + */ + +function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); +} + +/** + * Set progress size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.size = function(n){ + this._size = n; + return this; +}; + +/** + * Set text to `str`. + * + * @param {String} str + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.text = function(str){ + this._text = str; + return this; +}; + +/** + * Set font size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.fontSize = function(n){ + this._fontSize = n; + return this; +}; + +/** + * Set font `family`. + * + * @param {String} family + * @return {Progress} for chaining + */ + +Progress.prototype.font = function(family){ + this._font = family; + return this; +}; + +/** + * Update percentage to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + */ + +Progress.prototype.update = function(n){ + this.percent = n; + return this; +}; + +/** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} for chaining + */ + +Progress.prototype.draw = function(ctx){ + var percent = Math.min(this.percent, 100) + , size = this._size + , half = size / 2 + , x = half + , y = half + , rad = half - 1 + , fontSize = this._fontSize; + + ctx.font = fontSize + 'px ' + this._font; + + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); + + // outer circle + ctx.strokeStyle = '#9f9f9f'; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); + + // inner circle + ctx.strokeStyle = '#eee'; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); + + // text + var text = this._text || (percent | 0) + '%' + , w = ctx.measureText(text).width; + + ctx.fillText( + text + , x - w / 2 + 1 + , y + fontSize / 2 - 1); + + return this; +}; + +}); // module: browser/progress.js + +require.register("browser/tty.js", function(module, exports, require){ + +exports.isatty = function(){ + return true; +}; + +exports.getWindowSize = function(){ + if ('innerHeight' in global) { + return [global.innerHeight, global.innerWidth]; + } else { + // In a Web Worker, the DOM Window is not available. + return [640, 480]; + } +}; + +}); // module: browser/tty.js + +require.register("context.js", function(module, exports, require){ + +/** + * Expose `Context`. + */ + +module.exports = Context; + +/** + * Initialize a new `Context`. + * + * @api private + */ + +function Context(){} + +/** + * Set or get the context `Runnable` to `runnable`. + * + * @param {Runnable} runnable + * @return {Context} + * @api private + */ + +Context.prototype.runnable = function(runnable){ + if (0 == arguments.length) return this._runnable; + this.test = this._runnable = runnable; + return this; +}; + +/** + * Set test timeout `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.timeout = function(ms){ + this.runnable().timeout(ms); + return this; +}; + +/** + * Set test slowness threshold `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.slow = function(ms){ + this.runnable().slow(ms); + return this; +}; + +/** + * Inspect the context void of `._runnable`. + * + * @return {String} + * @api private + */ + +Context.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_runnable' == key) return; + if ('test' == key) return; + return val; + }, 2); +}; + +}); // module: context.js + +require.register("hook.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Hook`. + */ + +module.exports = Hook; + +/** + * Initialize a new `Hook` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Hook(title, fn) { + Runnable.call(this, title, fn); + this.type = 'hook'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Hook.prototype = new F; +Hook.prototype.constructor = Hook; + + +/** + * Get or set the test `err`. + * + * @param {Error} err + * @return {Error} + * @api public + */ + +Hook.prototype.error = function(err){ + if (0 == arguments.length) { + var err = this._error; + this._error = null; + return err; + } + + this._error = err; +}; + +}); // module: hook.js + +require.register("interfaces/bdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils'); + +/** + * BDD-style interface: + * + * describe('Array', function(){ + * describe('#indexOf()', function(){ + * it('should return -1 when not present', function(){ + * + * }); + * + * it('should return the index when present', function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.describe = context.context = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending describe. + */ + + context.xdescribe = + context.xcontext = + context.describe.skip = function(title, fn){ + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive suite. + */ + + context.describe.only = function(title, fn){ + var suite = context.describe(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.it = context.specify = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.it.only = function(title, fn){ + var test = context.it(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + }; + + /** + * Pending test case. + */ + + context.xit = + context.xspecify = + context.it.skip = function(title){ + context.it(title); + }; + }); +}; + +}); // module: interfaces/bdd.js + +require.register("interfaces/exports.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * TDD-style interface: + * + * exports.Array = { + * '#indexOf()': { + * 'should return -1 when the value is not present': function(){ + * + * }, + * + * 'should return the correct index when the value is present': function(){ + * + * } + * } + * }; + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('require', visit); + + function visit(obj) { + var suite; + for (var key in obj) { + if ('function' == typeof obj[key]) { + var fn = obj[key]; + switch (key) { + case 'before': + suites[0].beforeAll(fn); + break; + case 'after': + suites[0].afterAll(fn); + break; + case 'beforeEach': + suites[0].beforeEach(fn); + break; + case 'afterEach': + suites[0].afterEach(fn); + break; + default: + suites[0].addTest(new Test(key, fn)); + } + } else { + var suite = Suite.create(suites[0], key); + suites.unshift(suite); + visit(obj[key]); + suites.shift(); + } + } + } +}; + +}); // module: interfaces/exports.js + +require.register("interfaces/index.js", function(module, exports, require){ + +exports.bdd = require('./bdd'); +exports.tdd = require('./tdd'); +exports.qunit = require('./qunit'); +exports.exports = require('./exports'); + +}); // module: interfaces/index.js + +require.register("interfaces/qunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils'); + +/** + * QUnit-style interface: + * + * suite('Array'); + * + * test('#length', function(){ + * var arr = [1,2,3]; + * ok(arr.length == 3); + * }); + * + * test('#indexOf()', function(){ + * var arr = [1,2,3]; + * ok(arr.indexOf(1) == 0); + * ok(arr.indexOf(2) == 1); + * ok(arr.indexOf(3) == 2); + * }); + * + * suite('String'); + * + * test('#length', function(){ + * ok('foo'.length == 3); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title`. + */ + + context.suite = function(title){ + if (suites.length > 1) suites.shift(); + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + return suite; + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var test = new Test(title, fn); + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/qunit.js + +require.register("interfaces/tdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils');; + +/** + * TDD-style interface: + * + * suite('Array', function(){ + * suite('#indexOf()', function(){ + * suiteSetup(function(){ + * + * }); + * + * test('should return -1 when not present', function(){ + * + * }); + * + * test('should return the index when present', function(){ + * + * }); + * + * suiteTeardown(function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before each test case. + */ + + context.setup = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.teardown = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Execute before the suite. + */ + + context.suiteSetup = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after the suite. + */ + + context.suiteTeardown = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.suite = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending suite. + */ + context.suite.skip = function(title, fn) { + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/tdd.js + +require.register("mocha.js", function(module, exports, require){ +/*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var path = require('browser/path') + , utils = require('./utils'); + +/** + * Expose `Mocha`. + */ + +exports = module.exports = Mocha; + +/** + * Expose internals. + */ + +exports.utils = utils; +exports.interfaces = require('./interfaces'); +exports.reporters = require('./reporters'); +exports.Runnable = require('./runnable'); +exports.Context = require('./context'); +exports.Runner = require('./runner'); +exports.Suite = require('./suite'); +exports.Hook = require('./hook'); +exports.Test = require('./test'); + +/** + * Return image `name` path. + * + * @param {String} name + * @return {String} + * @api private + */ + +function image(name) { + return __dirname + '/../images/' + name + '.png'; +} + +/** + * Setup mocha with `options`. + * + * Options: + * + * - `ui` name "bdd", "tdd", "exports" etc + * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` + * - `globals` array of accepted globals + * - `timeout` timeout in milliseconds + * - `bail` bail on the first test failure + * - `slow` milliseconds to wait before considering a test slow + * - `ignoreLeaks` ignore global leaks + * - `grep` string or regexp to filter tests with + * + * @param {Object} options + * @api public + */ + +function Mocha(options) { + options = options || {}; + this.files = []; + this.options = options; + this.grep(options.grep); + this.suite = new exports.Suite('', new exports.Context); + this.ui(options.ui); + this.bail(options.bail); + this.reporter(options.reporter); + if (null != options.timeout) this.timeout(options.timeout); + if (options.slow) this.slow(options.slow); +} + +/** + * Enable or disable bailing on the first failure. + * + * @param {Boolean} [bail] + * @api public + */ + +Mocha.prototype.bail = function(bail){ + if (0 == arguments.length) bail = true; + this.suite.bail(bail); + return this; +}; + +/** + * Add test `file`. + * + * @param {String} file + * @api public + */ + +Mocha.prototype.addFile = function(file){ + this.files.push(file); + return this; +}; + +/** + * Set reporter to `reporter`, defaults to "dot". + * + * @param {String|Function} reporter name or constructor + * @api public + */ + +Mocha.prototype.reporter = function(reporter){ + if ('function' == typeof reporter) { + this._reporter = reporter; + } else { + reporter = reporter || 'dot'; + try { + this._reporter = require('./reporters/' + reporter); + } catch (err) { + this._reporter = require(reporter); + } + if (!this._reporter) throw new Error('invalid reporter "' + reporter + '"'); + } + return this; +}; + +/** + * Set test UI `name`, defaults to "bdd". + * + * @param {String} bdd + * @api public + */ + +Mocha.prototype.ui = function(name){ + name = name || 'bdd'; + this._ui = exports.interfaces[name]; + if (!this._ui) throw new Error('invalid interface "' + name + '"'); + this._ui = this._ui(this.suite); + return this; +}; + +/** + * Load registered files. + * + * @api private + */ + +Mocha.prototype.loadFiles = function(fn){ + var self = this; + var suite = this.suite; + var pending = this.files.length; + this.files.forEach(function(file){ + file = path.resolve(file); + suite.emit('pre-require', global, file, self); + suite.emit('require', require(file), file, self); + suite.emit('post-require', global, file, self); + --pending || (fn && fn()); + }); +}; + +/** + * Enable growl support. + * + * @api private + */ + +Mocha.prototype._growl = function(runner, reporter) { + var notify = require('growl'); + + runner.on('end', function(){ + var stats = reporter.stats; + if (stats.failures) { + var msg = stats.failures + ' of ' + runner.total + ' tests failed'; + notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); + } else { + notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { + name: 'mocha' + , title: 'Passed' + , image: image('ok') + }); + } + }); +}; + +/** + * Add regexp to grep, if `re` is a string it is escaped. + * + * @param {RegExp|String} re + * @return {Mocha} + * @api public + */ + +Mocha.prototype.grep = function(re){ + this.options.grep = 'string' == typeof re + ? new RegExp(utils.escapeRegexp(re)) + : re; + return this; +}; + +/** + * Invert `.grep()` matches. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.invert = function(){ + this.options.invert = true; + return this; +}; + +/** + * Ignore global leaks. + * + * @param {Boolean} ignore + * @return {Mocha} + * @api public + */ + +Mocha.prototype.ignoreLeaks = function(ignore){ + this.options.ignoreLeaks = !!ignore; + return this; +}; + +/** + * Enable global leak checking. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.checkLeaks = function(){ + this.options.ignoreLeaks = false; + return this; +}; + +/** + * Enable growl support. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.growl = function(){ + this.options.growl = true; + return this; +}; + +/** + * Ignore `globals` array or string. + * + * @param {Array|String} globals + * @return {Mocha} + * @api public + */ + +Mocha.prototype.globals = function(globals){ + this.options.globals = (this.options.globals || []).concat(globals); + return this; +}; + +/** + * Set the timeout in milliseconds. + * + * @param {Number} timeout + * @return {Mocha} + * @api public + */ + +Mocha.prototype.timeout = function(timeout){ + this.suite.timeout(timeout); + return this; +}; + +/** + * Set slowness threshold in milliseconds. + * + * @param {Number} slow + * @return {Mocha} + * @api public + */ + +Mocha.prototype.slow = function(slow){ + this.suite.slow(slow); + return this; +}; + +/** + * Makes all tests async (accepting a callback) + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.asyncOnly = function(){ + this.options.asyncOnly = true; + return this; +}; + +/** + * Run tests and invoke `fn()` when complete. + * + * @param {Function} fn + * @return {Runner} + * @api public + */ + +Mocha.prototype.run = function(fn){ + if (this.files.length) this.loadFiles(); + var suite = this.suite; + var options = this.options; + var runner = new exports.Runner(suite); + var reporter = new this._reporter(runner); + runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.asyncOnly = options.asyncOnly; + if (options.grep) runner.grep(options.grep, options.invert); + if (options.globals) runner.globals(options.globals); + if (options.growl) this._growl(runner, reporter); + return runner.run(fn); +}; + +}); // module: mocha.js + +require.register("ms.js", function(module, exports, require){ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} options + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options){ + options = options || {}; + if ('string' == typeof val) return parse(val); + return options.long + ? long(val) + : short(val); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|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 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 's': + return n * s; + case 'ms': + return n; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function short(ms) { + if (ms >= d) return Math.round(ms / d) + 'd'; + if (ms >= h) return Math.round(ms / h) + 'h'; + if (ms >= m) return Math.round(ms / m) + 'm'; + if (ms >= s) return Math.round(ms / s) + 's'; + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function long(ms) { + return plural(ms, d, 'day') + || plural(ms, h, 'hour') + || plural(ms, m, 'minute') + || plural(ms, s, 'second') + || ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) return; + if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; + return Math.ceil(ms / n) + ' ' + name + 's'; +} + +}); // module: ms.js + +require.register("reporters/base.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var tty = require('browser/tty') + , diff = require('browser/diff') + , ms = require('../ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Check if both stdio streams are associated with a tty. + */ + +var isatty = tty.isatty(1) && tty.isatty(2); + +/** + * Expose `Base`. + */ + +exports = module.exports = Base; + +/** + * Enable coloring by default. + */ + +exports.useColors = isatty; + +/** + * Default color map. + */ + +exports.colors = { + 'pass': 90 + , 'fail': 31 + , 'bright pass': 92 + , 'bright fail': 91 + , 'bright yellow': 93 + , 'pending': 36 + , 'suite': 0 + , 'error title': 0 + , 'error message': 31 + , 'error stack': 90 + , 'checkmark': 32 + , 'fast': 90 + , 'medium': 33 + , 'slow': 31 + , 'green': 32 + , 'light': 90 + , 'diff gutter': 90 + , 'diff added': 42 + , 'diff removed': 41 +}; + +/** + * Default symbol map. + */ + +exports.symbols = { + ok: '✓', + err: '✖', + dot: '․' +}; + +// With node.js on Windows: use symbols available in terminal default fonts +if ('win32' == process.platform) { + exports.symbols.ok = '\u221A'; + exports.symbols.err = '\u00D7'; + exports.symbols.dot = '.'; +} + +/** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @param {String} type + * @param {String} str + * @return {String} + * @api private + */ + +var color = exports.color = function(type, str) { + if (!exports.useColors) return str; + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; +}; + +/** + * Expose term window size, with some + * defaults for when stderr is not a tty. + */ + +exports.window = { + width: isatty + ? process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1] + : 75 +}; + +/** + * Expose some basic cursor interactions + * that are common among reporters. + */ + +exports.cursor = { + hide: function(){ + process.stdout.write('\u001b[?25l'); + }, + + show: function(){ + process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function(){ + process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function(){ + process.stdout.write('\u001b[0G'); + }, + + CR: function(){ + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } +}; + +/** + * Outut the given `failures` as a list. + * + * @param {Array} failures + * @api public + */ + +exports.list = function(failures){ + console.error(); + failures.forEach(function(test, i){ + // format + var fmt = color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var err = test.err + , message = err.message || '' + , stack = err.stack || message + , index = stack.indexOf(message) + message.length + , msg = stack.slice(0, index) + , actual = err.actual + , expected = err.expected + , escape = true; + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + + // explicitly show diff + if (err.showDiff && sameType(actual, expected)) { + escape = false; + err.actual = actual = stringify(actual); + err.expected = expected = stringify(expected); + } + + // actual / expected diff + if ('string' == typeof actual && 'string' == typeof expected) { + msg = errorDiff(err, 'WordsWithSpace', escape); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines.map(function(str, i){ + return pad(++i, width) + ' |' + ' ' + str; + }).join('\n'); + } + + // legend + msg = '\n' + + color('diff removed', 'actual') + + ' ' + + color('diff added', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + + fmt = color('error title', ' %s) %s:\n%s') + + color('error stack', '\n%s\n'); + } + + // indent stack trace without msg + stack = stack.slice(index ? index + 1 : index) + .replace(/^/gm, ' '); + + console.error(fmt, (i + 1), test.fullTitle(), msg, stack); + }); +}; + +/** + * Initialize a new `Base` reporter. + * + * All other reporters generally + * inherit from this reporter, providing + * stats such as test duration, number + * of tests passed / failed etc. + * + * @param {Runner} runner + * @api public + */ + +function Base(runner) { + var self = this + , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } + , failures = this.failures = []; + + if (!runner) return; + this.runner = runner; + + runner.stats = stats; + + runner.on('start', function(){ + stats.start = new Date; + }); + + runner.on('suite', function(suite){ + stats.suites = stats.suites || 0; + suite.root || stats.suites++; + }); + + runner.on('test end', function(test){ + stats.tests = stats.tests || 0; + stats.tests++; + }); + + runner.on('pass', function(test){ + stats.passes = stats.passes || 0; + + var medium = test.slow() / 2; + test.speed = test.duration > test.slow() + ? 'slow' + : test.duration > medium + ? 'medium' + : 'fast'; + + stats.passes++; + }); + + runner.on('fail', function(test, err){ + stats.failures = stats.failures || 0; + stats.failures++; + test.err = err; + failures.push(test); + }); + + runner.on('end', function(){ + stats.end = new Date; + stats.duration = new Date - stats.start; + }); + + runner.on('pending', function(){ + stats.pending++; + }); +} + +/** + * Output common epilogue used by many of + * the bundled reporters. + * + * @api public + */ + +Base.prototype.epilogue = function(){ + var stats = this.stats; + var tests; + var fmt; + + console.log(); + + // passes + fmt = color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + console.log(fmt, + stats.passes || 0, + ms(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + + color('pending', ' %d pending'); + + console.log(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + console.error(fmt, + stats.failures); + + Base.list(this.failures); + console.error(); + } + + console.log(); +}; + +/** + * Pad the given `str` to `len`. + * + * @param {String} str + * @param {String} len + * @return {String} + * @api private + */ + +function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; +} + +/** + * Return a character diff for `err`. + * + * @param {Error} err + * @return {String} + * @api private + */ + +function errorDiff(err, type, escape) { + return diff['diff' + type](err.actual, err.expected).map(function(str){ + if (escape) { + str.value = str.value + .replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); + } + if (str.added) return colorLines('diff added', str.value); + if (str.removed) return colorLines('diff removed', str.value); + return str.value; + }).join(''); +} + +/** + * Color lines for `str`, using the color `name`. + * + * @param {String} name + * @param {String} str + * @return {String} + * @api private + */ + +function colorLines(name, str) { + return str.split('\n').map(function(str){ + return color(name, str); + }).join('\n'); +} + +/** + * Stringify `obj`. + * + * @param {Mixed} obj + * @return {String} + * @api private + */ + +function stringify(obj) { + if (obj instanceof RegExp) return obj.toString(); + return JSON.stringify(obj, null, 2); +} + +/** + * Check that a / b have the same type. + * + * @param {Object} a + * @param {Object} b + * @return {Boolean} + * @api private + */ + +function sameType(a, b) { + a = Object.prototype.toString.call(a); + b = Object.prototype.toString.call(b); + return a == b; +} + +}); // module: reporters/base.js + +require.register("reporters/doc.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Doc`. + */ + +exports = module.exports = Doc; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Doc(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('suite', function(suite){ + if (suite.root) return; + ++indents; + console.log('%s
    ', indent()); + ++indents; + console.log('%s

    %s

    ', indent(), utils.escape(suite.title)); + console.log('%s
    ', indent()); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + console.log('%s
    ', indent()); + --indents; + console.log('%s
    ', indent()); + --indents; + }); + + runner.on('pass', function(test){ + console.log('%s
    %s
    ', indent(), utils.escape(test.title)); + var code = utils.escape(utils.clean(test.fn.toString())); + console.log('%s
    %s
    ', indent(), code); + }); +} + +}); // module: reporters/doc.js + +require.register("reporters/dot.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = Dot; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Dot(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , n = 0; + + runner.on('start', function(){ + process.stdout.write('\n '); + }); + + runner.on('pending', function(test){ + process.stdout.write(color('pending', Base.symbols.dot)); + }); + + runner.on('pass', function(test){ + if (++n % width == 0) process.stdout.write('\n '); + if ('slow' == test.speed) { + process.stdout.write(color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(color(test.speed, Base.symbols.dot)); + } + }); + + runner.on('fail', function(test, err){ + if (++n % width == 0) process.stdout.write('\n '); + process.stdout.write(color('fail', Base.symbols.dot)); + }); + + runner.on('end', function(){ + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Dot.prototype = new F; +Dot.prototype.constructor = Dot; + +}); // module: reporters/dot.js + +require.register("reporters/html-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var JSONCov = require('./json-cov') + , fs = require('browser/fs'); + +/** + * Expose `HTMLCov`. + */ + +exports = module.exports = HTMLCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTMLCov(runner) { + var jade = require('jade') + , file = __dirname + '/templates/coverage.jade' + , str = fs.readFileSync(file, 'utf8') + , fn = jade.compile(str, { filename: file }) + , self = this; + + JSONCov.call(this, runner, false); + + runner.on('end', function(){ + process.stdout.write(fn({ + cov: self.cov + , coverageClass: coverageClass + })); + }); +} + +/** + * Return coverage class for `n`. + * + * @return {String} + * @api private + */ + +function coverageClass(n) { + if (n >= 75) return 'high'; + if (n >= 50) return 'medium'; + if (n >= 25) return 'low'; + return 'terrible'; +} +}); // module: reporters/html-cov.js + +require.register("reporters/html.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , Progress = require('../browser/progress') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `Doc`. + */ + +exports = module.exports = HTML; + +/** + * Stats template. + */ + +var statsTemplate = '
    '; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTML(runner, root) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , stat = fragment(statsTemplate) + , items = stat.getElementsByTagName('li') + , passes = items[1].getElementsByTagName('em')[0] + , passesLink = items[1].getElementsByTagName('a')[0] + , failures = items[2].getElementsByTagName('em')[0] + , failuresLink = items[2].getElementsByTagName('a')[0] + , duration = items[3].getElementsByTagName('em')[0] + , canvas = stat.getElementsByTagName('canvas')[0] + , report = fragment('
      ') + , stack = [report] + , progress + , ctx + + root = root || document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress; + } + + if (!root) return error('#mocha div missing, add it to your document'); + + // pass toggle + on(passesLink, 'click', function(){ + unhide(); + var name = /pass/.test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test pass'); + }); + + // failure toggle + on(failuresLink, 'click', function(){ + unhide(); + var name = /fail/.test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test fail'); + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) progress.size(40); + + runner.on('suite', function(suite){ + if (suite.root) return; + + // suite + var url = '?grep=' + encodeURIComponent(suite.fullTitle()); + var el = fragment('
    • %s

    • ', url, escape(suite.title)); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + stack.shift(); + }); + + runner.on('fail', function(test, err){ + if ('hook' == test.type) runner.emit('test end', test); + }); + + runner.on('test end', function(test){ + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) progress.update(percent).draw(ctx); + + // update stats + var ms = new Date - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + + // test + if ('passed' == test.state) { + var el = fragment('
    • %e%ems ‣

    • ', test.speed, test.title, test.duration, encodeURIComponent(test.fullTitle())); + } else if (test.pending) { + var el = fragment('
    • %e

    • ', test.title); + } else { + var el = fragment('
    • %e ‣

    • ', test.title, encodeURIComponent(test.fullTitle())); + var str = test.err.stack || test.err.toString(); + + // FF / Opera do not add the message + if (!~str.indexOf(test.err.message)) { + str = test.err.message + '\n' + str; + } + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if ('[object Error]' == str) str = test.err.message; + + // Safari doesn't give you a stack. Let's at least provide a source line. + if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { + str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + } + + el.appendChild(fragment('
      %e
      ', str)); + } + + // toggle code + // TODO: defer + if (!test.pending) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function(){ + pre.style.display = 'none' == pre.style.display + ? 'block' + : 'none'; + }); + + var pre = fragment('
      %e
      ', utils.clean(test.fn.toString())); + el.appendChild(pre); + pre.style.display = 'none'; + } + + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) stack[0].appendChild(el); + }); +} + +/** + * Display error `msg`. + */ + +function error(msg) { + document.body.appendChild(fragment('
      %s
      ', msg)); +} + +/** + * Return a DOM fragment from `html`. + */ + +function fragment(html) { + var args = arguments + , div = document.createElement('div') + , i = 1; + + div.innerHTML = html.replace(/%([se])/g, function(_, type){ + switch (type) { + case 's': return String(args[i++]); + case 'e': return escape(args[i++]); + } + }); + + return div.firstChild; +} + +/** + * Check for suites that do not have elements + * with `classname`, and hide them. + */ + +function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (0 == els.length) suites[i].className += ' hidden'; + } +} + +/** + * Unhide .hidden suites. + */ + +function unhide() { + var els = document.getElementsByClassName('suite hidden'); + for (var i = 0; i < els.length; ++i) { + els[i].className = els[i].className.replace('suite hidden', 'suite'); + } +} + +/** + * Set `el` text to `str`. + */ + +function text(el, str) { + if (el.textContent) { + el.textContent = str; + } else { + el.innerText = str; + } +} + +/** + * Listen on `event` with callback `fn`. + */ + +function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } +} + +}); // module: reporters/html.js + +require.register("reporters/index.js", function(module, exports, require){ + +exports.Base = require('./base'); +exports.Dot = require('./dot'); +exports.Doc = require('./doc'); +exports.TAP = require('./tap'); +exports.JSON = require('./json'); +exports.HTML = require('./html'); +exports.List = require('./list'); +exports.Min = require('./min'); +exports.Spec = require('./spec'); +exports.Nyan = require('./nyan'); +exports.XUnit = require('./xunit'); +exports.Markdown = require('./markdown'); +exports.Progress = require('./progress'); +exports.Landing = require('./landing'); +exports.JSONCov = require('./json-cov'); +exports.HTMLCov = require('./html-cov'); +exports.JSONStream = require('./json-stream'); +exports.Teamcity = require('./teamcity'); + +}); // module: reporters/index.js + +require.register("reporters/json-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `JSONCov`. + */ + +exports = module.exports = JSONCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @param {Boolean} output + * @api public + */ + +function JSONCov(runner, output) { + var self = this + , output = 1 == arguments.length ? true : output; + + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var cov = global._$jscoverage || {}; + var result = self.cov = map(cov); + result.stats = self.stats; + result.tests = tests.map(clean); + result.failures = failures.map(clean); + result.passes = passes.map(clean); + if (!output) return; + process.stdout.write(JSON.stringify(result, null, 2 )); + }); +} + +/** + * Map jscoverage data to a JSON structure + * suitable for reporting. + * + * @param {Object} cov + * @return {Object} + * @api private + */ + +function map(cov) { + var ret = { + instrumentation: 'node-jscoverage' + , sloc: 0 + , hits: 0 + , misses: 0 + , coverage: 0 + , files: [] + }; + + for (var filename in cov) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } + + ret.files.sort(function(a, b) { + return a.filename.localeCompare(b.filename); + }); + + if (ret.sloc > 0) { + ret.coverage = (ret.hits / ret.sloc) * 100; + } + + return ret; +}; + +/** + * Map jscoverage data for a single source file + * to a JSON structure suitable for reporting. + * + * @param {String} filename name of the source file + * @param {Object} data jscoverage coverage data + * @return {Object} + * @api private + */ + +function coverage(filename, data) { + var ret = { + filename: filename, + coverage: 0, + hits: 0, + misses: 0, + sloc: 0, + source: {} + }; + + data.source.forEach(function(line, num){ + num++; + + if (data[num] === 0) { + ret.misses++; + ret.sloc++; + } else if (data[num] !== undefined) { + ret.hits++; + ret.sloc++; + } + + ret.source[num] = { + source: line + , coverage: data[num] === undefined + ? '' + : data[num] + }; + }); + + ret.coverage = ret.hits / ret.sloc * 100; + + return ret; +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} + +}); // module: reporters/json-cov.js + +require.register("reporters/json-stream.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total; + + runner.on('start', function(){ + console.log(JSON.stringify(['start', { total: total }])); + }); + + runner.on('pass', function(test){ + console.log(JSON.stringify(['pass', clean(test)])); + }); + + runner.on('fail', function(test, err){ + console.log(JSON.stringify(['fail', clean(test)])); + }); + + runner.on('end', function(){ + process.stdout.write(JSON.stringify(['end', self.stats])); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json-stream.js + +require.register("reporters/json.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `JSON`. + */ + +exports = module.exports = JSONReporter; + +/** + * Initialize a new `JSON` reporter. + * + * @param {Runner} runner + * @api public + */ + +function JSONReporter(runner) { + var self = this; + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var obj = { + stats: self.stats + , tests: tests.map(clean) + , failures: failures.map(clean) + , passes: passes.map(clean) + }; + + process.stdout.write(JSON.stringify(obj, null, 2)); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json.js + +require.register("reporters/landing.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Landing`. + */ + +exports = module.exports = Landing; + +/** + * Airplane color. + */ + +Base.colors.plane = 0; + +/** + * Airplane crash color. + */ + +Base.colors['plane crash'] = 31; + +/** + * Runway color. + */ + +Base.colors.runway = 90; + +/** + * Initialize a new `Landing` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Landing(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , total = runner.total + , stream = process.stdout + , plane = color('plane', '✈') + , crashed = -1 + , n = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on('start', function(){ + stream.write('\n '); + cursor.hide(); + }); + + runner.on('test end', function(test){ + // check if the plane crashed + var col = -1 == crashed + ? width * ++n / total | 0 + : crashed; + + // show the crash + if ('failed' == test.state) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[4F\n\n'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane) + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Landing.prototype = new F; +Landing.prototype.constructor = Landing; + +}); // module: reporters/landing.js + +require.register("reporters/list.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 0; + + runner.on('start', function(){ + console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = color('checkmark', ' -') + + color('pending', ' %s'); + console.log(fmt, test.fullTitle()); + }); + + runner.on('pass', function(test){ + var fmt = color('checkmark', ' '+Base.symbols.dot) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + console.log(fmt, test.fullTitle(), test.duration); + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +List.prototype = new F; +List.prototype.constructor = List; + + +}); // module: reporters/list.js + +require.register("reporters/markdown.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Markdown`. + */ + +exports = module.exports = Markdown; + +/** + * Initialize a new `Markdown` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Markdown(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , level = 0 + , buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function indent() { + return Array(level).join(' '); + } + + function mapTOC(suite, obj) { + var ret = obj; + obj = obj[suite.title] = obj[suite.title] || { suite: suite }; + suite.suites.forEach(function(suite){ + mapTOC(suite, obj); + }); + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if ('suite' == key) continue; + if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + if (key) buf += Array(level).join(' ') + link; + buf += stringifyTOC(obj[key], level); + } + --level; + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on('suite', function(suite){ + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on('suite end', function(suite){ + --level; + }); + + runner.on('pass', function(test){ + var code = utils.clean(test.fn.toString()); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.on('end', function(){ + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); +} +}); // module: reporters/markdown.js + +require.register("reporters/min.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Min`. + */ + +exports = module.exports = Min; + +/** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @param {Runner} runner + * @api public + */ + +function Min(runner) { + Base.call(this, runner); + + runner.on('start', function(){ + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.on('end', this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Min.prototype = new F; +Min.prototype.constructor = Min; + + +}); // module: reporters/min.js + +require.register("reporters/nyan.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = NyanCat; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function NyanCat(runner) { + Base.call(this, runner); + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , rainbowColors = this.rainbowColors = self.generateColors() + , colorIndex = this.colorIndex = 0 + , numerOfLines = this.numberOfLines = 4 + , trajectories = this.trajectories = [[], [], [], []] + , nyanCatWidth = this.nyanCatWidth = 11 + , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) + , scoreboardWidth = this.scoreboardWidth = 5 + , tick = this.tick = 0 + , n = 0; + + runner.on('start', function(){ + Base.cursor.hide(); + self.draw(); + }); + + runner.on('pending', function(test){ + self.draw(); + }); + + runner.on('pass', function(test){ + self.draw(); + }); + + runner.on('fail', function(test, err){ + self.draw(); + }); + + runner.on('end', function(){ + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) write('\n'); + self.epilogue(); + }); +} + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.draw = function(){ + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; +}; + +/** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @api private + */ + +NyanCat.prototype.drawScoreboard = function(){ + var stats = this.stats; + var colors = Base.colors; + + function draw(color, n) { + write(' '); + write('\u001b[' + color + 'm' + n + '\u001b[0m'); + write('\n'); + } + + draw(colors.green, stats.passes); + draw(colors.fail, stats.failures); + draw(colors.pending, stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Append the rainbow. + * + * @api private + */ + +NyanCat.prototype.appendRainbow = function(){ + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + trajectory.push(rainbowified); + } +}; + +/** + * Draw the rainbow. + * + * @api private + */ + +NyanCat.prototype.drawRainbow = function(){ + var self = this; + + this.trajectories.forEach(function(line, index) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.drawNyanCat = function() { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var color = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(color); + write('_,------,'); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(color); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + var face; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw nyan cat face. + * + * @return {String} + * @api private + */ + +NyanCat.prototype.face = function() { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if(stats.passes) { + return '( ^ .^)'; + } else { + return '( - .-)'; + } +} + +/** + * Move cursor up `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorUp = function(n) { + write('\u001b[' + n + 'A'); +}; + +/** + * Move cursor down `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorDown = function(n) { + write('\u001b[' + n + 'B'); +}; + +/** + * Generate rainbow colors. + * + * @return {Array} + * @api private + */ + +NyanCat.prototype.generateColors = function(){ + var colors = []; + + for (var i = 0; i < (6 * 7); i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = (i * (1.0 / 6)); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; +}; + +/** + * Apply rainbow to the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +NyanCat.prototype.rainbowify = function(str){ + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; +}; + +/** + * Stdout helper. + */ + +function write(string) { + process.stdout.write(string); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +NyanCat.prototype = new F; +NyanCat.prototype.constructor = NyanCat; + + +}); // module: reporters/nyan.js + +require.register("reporters/progress.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Progress`. + */ + +exports = module.exports = Progress; + +/** + * General progress bar color. + */ + +Base.colors.progress = 90; + +/** + * Initialize a new `Progress` bar test reporter. + * + * @param {Runner} runner + * @param {Object} options + * @api public + */ + +function Progress(runner, options) { + Base.call(this, runner); + + var self = this + , options = options || {} + , stats = this.stats + , width = Base.window.width * .50 | 0 + , total = runner.total + , complete = 0 + , max = Math.max; + + // default chars + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; + + // tests started + runner.on('start', function(){ + console.log(); + cursor.hide(); + }); + + // tests complete + runner.on('test end', function(){ + complete++; + var incomplete = total - complete + , percent = complete / total + , n = width * percent | 0 + , i = width - n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Progress.prototype = new F; +Progress.prototype.constructor = Progress; + + +}); // module: reporters/progress.js + +require.register("reporters/spec.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Spec`. + */ + +exports = module.exports = Spec; + +/** + * Initialize a new `Spec` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Spec(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , indents = 0 + , n = 0; + + function indent() { + return Array(indents).join(' ') + } + + runner.on('start', function(){ + console.log(); + }); + + runner.on('suite', function(suite){ + ++indents; + console.log(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on('suite end', function(suite){ + --indents; + if (1 == indents) console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(indent() + color('pass', ' ◦ ' + test.title + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = indent() + color('pending', ' - %s'); + console.log(fmt, test.title); + }); + + runner.on('pass', function(test){ + if ('fast' == test.speed) { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s '); + cursor.CR(); + console.log(fmt, test.title); + } else { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s ') + + color(test.speed, '(%dms)'); + cursor.CR(); + console.log(fmt, test.title, test.duration); + } + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Spec.prototype = new F; +Spec.prototype.constructor = Spec; + + +}); // module: reporters/spec.js + +require.register("reporters/tap.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `TAP`. + */ + +exports = module.exports = TAP; + +/** + * Initialize a new `TAP` reporter. + * + * @param {Runner} runner + * @api public + */ + +function TAP(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 1 + , passes = 0 + , failures = 0; + + runner.on('start', function(){ + var total = runner.grepTotal(runner.suite); + console.log('%d..%d', 1, total); + }); + + runner.on('test end', function(){ + ++n; + }); + + runner.on('pending', function(test){ + console.log('ok %d %s # SKIP -', n, title(test)); + }); + + runner.on('pass', function(test){ + passes++; + console.log('ok %d %s', n, title(test)); + }); + + runner.on('fail', function(test, err){ + failures++; + console.log('not ok %d %s', n, title(test)); + if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + }); + + runner.on('end', function(){ + console.log('# tests ' + (passes + failures)); + console.log('# pass ' + passes); + console.log('# fail ' + failures); + }); +} + +/** + * Return a TAP-safe title of `test` + * + * @param {Object} test + * @return {String} + * @api private + */ + +function title(test) { + return test.fullTitle().replace(/#/g, ''); +} + +}); // module: reporters/tap.js + +require.register("reporters/teamcity.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Teamcity`. + */ + +exports = module.exports = Teamcity; + +/** + * Initialize a new `Teamcity` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Teamcity(runner) { + Base.call(this, runner); + var stats = this.stats; + + runner.on('start', function() { + console.log("##teamcity[testSuiteStarted name='mocha.suite']"); + }); + + runner.on('test', function(test) { + console.log("##teamcity[testStarted name='" + escape(test.fullTitle()) + "']"); + }); + + runner.on('fail', function(test, err) { + console.log("##teamcity[testFailed name='" + escape(test.fullTitle()) + "' message='" + escape(err.message) + "']"); + }); + + runner.on('pending', function(test) { + console.log("##teamcity[testIgnored name='" + escape(test.fullTitle()) + "' message='pending']"); + }); + + runner.on('test end', function(test) { + console.log("##teamcity[testFinished name='" + escape(test.fullTitle()) + "' duration='" + test.duration + "']"); + }); + + runner.on('end', function() { + console.log("##teamcity[testSuiteFinished name='mocha.suite' duration='" + stats.duration + "']"); + }); +} + +/** + * Escape the given `str`. + */ + +function escape(str) { + return str + .replace(/\|/g, "||") + .replace(/\n/g, "|n") + .replace(/\r/g, "|r") + .replace(/\[/g, "|[") + .replace(/\]/g, "|]") + .replace(/\u0085/g, "|x") + .replace(/\u2028/g, "|l") + .replace(/\u2029/g, "|p") + .replace(/'/g, "|'"); +} + +}); // module: reporters/teamcity.js + +require.register("reporters/xunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +XUnit.prototype = new F; +XUnit.prototype.constructor = XUnit; + + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: test.duration / 1000 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} + +}); // module: reporters/xunit.js + +require.register("runnable.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runnable.prototype = new F; +Runnable.prototype.constructor = Runnable; + + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; + +}); // module: runnable.js + +require.register("runner.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(['errno'])); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runner.prototype = new F; +Runner.prototype.constructor = Runner; + + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + utils.forEach(arr, function(arr){ + this._globals.push(arr); + }, this); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + // check length - 2 ('errno' and 'location' globals) + if (isNode && 1 == ok.length - globals.length) return; + else if (2 == ok.length - globals.length) return; + + if(this.prevGlobalsLength == globals.length) return; + this.prevGlobalsLength = globals.length; + + //console.time('filterLeaksTime'); + leaks = filterLeaks(ok, globals); + //console.timeEnd('filterLeaksTime'); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures (currently) hard-end due + * to that fact that a failing hook will + * surely cause subsequent tests to fail, + * causing jumbled reporting. + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + this.emit('end'); +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) return self.failHook(hook, err); + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + self.suite = orig; + return fn(err); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + function next(err) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(){ + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next() { + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done() { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(); + }); + } + + this.hook('beforeAll', function(){ + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method not init at first + // it is assigned in some seconds + if (global.navigator && /^getInterface/.test(key)) return false; + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && /^\d+/.test(key)) return false; + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return false; + + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} + +}); // module: runner.js + +require.register("suite.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Suite.prototype = new F; +Suite.prototype.constructor = Suite; + + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; + +}); // module: suite.js + +require.register("test.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Test.prototype = new F; +Test.prototype.constructor = Test; + + +}); // module: test.js + +require.register("utils.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var fs = require('browser/fs') + , path = require('browser/path') + , join = path.join + , debug = require('browser/debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee|litcoffee|coffee.md)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var whitespace = str.match(/^\n?(\s*)/)[1] + , re = new RegExp('^' + whitespace, 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +}); // module: utils.js +// The global object is "self" in Web Workers. +global = (function() { return this; })(); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; + +/** + * Node shims. + * + * These are meant only to allow + * mocha.js to run untouched, not + * to allow running node code in + * the browser. + */ + +var process = {}; +process.exit = function(status){}; +process.stdout = {}; + +/** + * Remove uncaughtException listener. + */ + +process.removeListener = function(e){ + if ('uncaughtException' == e) { + global.onerror = function() {}; + } +}; + +/** + * Implements uncaughtException listener. + */ + +process.on = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function(err, url, line){ + fn(new Error(err + ' (' + url + ':' + line + ')')); + }; + } +}; + +/** + * Expose mocha. + */ + +var Mocha = global.Mocha = require('mocha'), + mocha = global.mocha = new Mocha({ reporter: 'html' }); + +var immediateQueue = [] + , immediateTimeout; + +function timeslice() { + var immediateStart = new Date().getTime(); + while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout(timeslice, 0); + } else { + immediateTimeout = null; + } +} + +/** + * High-performance override of Runner.immediately. + */ + +Mocha.Runner.immediately = function(callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout(timeslice, 0); + } +}; + +/** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ + +mocha.ui = function(ui){ + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', global, null, this); + return this; +}; + +/** + * Setup mocha with the given setting options. + */ + +mocha.setup = function(opts){ + if ('string' == typeof opts) opts = { ui: opts }; + for (var opt in opts) this[opt](opts[opt]); + return this; +}; + +/** + * Run mocha, returning the Runner. + */ + +mocha.run = function(fn){ + var options = mocha.options; + mocha.globals('location'); + + var query = Mocha.utils.parseQuery(global.location.search || ''); + if (query.grep) mocha.grep(query.grep); + if (query.invert) mocha.invert(); + + return Mocha.prototype.run.call(mocha, function(){ + // The DOM Document is not available in Web Workers. + if (global.document) { + Mocha.utils.highlightTags('code'); + } + if (fn) fn(); + }); +}; + +/** + * Expose the process shim. + */ + +Mocha.process = process; +})(); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/.bin/jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/.bin/jade new file mode 120000 index 00000000..571fae73 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/.bin/jade @@ -0,0 +1 @@ +../jade/bin/jade \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.travis.yml b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.travis.yml new file mode 100644 index 00000000..f1d0f13c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/History.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/History.md new file mode 100644 index 00000000..4961d2e2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/History.md @@ -0,0 +1,107 @@ + +0.6.1 / 2012-06-01 +================== + + * Added: append (yes or no) on confirmation + * Added: allow node.js v0.7.x + +0.6.0 / 2012-04-10 +================== + + * Added `.prompt(obj, callback)` support. Closes #49 + * Added default support to .choose(). Closes #41 + * Fixed the choice example + +0.5.1 / 2011-12-20 +================== + + * Fixed `password()` for recent nodes. Closes #36 + +0.5.0 / 2011-12-04 +================== + + * Added sub-command option support [itay] + +0.4.3 / 2011-12-04 +================== + + * Fixed custom help ordering. Closes #32 + +0.4.2 / 2011-11-24 +================== + + * Added travis support + * Fixed: line-buffered input automatically trimmed. Closes #31 + +0.4.1 / 2011-11-18 +================== + + * Removed listening for "close" on --help + +0.4.0 / 2011-11-15 +================== + + * Added support for `--`. Closes #24 + +0.3.3 / 2011-11-14 +================== + + * Fixed: wait for close event when writing help info [Jerry Hamlet] + +0.3.2 / 2011-11-01 +================== + + * Fixed long flag definitions with values [felixge] + +0.3.1 / 2011-10-31 +================== + + * Changed `--version` short flag to `-V` from `-v` + * Changed `.version()` so it's configurable [felixge] + +0.3.0 / 2011-10-31 +================== + + * Added support for long flags only. Closes #18 + +0.2.1 / 2011-10-24 +================== + + * "node": ">= 0.4.x < 0.7.0". Closes #20 + +0.2.0 / 2011-09-26 +================== + + * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] + +0.1.0 / 2011-08-24 +================== + + * Added support for custom `--help` output + +0.0.5 / 2011-08-18 +================== + + * Changed: when the user enters nothing prompt for password again + * Fixed issue with passwords beginning with numbers [NuckChorris] + +0.0.4 / 2011-08-15 +================== + + * Fixed `Commander#args` + +0.0.3 / 2011-08-15 +================== + + * Added default option value support + +0.0.2 / 2011-08-15 +================== + + * Added mask support to `Command#password(str[, mask], fn)` + * Added `Command#password(str, fn)` + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Makefile b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Makefile new file mode 100644 index 00000000..00746255 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Makefile @@ -0,0 +1,7 @@ + +TESTS = $(shell find test/test.*.js) + +test: + @./test/run $(TESTS) + +.PHONY: test \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Readme.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Readme.md new file mode 100644 index 00000000..b8328c37 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/Readme.md @@ -0,0 +1,262 @@ +# Commander.js + + The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). + + [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) + +## Installation + + $ npm install commander + +## Option parsing + + Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander'); + +program + .version('0.0.1') + .option('-p, --peppers', 'Add peppers') + .option('-P, --pineapple', 'Add pineapple') + .option('-b, --bbq', 'Add bbq sauce') + .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') + .parse(process.argv); + +console.log('you ordered a pizza with:'); +if (program.peppers) console.log(' - peppers'); +if (program.pineapple) console.log(' - pineappe'); +if (program.bbq) console.log(' - bbq'); +console.log(' - %s cheese', program.cheese); +``` + + Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +``` + $ ./examples/pizza --help + + Usage: pizza [options] + + Options: + + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineappe + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese [marble] + -h, --help output usage information + +``` + +## Coercion + +```js +function range(val) { + return val.split('..').map(Number); +} + +function list(val) { + return val.split(','); +} + +program + .version('0.0.1') + .usage('[options] ') + .option('-i, --integer ', 'An integer argument', parseInt) + .option('-f, --float ', 'A float argument', parseFloat) + .option('-r, --range ..', 'A range', range) + .option('-l, --list ', 'A list', list) + .option('-o, --optional [value]', 'An optional value') + .parse(process.argv); + +console.log(' int: %j', program.integer); +console.log(' float: %j', program.float); +console.log(' optional: %j', program.optional); +program.range = program.range || []; +console.log(' range: %j..%j', program.range[0], program.range[1]); +console.log(' list: %j', program.list); +console.log(' args: %j', program.args); +``` + +## Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviours, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('../'); + +function list(val) { + return val.split(',').map(Number); +} + +program + .version('0.0.1') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); + console.log(''); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +yielding the following help output: + +``` + +Usage: custom-help [options] + +Options: + + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + + $ custom-help --help + $ custom-help -h + +``` + +## .prompt(msg, fn) + + Single-line prompt: + +```js +program.prompt('name: ', function(name){ + console.log('hi %s', name); +}); +``` + + Multi-line prompt: + +```js +program.prompt('description:', function(name){ + console.log('hi %s', name); +}); +``` + + Coercion: + +```js +program.prompt('Age: ', Number, function(age){ + console.log('age: %j', age); +}); +``` + +```js +program.prompt('Birthdate: ', Date, function(date){ + console.log('date: %s', date); +}); +``` + +## .password(msg[, mask], fn) + +Prompt for password without echoing: + +```js +program.password('Password: ', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +Prompt for password with mask char "*": + +```js +program.password('Password: ', '*', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +## .confirm(msg, fn) + + Confirm with the given `msg`: + +```js +program.confirm('continue? ', function(ok){ + console.log(' got %j', ok); +}); +``` + +## .choose(list, fn) + + Let the user choose from a `list`: + +```js +var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + +console.log('Choose the coolest pet:'); +program.choose(list, function(i){ + console.log('you chose %d "%s"', i, list[i]); +}); +``` + +## Links + + - [API documentation](http://visionmedia.github.com/commander.js/) + - [ascii tables](https://github.com/LearnBoost/cli-table) + - [progress bars](https://github.com/visionmedia/node-progress) + - [more progress bars](https://github.com/substack/node-multimeter) + - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) + +## License + +(The MIT License) + +Copyright (c) 2011 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. \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/index.js new file mode 100644 index 00000000..06ec1e4b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/index.js @@ -0,0 +1,2 @@ + +module.exports = require('./lib/commander'); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/lib/commander.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/lib/commander.js new file mode 100644 index 00000000..5ba87ebb --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/lib/commander.js @@ -0,0 +1,1026 @@ + +/*! + * commander + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , path = require('path') + , tty = require('tty') + , basename = path.basename; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command; + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = ~flags.indexOf('<'); + this.optional = ~flags.indexOf('['); + this.bool = !~flags.indexOf('-no-'); + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function(){ + return this.long + .replace('--', '') + .replace('no-', ''); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg){ + return arg == this.short + || arg == this.long; +}; + +/** + * Initialize a new `Command`. + * + * @param {String} name + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this.args = []; + this.name = name; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Command.prototype.__proto__ = EventEmitter.prototype; + +/** + * Add command `name`. + * + * The `.action()` callback is invoked when the + * command `name` is specified via __ARGV__, + * and the remaining arguments are applied to the + * function for access. + * + * When the `name` is "*" an un-matched command + * will be passed as the first arg, followed by + * the rest of __ARGV__ remaining. + * + * Examples: + * + * program + * .version('0.0.1') + * .option('-C, --chdir ', 'change the working directory') + * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + * .option('-T, --no-tests', 'ignore test hook') + * + * program + * .command('setup') + * .description('run remote setup commands') + * .action(function(){ + * console.log('setup'); + * }); + * + * program + * .command('exec ') + * .description('run the given remote command') + * .action(function(cmd){ + * console.log('exec "%s"', cmd); + * }); + * + * program + * .command('*') + * .description('deploy the given env') + * .action(function(env){ + * console.log('deploying "%s"', env); + * }); + * + * program.parse(process.argv); + * + * @param {String} name + * @return {Command} the new command + * @api public + */ + +Command.prototype.command = function(name){ + var args = name.split(/ +/); + var cmd = new Command(args.shift()); + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + return cmd; +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args){ + if (!args.length) return; + var self = this; + args.forEach(function(arg){ + switch (arg[0]) { + case '<': + self.args.push({ required: true, name: arg.slice(1, -1) }); + break; + case '[': + self.args.push({ required: false, name: arg.slice(1, -1) }); + break; + } + }); + return this; +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function(){ + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn){ + var self = this; + this.parent.on(this.name, function(args, unknown){ + // Parse any so-far unknown options + unknown = unknown || []; + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfNecessary(self, parsed.unknown); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + self.args.forEach(function(arg, i){ + if (arg.required && null == args[i]) { + self.missingArgument(arg.name); + } + }); + + // Always append ourselves to the end of the arguments, + // to make sure we match the number of arguments the user + // expects + if (self.args.length) { + args[self.args.length] = self; + } else { + args.push(self); + } + + fn.apply(this, args); + }); + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to false + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => true + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|Mixed} fn or default + * @param {Mixed} defaultValue + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue){ + var self = this + , option = new Option(flags, description) + , oname = option.name() + , name = camelcase(oname); + + // default as 3rd arg + if ('function' != typeof fn) defaultValue = fn, fn = null; + + // preassign default value only for --no-*, [optional], or + if (false == option.bool || option.optional || option.required) { + // when --no-* we make sure default is true + if (false == option.bool) defaultValue = true; + // preassign only if we have a default + if (undefined !== defaultValue) self[name] = defaultValue; + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on(oname, function(val){ + // coercion + if (null != val && fn) val = fn(val); + + // unassigned or bool + if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { + // if no value, bool true, and we have a default, then use it! + if (null == val) { + self[name] = option.bool + ? defaultValue || true + : false; + } else { + self[name] = val; + } + } else if (null !== val) { + // reassign + self[name] = val; + } + }); + + return this; +}; + +/** + * Parse `argv`, settings options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv){ + // store raw args + this.rawArgs = argv; + + // guess name + if (!this.name) this.name = basename(argv[1]); + + // process argv + var parsed = this.parseOptions(this.normalize(argv.slice(2))); + this.args = parsed.args; + return this.parseArgs(this.args, parsed.unknown); +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args){ + var ret = [] + , arg; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { + arg.slice(1).split('').forEach(function(c){ + ret.push('-' + c); + }); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown){ + var cmds = this.commands + , len = cmds.length + , name; + + if (args.length) { + name = args[0]; + if (this.listeners(name).length) { + this.emit(args.shift(), args, unknown); + } else { + this.emit('*', args); + } + } else { + outputHelpIfNecessary(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0) { + this.unknownOption(unknown[0]); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg){ + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {Array} + * @api public + */ + +Command.prototype.parseOptions = function(argv){ + var args = [] + , len = argv.length + , literal + , option + , arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if ('--' == arg) { + literal = true; + continue; + } + + if (literal) { + args.push(arg); + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (null == arg) return this.optionMissingArgument(option); + if ('-' == arg[0]) return this.optionMissingArgument(option, arg); + this.emit(option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i+1]; + if (null == arg || '-' == arg[0]) { + arg = null; + } else { + ++i; + } + this.emit(option.name(), arg); + // bool + } else { + this.emit(option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && '-' == arg[0]) { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if (argv[i+1] && '-' != argv[i+1][0]) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name){ + console.error(); + console.error(" error: missing required argument `%s'", name); + console.error(); + process.exit(1); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {String} option + * @param {String} flag + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag){ + console.error(); + if (flag) { + console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); + } else { + console.error(" error: option `%s' argument missing", option.flags); + } + console.error(); + process.exit(1); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag){ + console.error(); + console.error(" error: unknown option `%s'", flag); + console.error(); + process.exit(1); +}; + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * @param {String} str + * @param {String} flags + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags){ + if (0 == arguments.length) return this._version; + this._version = str; + flags = flags || '-V, --version'; + this.option(flags, 'output the version number'); + this.on('version', function(){ + console.log(str); + process.exit(0); + }); + return this; +}; + +/** + * Set the description `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str){ + if (0 == arguments.length) return this._description; + this._description = str; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str){ + var args = this.args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }); + + var usage = '[options' + + (this.commands.length ? '] [command' : '') + + ']' + + (this.args.length ? ' ' + args : ''); + if (0 == arguments.length) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function(){ + return this.options.reduce(function(max, option){ + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function(){ + var width = this.largestOptionLength(); + + // Prepend the help information + return [pad('-h, --help', width) + ' ' + 'output usage information'] + .concat(this.options.map(function(option){ + return pad(option.flags, width) + + ' ' + option.description; + })) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function(){ + if (!this.commands.length) return ''; + return [ + '' + , ' Commands:' + , '' + , this.commands.map(function(cmd){ + var args = cmd.args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }).join(' '); + + return cmd.name + + (cmd.options.length + ? ' [options]' + : '') + ' ' + args + + (cmd.description() + ? '\n' + cmd.description() + : ''); + }).join('\n\n').replace(/^/gm, ' ') + , '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function(){ + return [ + '' + , ' Usage: ' + this.name + ' ' + this.usage() + , '' + this.commandHelp() + , ' Options:' + , '' + , '' + this.optionHelp().replace(/^/gm, ' ') + , '' + , '' + ].join('\n'); +}; + +/** + * Prompt for a `Number`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForNumber = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseNumber(val){ + val = Number(val); + if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); + fn(val); + }); +}; + +/** + * Prompt for a `Date`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForDate = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseDate(val){ + val = new Date(val); + if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); + fn(val); + }); +}; + +/** + * Single-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptSingleLine = function(str, fn){ + if ('function' == typeof arguments[2]) { + return this['promptFor' + (fn.name || fn)](str, arguments[2]); + } + + process.stdout.write(str); + process.stdin.setEncoding('utf8'); + process.stdin.once('data', function(val){ + fn(val.trim()); + }).resume(); +}; + +/** + * Multi-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptMultiLine = function(str, fn){ + var buf = []; + console.log(str); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function(val){ + if ('\n' == val || '\r\n' == val) { + process.stdin.removeAllListeners('data'); + fn(buf.join('\n')); + } else { + buf.push(val.trimRight()); + } + }).resume(); +}; + +/** + * Prompt `str` and callback `fn(val)` + * + * Commander supports single-line and multi-line prompts. + * To issue a single-line prompt simply add white-space + * to the end of `str`, something like "name: ", whereas + * for a multi-line prompt omit this "description:". + * + * + * Examples: + * + * program.prompt('Username: ', function(name){ + * console.log('hi %s', name); + * }); + * + * program.prompt('Description:', function(desc){ + * console.log('description was "%s"', desc.trim()); + * }); + * + * @param {String|Object} str + * @param {Function} fn + * @api public + */ + +Command.prototype.prompt = function(str, fn){ + var self = this; + + if ('string' == typeof str) { + if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); + this.promptMultiLine(str, fn); + } else { + var keys = Object.keys(str) + , obj = {}; + + function next() { + var key = keys.shift() + , label = str[key]; + + if (!key) return fn(obj); + self.prompt(label, function(val){ + obj[key] = val; + next(); + }); + } + + next(); + } +}; + +/** + * Prompt for password with `str`, `mask` char and callback `fn(val)`. + * + * The mask string defaults to '', aka no output is + * written while typing, you may want to use "*" etc. + * + * Examples: + * + * program.password('Password: ', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * program.password('Password: ', '*', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {String} mask + * @param {Function} fn + * @api public + */ + +Command.prototype.password = function(str, mask, fn){ + var self = this + , buf = ''; + + // default mask + if ('function' == typeof mask) { + fn = mask; + mask = ''; + } + + process.stdin.resume(); + tty.setRawMode(true); + process.stdout.write(str); + + // keypress + process.stdin.on('keypress', function(c, key){ + if (key && 'enter' == key.name) { + console.log(); + process.stdin.removeAllListeners('keypress'); + tty.setRawMode(false); + if (!buf.trim().length) return self.password(str, mask, fn); + fn(buf); + return; + } + + if (key && key.ctrl && 'c' == key.name) { + console.log('%s', buf); + process.exit(); + } + + process.stdout.write(mask); + buf += c; + }).resume(); +}; + +/** + * Confirmation prompt with `str` and callback `fn(bool)` + * + * Examples: + * + * program.confirm('continue? ', function(ok){ + * console.log(' got %j', ok); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {Function} fn + * @api public + */ + + +Command.prototype.confirm = function(str, fn, verbose){ + var self = this; + this.prompt(str, function(ok){ + if (!ok.trim()) { + if (!verbose) str += '(yes or no) '; + return self.confirm(str, fn, true); + } + fn(parseBool(ok)); + }); +}; + +/** + * Choice prompt with `list` of items and callback `fn(index, item)` + * + * Examples: + * + * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + * + * console.log('Choose the coolest pet:'); + * program.choose(list, function(i){ + * console.log('you chose %d "%s"', i, list[i]); + * process.stdin.destroy(); + * }); + * + * @param {Array} list + * @param {Number|Function} index or fn + * @param {Function} fn + * @api public + */ + +Command.prototype.choose = function(list, index, fn){ + var self = this + , hasDefault = 'number' == typeof index; + + if (!hasDefault) { + fn = index; + index = null; + } + + list.forEach(function(item, i){ + if (hasDefault && i == index) { + console.log('* %d) %s', i + 1, item); + } else { + console.log(' %d) %s', i + 1, item); + } + }); + + function again() { + self.prompt(' : ', function(val){ + val = parseInt(val, 10) - 1; + if (hasDefault && isNaN(val)) val = index; + + if (null == list[val]) { + again(); + } else { + fn(val, list[val]); + } + }); + } + + again(); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word){ + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Parse a boolean `str`. + * + * @param {String} str + * @return {Boolean} + * @api private + */ + +function parseBool(str) { + return /^y|yes|ok|true$/i.test(str); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Output help information if necessary + * + * @param {Command} command to output help for + * @param {Array} array of options to search for -h or --help + * @api private + */ + +function outputHelpIfNecessary(cmd, options) { + options = options || []; + for (var i = 0; i < options.length; i++) { + if (options[i] == '--help' || options[i] == '-h') { + process.stdout.write(cmd.helpInformation()); + cmd.emit('--help'); + process.exit(0); + } + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/package.json new file mode 100644 index 00000000..92f2ed79 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/commander/package.json @@ -0,0 +1,39 @@ +{ + "name": "commander", + "version": "0.6.1", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "command", + "option", + "parser", + "prompt", + "stdin" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/commander.js.git" + }, + "dependencies": {}, + "devDependencies": { + "should": ">= 0.0.1" + }, + "scripts": { + "test": "make test" + }, + "main": "index", + "engines": { + "node": ">= 0.4.x" + }, + "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "homepage": "https://github.com/visionmedia/commander.js", + "_id": "commander@0.6.1", + "_from": "commander@0.6.1" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/Readme.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/Readme.md new file mode 100644 index 00000000..c5a34e8b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/Readme.md @@ -0,0 +1,115 @@ +# debug + + tiny node.js debugging utility modelled after node core's debugging technique. + +## Installation + +``` +$ npm install debug +``` + +## Usage + + With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', 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_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.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. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_ + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.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". + +## 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:". + +## Browser support + + Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + a('doing some work'); +}, 1200); +``` + +## License + +(The MIT License) + +Copyright (c) 2011 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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/debug.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/debug.js new file mode 100644 index 00000000..509dc0de --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/debug.js @@ -0,0 +1,137 @@ + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + if (!debug.enabled(name)) return function(){}; + + return function(fmt){ + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (debug[name] || curr); + debug[name] = curr; + + fmt = name + + ' ' + + fmt + + ' +' + debug.humanize(ms); + + // This hackery is required for IE8 + // where `console.log` doesn't have 'apply' + window.console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); + } +} + +/** + * The currently active debug mode names. + */ + +debug.names = []; +debug.skips = []; + +/** + * Enables a debug mode by name. This can include modes + * separated by a colon and wildcards. + * + * @param {String} name + * @api public + */ + +debug.enable = function(name) { + try { + localStorage.debug = name; + } catch(e){} + + var split = (name || '').split(/[\s,]+/) + , len = split.length; + + for (var i = 0; i < len; i++) { + name = split[i].replace('*', '.*?'); + if (name[0] === '-') { + debug.skips.push(new RegExp('^' + name.substr(1) + '$')); + } + else { + debug.names.push(new RegExp('^' + name + '$')); + } + } +}; + +/** + * Disable debug output. + * + * @api public + */ + +debug.disable = function(){ + debug.enable(''); +}; + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +debug.humanize = function(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +}; + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +debug.enabled = function(name) { + for (var i = 0, len = debug.skips.length; i < len; i++) { + if (debug.skips[i].test(name)) { + return false; + } + } + for (var i = 0, len = debug.names.length; i < len; i++) { + if (debug.names[i].test(name)) { + return true; + } + } + return false; +}; + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +// persist + +try { + if (window.localStorage) debug.enable(localStorage.debug); +} catch(e){} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/index.js new file mode 100644 index 00000000..e02c13b7 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/index.js @@ -0,0 +1,5 @@ +if ('undefined' == typeof window) { + module.exports = require('./lib/debug'); +} else { + module.exports = require('./debug'); +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/lib/debug.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/lib/debug.js new file mode 100644 index 00000000..3b0a9183 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/lib/debug.js @@ -0,0 +1,147 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Enabled debuggers. + */ + +var names = [] + , skips = []; + +(process.env.DEBUG || '') + .split(/[\s,]+/) + .forEach(function(name){ + name = name.replace('*', '.*?'); + if (name[0] === '-') { + skips.push(new RegExp('^' + name.substr(1) + '$')); + } else { + names.push(new RegExp('^' + name + '$')); + } + }); + +/** + * Colors. + */ + +var colors = [6, 2, 3, 4, 5, 1]; + +/** + * Previous debug() call. + */ + +var prev = {}; + +/** + * Previously assigned color. + */ + +var prevColor = 0; + +/** + * Is stdout a TTY? Colored output is disabled when `true`. + */ + +var isatty = tty.isatty(2); + +/** + * Select a color. + * + * @return {Number} + * @api private + */ + +function color() { + return colors[prevColor++ % colors.length]; +} + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +function humanize(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +} + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + function disabled(){} + disabled.enabled = false; + + var match = skips.some(function(re){ + return re.test(name); + }); + + if (match) return disabled; + + match = names.some(function(re){ + return re.test(name); + }); + + if (!match) return disabled; + var c = color(); + + function colored(fmt) { + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (prev[name] || curr); + prev[name] = curr; + + fmt = ' \u001b[9' + c + 'm' + name + ' ' + + '\u001b[3' + c + 'm\u001b[90m' + + fmt + '\u001b[3' + c + 'm' + + ' +' + humanize(ms) + '\u001b[0m'; + + console.error.apply(this, arguments); + } + + function plain(fmt) { + fmt = coerce(fmt); + + fmt = new Date().toUTCString() + + ' ' + name + ' ' + fmt; + console.error.apply(this, arguments); + } + + colored.enabled = plain.enabled = true; + + return isatty || process.env.DEBUG_COLORS + ? colored + : plain; +} + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/package.json new file mode 100644 index 00000000..f44874e1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/debug/package.json @@ -0,0 +1,46 @@ +{ + "name": "debug", + "version": "0.7.4", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*" + }, + "main": "lib/debug.js", + "browser": "./debug.js", + "engines": { + "node": "*" + }, + "files": [ + "lib/debug.js", + "debug.js", + "index.js" + ], + "component": { + "scripts": { + "debug/index.js": "index.js", + "debug/debug.js": "debug.js" + } + }, + "readme": "# debug\n\n tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n 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.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n \n## Conventions\n\n 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\". \n\n## Wildcards\n\n 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=*`.\n\n 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:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "homepage": "https://github.com/visionmedia/debug", + "_id": "debug@0.7.4", + "_from": "debug@*" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/README.md new file mode 100644 index 00000000..95bd8da2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/README.md @@ -0,0 +1,101 @@ +# jsdiff + +[![Build Status](https://secure.travis-ci.org/kpdecker/jsdiff.png)](http://travis-ci.org/kpdecker/jsdiff) + +A javascript text differencing implementation. + +Based on the algorithm proposed in +["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927). + +## Installation + + npm install diff + +or + + git clone git://github.com/kpdecker/jsdiff.git + +## API + +* JsDiff.diffChars(oldStr, newStr) + Diffs two blocks of text, comparing character by character. + + Returns a list of change objects (See below). + +* JsDiff.diffWords(oldStr, newStr) + Diffs two blocks of text, comparing word by word. + + Returns a list of change objects (See below). + +* JsDiff.diffLines(oldStr, newStr) + Diffs two blocks of text, comparing line by line. + + Returns a list of change objects (See below). + +* JsDiff.diffCss(oldStr, newStr) + Diffs two blocks of text, comparing CSS tokens. + + Returns a list of change objects (See below). + +* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) + Creates a unified diff patch. + + Parameters: + * fileName : String to be output in the filename sections of the patch + * oldStr : Original string value + * newStr : New string value + * oldHeader : Additional information to include in the old file header + * newHeader : Additional information to include in thew new file header + +* JsDiff.applyPatch(oldStr, diffStr) + Applies a unified diff patch. + + Return a string containing new version of provided data. + +* convertChangesToXML(changes) + Converts a list of changes to a serialized XML format + +### Change Objects +Many of the methods above return change objects. These objects are consist of the following fields: + +* value: Text content +* added: True if the value was inserted into the new string +* removed: True of the value was removed from the old string + +Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner. + +## [Example](http://kpdecker.github.com/jsdiff) + +## License + +Software License Agreement (BSD License) + +Copyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com + +All rights reserved. + +Redistribution and use of this software 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 Kevin Decker 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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/diff.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/diff.js new file mode 100644 index 00000000..a34c22a0 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/diff.js @@ -0,0 +1,354 @@ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + /*jshint maxparams: 5*/ + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + var Diff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + Diff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left === right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + Diff: Diff, + + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push('Index: ' + fileName); + ret.push('==================================================================='); + ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize) + + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'); + var diff = []; + var remEOFNL = false, + addEOFNL = false; + + for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) { + if(diffstr[i][0] === '@') { + var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + diff.unshift({ + start:meh[3], + oldlength:meh[2], + oldlines:[], + newlength:meh[4], + newlines:[] + }); + } else if(diffstr[i][0] === '+') { + diff[0].newlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '-') { + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === ' ') { + diff[0].newlines.push(diffstr[i].substr(1)); + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '\\') { + if (diffstr[i-1][0] === '+') { + remEOFNL = true; + } else if(diffstr[i-1][0] === '-') { + addEOFNL = true; + } + } + } + + var str = oldStr.split('\n'); + for (var i = diff.length - 1; i >= 0; i--) { + var d = diff[i]; + for (var j = 0; j < d.oldlength; j++) { + if(str[d.start-1+j] !== d.oldlines[j]) { + return false; + } + } + Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines)); + } + + if (remEOFNL) { + while (!str[str.length-1]) { + str.pop(); + } + } else if (addEOFNL) { + str.push(''); + } + return str.join('\n'); + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes){ + var ret = [], change; + for ( var i = 0; i < changes.length; i++) { + change = changes[i]; + ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); + } + return ret; + } + }; +})(); + +if (typeof module !== 'undefined') { + module.exports = JsDiff; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/package.json new file mode 100644 index 00000000..867fd0ce --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/diff/package.json @@ -0,0 +1,51 @@ +{ + "name": "diff", + "version": "1.0.7", + "description": "A javascript text diff implementation.", + "keywords": [ + "diff", + "javascript" + ], + "maintainers": [ + { + "name": "Kevin Decker", + "email": "kpdecker@gmail.com", + "url": "http://incaseofstairs.com" + } + ], + "bugs": { + "url": "http://github.com/kpdecker/jsdiff/issues", + "email": "kpdecker@gmail.com" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/kpdecker/jsdiff/blob/master/LICENSE" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/kpdecker/jsdiff.git" + }, + "engines": { + "node": ">=0.3.1" + }, + "main": "./diff", + "scripts": { + "test": "mocha test/*.js" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "~1.6", + "should": "~1.2" + }, + "optionalDependencies": {}, + "files": [ + "diff.js" + ], + "readme": "# jsdiff\n\n[![Build Status](https://secure.travis-ci.org/kpdecker/jsdiff.png)](http://travis-ci.org/kpdecker/jsdiff)\n\nA javascript text differencing implementation.\n\nBased on the algorithm proposed in\n[\"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927).\n\n## Installation\n\n npm install diff\n\nor\n\n git clone git://github.com/kpdecker/jsdiff.git\n\n## API\n\n* JsDiff.diffChars(oldStr, newStr)\n Diffs two blocks of text, comparing character by character.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffWords(oldStr, newStr)\n Diffs two blocks of text, comparing word by word.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffLines(oldStr, newStr)\n Diffs two blocks of text, comparing line by line.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffCss(oldStr, newStr)\n Diffs two blocks of text, comparing CSS tokens.\n\n Returns a list of change objects (See below).\n\n* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader)\n Creates a unified diff patch.\n\n Parameters:\n * fileName : String to be output in the filename sections of the patch\n * oldStr : Original string value\n * newStr : New string value\n * oldHeader : Additional information to include in the old file header\n * newHeader : Additional information to include in thew new file header\n\n* JsDiff.applyPatch(oldStr, diffStr)\n Applies a unified diff patch.\n\n Return a string containing new version of provided data.\n\n* convertChangesToXML(changes)\n Converts a list of changes to a serialized XML format\n\n### Change Objects\nMany of the methods above return change objects. These objects are consist of the following fields:\n\n* value: Text content\n* added: True if the value was inserted into the new string\n* removed: True of the value was removed from the old string\n\nNote that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.\n\n## [Example](http://kpdecker.github.com/jsdiff)\n\n## License\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n copyright notice, this list of conditions and the\n following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the\n following disclaimer in the documentation and/or other\n materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n contributors may be used to endorse or promote products\n derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/kpdecker/jsdiff", + "_id": "diff@1.0.7", + "_from": "diff@1.0.7" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.npmignore new file mode 100644 index 00000000..2af4b71c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.npmignore @@ -0,0 +1,2 @@ +.*.swp +test/a/ diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.travis.yml b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.travis.yml new file mode 100644 index 00000000..baa0031d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.8 diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/README.md new file mode 100644 index 00000000..cc691645 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/README.md @@ -0,0 +1,250 @@ +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +## Attention: node-glob users! + +The API has changed dramatically between 2.x and 3.x. This library is +now 100% JavaScript, and the integer flags have been replaced with an +options object. + +Also, there's an event emitter class, proper tests, and all the other +things you've come to expect from node modules. + +And best of all, no compilation! + +## Usage + +```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. +}) +``` + +## Features + +Please see the [minimatch +documentation](https://github.com/isaacs/minimatch) for more details. + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instanting 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} 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. +* `error` The error encountered. When an error is encountered, the + glob object is in an undefined state, and should be discarded. +* `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. +* `statCache` Collection of all the stat results the glob search + performed. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `1` - Path exists, and is not a directory + * `2` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` + +### 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 matched. +* `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 + +* `abort` Stop the search. + +### 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. + +* `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. It will cause + ELOOP to be triggered one level sooner in the case of cyclical + symbolic links. +* `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.) +* `sync` Perform a synchronous glob search. +* `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). +* `nocase` Perform a case-insensitive match. Note that case-insensitive + filesystems will sometimes result in glob returning results that are + case-insensitively matched anyway, since readdir and stat will not + raise an error. +* `debug` Set to enable debug logging in minimatch and glob. +* `globDebug` Set to enable debug logging in glob, but not minimatch. + +## 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. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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. + +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. + +## 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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/g.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/g.js new file mode 100644 index 00000000..be122df0 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/g.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "test/a/**/[cg]/../[cg]" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/usr-local.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/usr-local.js new file mode 100644 index 00000000..327a425e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/examples/usr-local.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "{./*/*,/*,/usr/local/*}" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/glob.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/glob.js new file mode 100644 index 00000000..f0118a4f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/glob.js @@ -0,0 +1,675 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern) +// 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. +// readdir(PREFIX) as ENTRIES +// If fails, END +// 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 .. $]) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $]) +// +// 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("graceful-fs") +, minimatch = require("minimatch") +, Minimatch = minimatch.Minimatch +, inherits = require("inherits") +, EE = require("events").EventEmitter +, path = require("path") +, isDir = {} +, assert = require("assert").ok + +function glob (pattern, options, cb) { + if (typeof options === "function") cb = options, options = {} + if (!options) options = {} + + if (typeof options === "number") { + deprecated() + return + } + + var g = new Glob(pattern, options, cb) + return g.sync ? g.found : g +} + +glob.fnmatch = deprecated + +function deprecated () { + throw new Error("glob's interface has changed. Please see the docs.") +} + +glob.sync = globSync +function globSync (pattern, options) { + if (typeof options === "number") { + deprecated() + return + } + + options = options || {} + options.sync = true + return glob(pattern, options) +} + + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (!(this instanceof Glob)) { + return new Glob(pattern, options, cb) + } + + if (typeof cb === "function") { + this.on("error", cb) + this.on("end", function (matches) { + cb(null, matches) + }) + } + + options = options || {} + + this.EOF = {} + this._emitQueue = [] + + this.maxDepth = options.maxDepth || 1000 + this.maxLength = options.maxLength || Infinity + this.cache = options.cache || {} + this.statCache = options.statCache || {} + + this.changedCwd = false + var cwd = process.cwd() + if (!options.hasOwnProperty("cwd")) this.cwd = cwd + else { + this.cwd = options.cwd + this.changedCwd = path.resolve(options.cwd) !== cwd + } + + this.root = options.root || path.resolve(this.cwd, "/") + this.root = path.resolve(this.root) + if (process.platform === "win32") + this.root = this.root.replace(/\\/g, "/") + + this.nomount = !!options.nomount + + if (!pattern) { + throw new Error("must provide pattern") + } + + // 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 + } + + this.strict = options.strict !== false + this.dot = !!options.dot + this.mark = !!options.mark + this.sync = !!options.sync + this.nounique = !!options.nounique + this.nonull = !!options.nonull + this.nosort = !!options.nosort + this.nocase = !!options.nocase + this.stat = !!options.stat + + this.debug = !!options.debug || !!options.globDebug + if (this.debug) + this.log = console.error + + this.silent = !!options.silent + + var mm = this.minimatch = new Minimatch(pattern, options) + this.options = mm.options + pattern = this.pattern = mm.pattern + + this.error = null + this.aborted = false + + // list of all the patterns that ** has resolved do, so + // we can avoid visiting multiple times. + this._globstars = {} + + EE.call(this) + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: 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) + + this.minimatch.set.forEach(iterator.bind(this)) + function iterator (pattern, i, set) { + this._process(pattern, 0, i, function (er) { + if (er) this.emit("error", er) + if (-- n <= 0) this._finish() + }) + } +} + +Glob.prototype.log = function () {} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + + var nou = this.nounique + , all = nou ? [] : {} + + for (var i = 0, l = this.matches.length; i < l; i ++) { + var matches = this.matches[i] + this.log("matches[%d] =", i, matches) + // do like the shell, and spit out the literal glob + if (!matches) { + if (this.nonull) { + var literal = this.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 (!this.nosort) { + all = all.sort(this.nocase ? alphasorti : alphasort) + } + + if (this.mark) { + // at *some* point we statted all of these + all = all.map(function (m) { + var sc = this.cache[m] + if (!sc) + return m + var isDir = (Array.isArray(sc) || sc === 2) + if (isDir && m.slice(-1) !== "/") { + return m + "/" + } + if (!isDir && m.slice(-1) === "/") { + return m.replace(/\/+$/, "") + } + return m + }, this) + } + + this.log("emitting end", all) + + this.EOF = this.found = all + this.emitMatch(this.EOF) +} + +function alphasorti (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return alphasort(a, b) +} + +function alphasort (a, b) { + return a > b ? 1 : a < b ? -1 : 0 +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit("abort") +} + +Glob.prototype.pause = function () { + if (this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = true + this.emit("pause") +} + +Glob.prototype.resume = function () { + if (!this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = false + this.emit("resume") + this._processEmitQueue() + //process.nextTick(this.emit.bind(this, "resume")) +} + +Glob.prototype.emitMatch = function (m) { + if (!this.stat || this.statCache[m] || m === this.EOF) { + this._emitQueue.push(m) + this._processEmitQueue() + } else { + this._stat(m, function(exists, isDir) { + if (exists) { + this._emitQueue.push(m) + this._processEmitQueue() + } + }) + } +} + +Glob.prototype._processEmitQueue = function (m) { + while (!this._processingEmitQueue && + !this.paused) { + this._processingEmitQueue = true + var m = this._emitQueue.shift() + if (!m) { + this._processingEmitQueue = false + break + } + + this.log('emit!', m === this.EOF ? "end" : "match") + + this.emit(m === this.EOF ? "end" : "match", m) + this._processingEmitQueue = false + } +} + +Glob.prototype._process = function (pattern, depth, index, cb_) { + assert(this instanceof Glob) + + var cb = function cb (er, res) { + assert(this instanceof Glob) + if (this.paused) { + if (!this._processQueue) { + this._processQueue = [] + this.once("resume", function () { + var q = this._processQueue + this._processQueue = null + q.forEach(function (cb) { cb() }) + }) + } + this._processQueue.push(cb_.bind(this, er, res)) + } else { + cb_.call(this, er, res) + } + }.bind(this) + + if (this.aborted) return cb() + + if (depth > this.maxDepth) return cb() + + // 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: + prefix = pattern.join("/") + this._stat(prefix, function (exists, isDir) { + // either it's there, or it isn't. + // nothing more to do, either way. + if (exists) { + if (prefix && isAbsolute(prefix) && !this.nomount) { + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + } + } + + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][prefix] = true + this.emitMatch(prefix) + } + return 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) + prefix = prefix.join("/") + break + } + + // get the list of entries. + var read + if (prefix === null) read = "." + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) { + prefix = path.join("/", prefix) + } + read = prefix = path.resolve(prefix) + + // if (process.platform === "win32") + // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/") + + this.log('absolute: ', prefix, this.root, pattern, read) + } else { + read = prefix + } + + this.log('readdir(%j)', read, this.cwd, this.root) + + return this._readdir(read, function (er, entries) { + if (er) { + // not a directory! + // this means that, whatever else comes after this, it can never match + return cb() + } + + // globstar is special + if (pattern[n] === minimatch.GLOBSTAR) { + // test without the globstar, and with every child both below + // and replacing the globstar. + var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ] + entries.forEach(function (e) { + if (e.charAt(0) === "." && !this.dot) return + // instead of the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))) + // below the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n))) + }, this) + + s = s.filter(function (pattern) { + var key = gsKey(pattern) + var seen = !this._globstars[key] + this._globstars[key] = true + return seen + }, this) + + if (!s.length) + return cb() + + // now asyncForEach over this + var l = s.length + , errState = null + s.forEach(function (gsPattern) { + this._process(gsPattern, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l <= 0) return cb() + }) + }, this) + + return + } + + // not a globstar + // 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 = pattern[n] + var rawGlob = pattern[n]._glob + , dotOk = this.dot || rawGlob.charAt(0) === "." + + entries = entries.filter(function (e) { + return (e.charAt(0) !== "." || dotOk) && + e.match(pattern[n]) + }) + + // If n === pattern.length - 1, then there's no need for the extra stat + // *unless* the user has specified "mark" or "stat" explicitly. + // We know that they exist, since the readdir returned them. + if (n === pattern.length - 1 && + !this.mark && + !this.stat) { + entries.forEach(function (e) { + if (prefix) { + if (prefix !== "/") e = prefix + "/" + e + else e = prefix + e + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e) + } + + if (process.platform === "win32") + e = e.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][e] = true + this.emitMatch(e) + }, this) + return cb.call(this) + } + + + // now test all the remaining entries as stand-ins for that part + // of the pattern. + var l = entries.length + , errState = null + if (l === 0) return cb() // no matches possible + entries.forEach(function (e) { + var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)) + this._process(p, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l === 0) return cb.call(this) + }) + }, this) + }) + +} + +function gsKey (pattern) { + return '**' + pattern.map(function (p) { + return (p === minimatch.GLOBSTAR) ? '**' : (''+p) + }).join('/') +} + +Glob.prototype._stat = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterStat(f, abs, cb, er) + } + + this.log('stat', [this.cwd, f, '=', abs]) + + if (!this.stat && this.cache.hasOwnProperty(f)) { + var exists = this.cache[f] + , isDir = exists && (Array.isArray(exists) || exists === 2) + if (this.sync) return cb.call(this, !!exists, isDir) + return process.nextTick(cb.bind(this, !!exists, isDir)) + } + + var stat = this.statCache[abs] + if (this.sync || stat) { + var er + try { + stat = fs.statSync(abs) + } catch (e) { + er = e + } + this._afterStat(f, abs, cb, er, stat) + } else { + fs.stat(abs, this._afterStat.bind(this, f, abs, cb)) + } +} + +Glob.prototype._afterStat = function (f, abs, cb, er, stat) { + var exists + assert(this instanceof Glob) + + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) { + this.log("should be ENOTDIR, fake it") + + er = new Error("ENOTDIR, not a directory '" + abs + "'") + er.path = abs + er.code = "ENOTDIR" + stat = null + } + + var emit = !this.statCache[abs] + this.statCache[abs] = stat + + if (er || !stat) { + exists = false + } else { + exists = stat.isDirectory() ? 2 : 1 + if (emit) + this.emit('stat', f, stat) + } + this.cache[f] = this.cache[f] || exists + cb.call(this, !!exists, exists === 2) +} + +Glob.prototype._readdir = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (isAbsolute(f)) { + abs = f + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterReaddir(f, abs, cb, er) + } + + this.log('readdir', [this.cwd, f, abs]) + if (this.cache.hasOwnProperty(f)) { + var c = this.cache[f] + if (Array.isArray(c)) { + if (this.sync) return cb.call(this, null, c) + return process.nextTick(cb.bind(this, null, c)) + } + + if (!c || c === 1) { + // either ENOENT or ENOTDIR + var code = c ? "ENOTDIR" : "ENOENT" + , er = new Error((c ? "Not a directory" : "Not found") + ": " + f) + er.path = f + er.code = code + this.log(f, er) + if (this.sync) return cb.call(this, er) + return process.nextTick(cb.bind(this, er)) + } + + // at this point, c === 2, meaning it's a dir, but we haven't + // had to read it yet, or c === true, meaning it's *something* + // but we don't have any idea what. Need to read it, either way. + } + + if (this.sync) { + var er, entries + try { + entries = fs.readdirSync(abs) + } catch (e) { + er = e + } + return this._afterReaddir(f, abs, cb, er, entries) + } + + fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb)) +} + +Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) { + assert(this instanceof Glob) + if (entries && !er) { + this.cache[f] = entries + // if we haven't asked to stat everything for suresies, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. This also gets us one step + // further into ELOOP territory. + if (!this.mark && !this.stat) { + entries.forEach(function (e) { + if (f === "/") e = f + e + else e = f + "/" + e + this.cache[e] = true + }, this) + } + + return cb.call(this, er, entries) + } + + // now handle errors, and cache the information + if (er) switch (er.code) { + case "ENOTDIR": // totally normal. means it *does* exist. + this.cache[f] = 1 + return cb.call(this, er) + case "ENOENT": // not terribly unusual + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[f] = false + return cb.call(this, er) + default: // some unusual error. Treat as failure. + this.cache[f] = false + if (this.strict) this.emit("error", er) + if (!this.silent) console.error("glob error", er) + return cb.call(this, er) + } +} + +var isAbsolute = process.platform === "win32" ? absWin : absUnix + +function absWin (p) { + if (absUnix(p)) return true + // pull off the device/UNC bit from a windows path. + // from node's lib/path.js + var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ + , result = splitDeviceRe.exec(p) + , device = result[1] || '' + , isUnc = device && device.charAt(1) !== ':' + , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute + + return isAbsolute +} + +function absUnix (p) { + return p.charAt(0) === "/" || p === "" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md new file mode 100644 index 00000000..eb1a1093 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md @@ -0,0 +1,26 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over fs module + +graceful-fs: + +* Queues up `open` and `readdir` calls, and retries them once + something closes if there is an EMFILE error from too many file + descriptors. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 00000000..1865f92c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,159 @@ +// Monkey-patching the fs module. +// It's ugly, but there is simply no other way to do this. +var fs = module.exports = require('fs') + +var assert = require('assert') + +// fix up some busted stuff, mostly on windows and old nodes +require('./polyfills.js') + +// The EMFILE enqueuing stuff + +var util = require('util') + +function noop () {} + +var debug = noop +var util = require('util') +if (util.debuglog) + debug = util.debuglog('gfs') +else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') + console.error(m) + } + +if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug('fds', fds) + debug(queue) + assert.equal(queue.length, 0) + }) +} + + +var originalOpen = fs.open +fs.open = open + +function open(path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + new OpenReq(path, flags, mode, cb) +} + +function OpenReq(path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb + Req.call(this) +} + +util.inherits(OpenReq, Req) + +OpenReq.prototype.process = function() { + originalOpen.call(fs, this.path, this.flags, this.mode, this.done) +} + +var fds = {} +OpenReq.prototype.done = function(er, fd) { + debug('open done', er, fd) + if (fd) + fds['fd' + fd] = this.path + Req.prototype.done.call(this, er, fd) +} + + +var originalReaddir = fs.readdir +fs.readdir = readdir + +function readdir(path, cb) { + if (typeof cb !== "function") cb = noop + new ReaddirReq(path, cb) +} + +function ReaddirReq(path, cb) { + this.path = path + this.cb = cb + Req.call(this) +} + +util.inherits(ReaddirReq, Req) + +ReaddirReq.prototype.process = function() { + originalReaddir.call(fs, this.path, this.done) +} + +ReaddirReq.prototype.done = function(er, files) { + Req.prototype.done.call(this, er, files) + onclose() +} + + +var originalClose = fs.close +fs.close = close + +function close (fd, cb) { + debug('close', fd) + if (typeof cb !== "function") cb = noop + delete fds['fd' + fd] + originalClose.call(fs, fd, function(er) { + onclose() + cb(er) + }) +} + + +var originalCloseSync = fs.closeSync +fs.closeSync = closeSync + +function closeSync (fd) { + try { + return originalCloseSync(fd) + } finally { + onclose() + } +} + + +// Req class +function Req () { + // start processing + this.done = this.done.bind(this) + this.failures = 0 + this.process() +} + +Req.prototype.done = function (er, result) { + var tryAgain = false + if (er) { + var code = er.code + var tryAgain = code === "EMFILE" + if (process.platform === "win32") + tryAgain = tryAgain || code === "OK" + } + + if (tryAgain) { + this.failures ++ + enqueue(this) + } else { + var cb = this.cb + cb(er, result) + } +} + +var queue = [] + +function enqueue(req) { + queue.push(req) + debug('enqueue %d %s', queue.length, req.constructor.name, req) +} + +function onclose() { + var req = queue.shift() + if (req) { + debug('process', req.constructor.name, req) + req.process() + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json new file mode 100644 index 00000000..ea5a208a --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json @@ -0,0 +1,49 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "2.0.1", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over fs module\n\ngraceful-fs:\n\n* Queues up `open` and `readdir` calls, and retries them once\n something closes if there is an EMFILE error from too many file\n descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs", + "_id": "graceful-fs@2.0.1", + "_from": "graceful-fs@~2.0.0" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js new file mode 100644 index 00000000..afc83b3f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js @@ -0,0 +1,228 @@ +var fs = require('fs') +var constants = require('constants') + +var origCwd = process.cwd +var cwd = null +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} + +// (re-)implement some things that are known busted or missing. + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +function chownErOk (er) { + // if there's no getuid, or if getuid() is something other than 0, + // and the error is EINVAL or EPERM, then just ignore it. + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // When running as root, or if other types of errors are encountered, + // then it's strict. + if (!er || (!process.getuid || process.getuid() !== 0) + && (er.code === "EINVAL" || er.code === "EPERM")) return true +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js new file mode 100644 index 00000000..104f36b0 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js @@ -0,0 +1,39 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is monkeypatched fs', function (t) { + t.equal(fs, require('fs')) + t.end() +}) + +test('open an existing file works', function (t) { + var fd = fs.openSync(__filename, 'r') + fs.closeSync(fd) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + fs.close(fd, function (er) { + if (er) throw er + t.pass('works') + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.end() + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE new file mode 100644 index 00000000..dea3013d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md new file mode 100644 index 00000000..b1c56658 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js new file mode 100644 index 00000000..29f5e24f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js new file mode 100644 index 00000000..c1e78a75 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json new file mode 100644 index 00000000..5bf0db56 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json @@ -0,0 +1,33 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "homepage": "https://github.com/isaacs/inherits", + "_id": "inherits@2.0.1", + "_from": "inherits@2" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js new file mode 100644 index 00000000..fc53012d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md new file mode 100644 index 00000000..978268e2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md @@ -0,0 +1,218 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +Eventually, it will replace the C binding in node-glob. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instanting the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +## Functions + +The top-level exported function has a `cache` property, which is an LRU +cache set to store 100 items. So, calling these methods repeatedly +with the same pattern and options will use the same Minimatch object, +saving the cost of parsing it multiple times. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself. When set, an empty list is returned if there are +no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js new file mode 100644 index 00000000..c633f89f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js @@ -0,0 +1,1055 @@ +;(function (require, exports, module, platform) { + +if (module) module.exports = minimatch +else exports.minimatch = minimatch + +if (!require) { + require = function (id) { + switch (id) { + case "sigmund": return function sigmund (obj) { + return JSON.stringify(obj) + } + case "path": return { basename: function (f) { + f = f.split(/[\/\\]/) + var e = f.pop() + if (!e) e = f.pop() + return e + }} + case "lru-cache": return function LRUCache () { + // not quite an LRU, but still space-limited. + var cache = {} + var cnt = 0 + this.set = function (k, v) { + cnt ++ + if (cnt >= 100) cache = {} + cache[k] = v + } + this.get = function (k) { return cache[k] } + } + } + } +} + +minimatch.Minimatch = Minimatch + +var LRU = require("lru-cache") + , cache = minimatch.cache = new LRU({max: 100}) + , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} + , sigmund = require("sigmund") + +var path = require("path") + // any single thing other than / + // don't need to escape / when using new RegExp() + , qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" + + // characters that need to be escaped in RegExp. + , reSpecials = charSet("().*{}+?[]^$\\!") + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split("").reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + + +function minimatch (p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + return false + } + + // "" only matches "" + if (pattern.trim() === "") return p === "" + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options, cache) + } + + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + pattern = pattern.split("\\").join("/") + } + + // lru storage. + // these things aren't particularly big, but walking down the string + // and turning it into a regexp can get pretty costly. + var cacheKey = pattern + "\n" + sigmund(options) + var cached = minimatch.cache.get(cacheKey) + if (cached) return cached + minimatch.cache.set(cacheKey, this) + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function() {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return -1 === s.indexOf(false) + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + , negate = false + , options = this.options + , negateOffset = 0 + + if (options.nonegate) return + + for ( var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === "!" + ; i ++) { + negate = !negate + negateOffset ++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return new Minimatch(pattern, options).braceExpand() +} + +Minimatch.prototype.braceExpand = braceExpand +function braceExpand (pattern, options) { + options = options || this.options + pattern = typeof pattern === "undefined" + ? this.pattern : pattern + + if (typeof pattern === "undefined") { + throw new Error("undefined pattern") + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + var escaping = false + + // examples and comments refer to this crazy pattern: + // a{b,c{d,e},{f,g}h}x{y,z} + // expected: + // abxy + // abxz + // acdxy + // acdxz + // acexy + // acexz + // afhxy + // afhxz + // aghxy + // aghxz + + // everything before the first \{ is just a prefix. + // So, we pluck that off, and work with the rest, + // and then prepend it to everything we find. + if (pattern.charAt(0) !== "{") { + this.debug(pattern) + var prefix = null + for (var i = 0, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug(i, c) + if (c === "\\") { + escaping = !escaping + } else if (c === "{" && !escaping) { + prefix = pattern.substr(0, i) + break + } + } + + // actually no sets, all { were escaped. + if (prefix === null) { + this.debug("no sets") + return [pattern] + } + + var tail = braceExpand.call(this, pattern.substr(i), options) + return tail.map(function (t) { + return prefix + t + }) + } + + // now we have something like: + // {b,c{d,e},{f,g}h}x{y,z} + // walk through the set, expanding each part, until + // the set ends. then, we'll expand the suffix. + // If the set only has a single member, then'll put the {} back + + // first, handle numeric sets, since they're easier + var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) + if (numset) { + this.debug("numset", numset[1], numset[2]) + var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) + , start = +numset[1] + , end = +numset[2] + , inc = start > end ? -1 : 1 + , set = [] + for (var i = start; i != (end + inc); i += inc) { + // append all the suffixes + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + set.push(i + suf[ii]) + } + } + return set + } + + // ok, walk through the set + // We hope, somewhat optimistically, that there + // will be a } at the end. + // If the closing brace isn't found, then the pattern is + // interpreted as braceExpand("\\" + pattern) so that + // the leading \{ will be interpreted literally. + var i = 1 // skip the \{ + , depth = 1 + , set = [] + , member = "" + , sawEnd = false + , escaping = false + + function addMember () { + set.push(member) + member = "" + } + + this.debug("Entering for") + FOR: for (i = 1, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug("", i, c) + + if (escaping) { + escaping = false + member += "\\" + c + } else { + switch (c) { + case "\\": + escaping = true + continue + + case "{": + depth ++ + member += "{" + continue + + case "}": + depth -- + // if this closes the actual set, then we're done + if (depth === 0) { + addMember() + // pluck off the close-brace + i ++ + break FOR + } else { + member += c + continue + } + + case ",": + if (depth === 1) { + addMember() + } else { + member += c + } + continue + + default: + member += c + continue + } // switch + } // else + } // for + + // now we've either finished the set, and the suffix is + // pattern.substr(i), or we have *not* closed the set, + // and need to escape the leading brace + if (depth !== 0) { + this.debug("didn't close", pattern) + return braceExpand.call(this, "\\" + pattern, options) + } + + // x{y,z} -> ["xy", "xz"] + this.debug("set", set) + this.debug("suffix", pattern.substr(i)) + var suf = braceExpand.call(this, pattern.substr(i), options) + // ["b", "c{d,e}","{f,g}h"] -> + // [["b"], ["cd", "ce"], ["fh", "gh"]] + var addBraces = set.length === 1 + this.debug("set pre-expanded", set) + set = set.map(function (p) { + return braceExpand.call(this, p, options) + }, this) + this.debug("set expanded", set) + + + // [["b"], ["cd", "ce"], ["fh", "gh"]] -> + // ["b", "cd", "ce", "fh", "gh"] + set = set.reduce(function (l, r) { + return l.concat(r) + }) + + if (addBraces) { + set = set.map(function (s) { + return "{" + s + "}" + }) + } + + // now attach the suffixes. + var ret = [] + for (var i = 0, l = set.length; i < l; i ++) { + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + ret.push(set[i] + suf[ii]) + } + } + return ret +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === "**") return GLOBSTAR + if (pattern === "") return "" + + var re = "" + , hasMagic = !!options.nocase + , escaping = false + // ? => one single character + , patternListStack = [] + , plType + , stateChar + , inClass = false + , reClassStart = -1 + , classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + , patternStart = pattern.charAt(0) === "." ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" + : "(?!\\.)" + , self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case "*": + re += star + hasMagic = true + break + case "?": + re += qmark + hasMagic = true + break + default: + re += "\\"+stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for ( var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i ++ ) { + + this.debug("%s\t%s %s %j", pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += "\\" + c + escaping = false + continue + } + + SWITCH: switch (c) { + case "/": + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case "\\": + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === "!" && i === classStart + 1) c = "^" + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case "(": + if (inClass) { + re += "(" + continue + } + + if (!stateChar) { + re += "\\(" + continue + } + + plType = stateChar + patternListStack.push({ type: plType + , start: i - 1 + , reStart: re.length }) + // negation is (?:(?!js)[^/]*) + re += stateChar === "!" ? "(?:(?!" : "(?:" + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ")": + if (inClass || !patternListStack.length) { + re += "\\)" + continue + } + + clearStateChar() + hasMagic = true + re += ")" + plType = patternListStack.pop().type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case "!": + re += "[^/]*?)" + break + case "?": + case "+": + case "*": re += plType + case "@": break // the default anyway + } + continue + + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|" + escaping = false + continue + } + + clearStateChar() + re += "|" + continue + + // these are mostly the same in regexp and glob + case "[": + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += "\\" + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case "]": + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += "\\" + c + escaping = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === "^" && inClass)) { + re += "\\" + } + + re += c + + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + var cs = pattern.substr(classStart + 1) + , sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + "\\[" + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + var pl + while (pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = "\\" + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + "|" + }) + + this.debug("tail=%j\n %s", tail, tail) + var t = pl.type === "*" ? star + : pl.type === "?" ? qmark + : "\\" + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + + t + "\\(" + + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += "\\\\" + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case ".": + case "[": + case "(": addPatternStart = true + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== "" && hasMagic) re = "(?=.)" + re + + if (addPatternStart) re = patternStart + re + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [ re, hasMagic ] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? "i" : "" + , regExp = new RegExp("^" + re + "$", flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) return this.regexp = false + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + , flags = options.nocase ? "i" : "" + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === "string") ? regExpEscape(p) + : p._src + }).join("\\\/") + }).join("|") + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$" + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$" + + try { + return this.regexp = new RegExp(re, flags) + } catch (ex) { + return this.regexp = false + } +} + +minimatch.match = function (list, pattern, options) { + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === "" + + if (f === "/" && partial) return true + + var options = this.options + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + f = f.split("\\").join("/") + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, "split", f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, "set", set) + + var splitFile = path.basename(f.join("/")).split("/") + + for (var i = 0, l = set.length; i < l; i ++) { + var pattern = set[i], file = f + if (options.matchBase && pattern.length === 1) { + file = splitFile + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug("matchOne", + { "this": this + , file: file + , pattern: pattern }) + + this.debug("matchOne", file.length, pattern.length) + + for ( var fi = 0 + , pi = 0 + , fl = file.length + , pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi ++, pi ++ ) { + + this.debug("matchOne loop") + var p = pattern[pi] + , f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + , pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for ( ; fi < fl; fi ++) { + if (file[fi] === "." || file[fi] === ".." || + (!options.dot && file[fi].charAt(0) === ".")) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + WHILE: while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', + file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === "." || swallowee === ".." || + (!options.dot && swallowee.charAt(0) === ".")) { + this.debug("dot detected!", file, fr, pattern, pr) + break WHILE + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr ++ + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug("string match", p, f, hit) + } else { + hit = f.match(p) + this.debug("pattern match", p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") + return emptyFileEnd + } + + // should be unreachable. + throw new Error("wtf?") +} + + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, "$1") +} + + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") +} + +})( typeof require === "function" ? require : null, + this, + typeof module === "object" ? module : null, + typeof process === "object" ? process.platform : "win32" + ) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS new file mode 100644 index 00000000..4a0bc503 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS @@ -0,0 +1,14 @@ +# Authors, sorted by whether or not they are me +Isaac Z. Schlueter +Brian Cottingham +Carlos Brito Lage +Jesse Dailey +Kevin O'Hara +Marco Rogers +Mark Cavage +Marko Mikulicic +Nathan Rajlich +Satheesh Natesan +Trent Mick +ashleybrener +n4kz diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md new file mode 100644 index 00000000..03ee0f98 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md @@ -0,0 +1,97 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n) { return n * 2 } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = LRU(options) + , otherCache = LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n){return n.length}`. The default is + `function(n){return 1}`, which is fine if you want to store `n` + like-sized things. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. + +## API + +* `set(key, value)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js new file mode 100644 index 00000000..d1d13817 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -0,0 +1,252 @@ +;(function () { // closure for web browsers + +if (typeof module === 'object' && module.exports) { + module.exports = LRUCache +} else { + // just set the global for non-node platforms. + this.LRUCache = LRUCache +} + +function hOP (obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key) +} + +function naiveLength () { return 1 } + +function LRUCache (options) { + if (!(this instanceof LRUCache)) + return new LRUCache(options) + + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + this._max = options.max + // Kind of weird to have a default max of Infinity, but oh well. + if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) + this._max = Infinity + + this._lengthCalculator = options.length || naiveLength + if (typeof this._lengthCalculator !== "function") + this._lengthCalculator = naiveLength + + this._allowStale = options.stale || false + this._maxAge = options.maxAge || null + this._dispose = options.dispose + this.reset() +} + +// resize the cache when the max changes. +Object.defineProperty(LRUCache.prototype, "max", + { set : function (mL) { + if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity + this._max = mL + if (this._length > this._max) trim(this) + } + , get : function () { return this._max } + , enumerable : true + }) + +// resize the cache when the lengthCalculator changes. +Object.defineProperty(LRUCache.prototype, "lengthCalculator", + { set : function (lC) { + if (typeof lC !== "function") { + this._lengthCalculator = naiveLength + this._length = this._itemCount + for (var key in this._cache) { + this._cache[key].length = 1 + } + } else { + this._lengthCalculator = lC + this._length = 0 + for (var key in this._cache) { + this._cache[key].length = this._lengthCalculator(this._cache[key].value) + this._length += this._cache[key].length + } + } + + if (this._length > this._max) trim(this) + } + , get : function () { return this._lengthCalculator } + , enumerable : true + }) + +Object.defineProperty(LRUCache.prototype, "length", + { get : function () { return this._length } + , enumerable : true + }) + + +Object.defineProperty(LRUCache.prototype, "itemCount", + { get : function () { return this._itemCount } + , enumerable : true + }) + +LRUCache.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + var i = 0; + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + i++ + var hit = this._lruList[k] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + del(this, hit) + if (!this._allowStale) hit = undefined + } + if (hit) { + fn.call(thisp, hit.value, hit.key, this) + } + } +} + +LRUCache.prototype.keys = function () { + var keys = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + keys[i++] = hit.key + } + return keys +} + +LRUCache.prototype.values = function () { + var values = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + values[i++] = hit.value + } + return values +} + +LRUCache.prototype.reset = function () { + if (this._dispose && this._cache) { + for (var k in this._cache) { + this._dispose(k, this._cache[k].value) + } + } + + this._cache = Object.create(null) // hash of items by key + this._lruList = Object.create(null) // list of items in order of use recency + this._mru = 0 // most recently used + this._lru = 0 // least recently used + this._length = 0 // number of items in the list + this._itemCount = 0 +} + +// Provided for debugging/dev purposes only. No promises whatsoever that +// this API stays stable. +LRUCache.prototype.dump = function () { + return this._cache +} + +LRUCache.prototype.dumpLru = function () { + return this._lruList +} + +LRUCache.prototype.set = function (key, value) { + if (hOP(this._cache, key)) { + // dispose of the old one before overwriting + if (this._dispose) this._dispose(key, this._cache[key].value) + if (this._maxAge) this._cache[key].now = Date.now() + this._cache[key].value = value + this.get(key) + return true + } + + var len = this._lengthCalculator(value) + var age = this._maxAge ? Date.now() : 0 + var hit = new Entry(key, value, this._mru++, len, age) + + // oversized objects fall out of cache automatically. + if (hit.length > this._max) { + if (this._dispose) this._dispose(key, value) + return false + } + + this._length += hit.length + this._lruList[hit.lu] = this._cache[key] = hit + this._itemCount ++ + + if (this._length > this._max) trim(this) + return true +} + +LRUCache.prototype.has = function (key) { + if (!hOP(this._cache, key)) return false + var hit = this._cache[key] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + return false + } + return true +} + +LRUCache.prototype.get = function (key) { + return get(this, key, true) +} + +LRUCache.prototype.peek = function (key) { + return get(this, key, false) +} + +LRUCache.prototype.pop = function () { + var hit = this._lruList[this._lru] + del(this, hit) + return hit || null +} + +LRUCache.prototype.del = function (key) { + del(this, this._cache[key]) +} + +function get (self, key, doUse) { + var hit = self._cache[key] + if (hit) { + if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + del(self, hit) + if (!self._allowStale) hit = undefined + } else { + if (doUse) use(self, hit) + } + if (hit) hit = hit.value + } + return hit +} + +function use (self, hit) { + shiftLU(self, hit) + hit.lu = self._mru ++ + self._lruList[hit.lu] = hit +} + +function trim (self) { + while (self._lru < self._mru && self._length > self._max) + del(self, self._lruList[self._lru]) +} + +function shiftLU (self, hit) { + delete self._lruList[ hit.lu ] + while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ +} + +function del (self, hit) { + if (hit) { + if (self._dispose) self._dispose(hit.key, hit.value) + self._length -= hit.length + self._itemCount -- + delete self._cache[ hit.key ] + shiftLU(self, hit) + } +} + +// classy, since V8 prefers predictable objects. +function Entry (key, value, lu, length, now) { + this.key = key + this.value = value + this.lu = lu + this.length = length + this.now = now +} + +})() diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json new file mode 100644 index 00000000..4472725d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json @@ -0,0 +1,33 @@ +{ + "name": "lru-cache", + "description": "A cache object that deletes the least-recently-used items.", + "version": "2.5.0", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "scripts": { + "test": "tap test --gc" + }, + "main": "lib/lru-cache.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "devDependencies": { + "tap": "", + "weak": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" + }, + "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "homepage": "https://github.com/isaacs/node-lru-cache", + "_id": "lru-cache@2.5.0", + "_from": "lru-cache@2" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js new file mode 100644 index 00000000..f72697c4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -0,0 +1,369 @@ +var test = require("tap").test + , LRU = require("../") + +test("basic", function (t) { + var cache = new LRU({max: 10}) + cache.set("key", "value") + t.equal(cache.get("key"), "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.length, 1) + t.equal(cache.max, 10) + t.end() +}) + +test("least recently set", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.get("a") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), "A") + t.end() +}) + +test("del", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.del("a") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("max", function (t) { + var cache = new LRU(3) + + // test changing the max, verify that the LRU items get dropped. + cache.max = 100 + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + + // now remove the max restriction, and try again. + cache.max = "hello" + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + // should trigger an immediate resize + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + t.end() +}) + +test("reset", function (t) { + var cache = new LRU(10) + cache.set("a", "A") + cache.set("b", "B") + cache.reset() + t.equal(cache.length, 0) + t.equal(cache.max, 10) + t.equal(cache.get("a"), undefined) + t.equal(cache.get("b"), undefined) + t.end() +}) + + +// Note: `.dump()` is a debugging tool only. No guarantees are made +// about the format/layout of the response. +test("dump", function (t) { + var cache = new LRU(10) + var d = cache.dump(); + t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") + cache.set("a", "A") + var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } + t.ok(d.a) + t.equal(d.a.key, "a") + t.equal(d.a.value, "A") + t.equal(d.a.lu, 0) + + cache.set("b", "B") + cache.get("b") + d = cache.dump() + t.ok(d.b) + t.equal(d.b.key, "b") + t.equal(d.b.value, "B") + t.equal(d.b.lu, 2) + + t.end() +}) + + +test("basic with weighed length", function (t) { + var cache = new LRU({ + max: 100, + length: function (item) { return item.size } + }) + cache.set("key", {val: "value", size: 50}) + t.equal(cache.get("key").val, "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.lengthCalculator(cache.get("key")), 50) + t.equal(cache.length, 50) + t.equal(cache.max, 100) + t.end() +}) + + +test("weighed length item too large", function (t) { + var cache = new LRU({ + max: 10, + length: function (item) { return item.size } + }) + t.equal(cache.max, 10) + + // should fall out immediately + cache.set("key", {val: "value", size: 50}) + + t.equal(cache.length, 0) + t.equal(cache.get("key"), undefined) + t.end() +}) + +test("least recently set with weighed length", function (t) { + var cache = new LRU({ + max:8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.set("d", "DDDD") + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("c"), "CCC") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten with weighed length", function (t) { + var cache = new LRU({ + max: 8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.get("a") + cache.get("b") + cache.set("d", "DDDD") + t.equal(cache.get("c"), undefined) + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("b"), "BB") + t.equal(cache.get("a"), "A") + t.end() +}) + +test("set returns proper booleans", function(t) { + var cache = new LRU({ + max: 5, + length: function (item) { return item.length } + }) + + t.equal(cache.set("a", "A"), true) + + // should return false for max exceeded + t.equal(cache.set("b", "donuts"), false) + + t.equal(cache.set("b", "B"), true) + t.equal(cache.set("c", "CCCC"), true) + t.end() +}) + +test("drop the old items", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A") + + setTimeout(function () { + cache.set("b", "b") + t.equal(cache.get("a"), "A") + }, 25) + + setTimeout(function () { + cache.set("c", "C") + // timed out + t.notOk(cache.get("a")) + }, 60) + + setTimeout(function () { + t.notOk(cache.get("b")) + t.equal(cache.get("c"), "C") + }, 90) + + setTimeout(function () { + t.notOk(cache.get("c")) + t.end() + }, 155) +}) + +test("disposal function", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + dispose: function (k, n) { + disposed = n + } + }) + + cache.set(1, 1) + cache.set(2, 2) + t.equal(disposed, 1) + cache.set(3, 3) + t.equal(disposed, 2) + cache.reset() + t.equal(disposed, 3) + t.end() +}) + +test("disposal function on too big of item", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + length: function (k) { + return k.length + }, + dispose: function (k, n) { + disposed = n + } + }) + var obj = [ 1, 2 ] + + t.equal(disposed, false) + cache.set("obj", obj) + t.equal(disposed, obj) + t.end() +}) + +test("has()", function(t) { + var cache = new LRU({ + max: 1, + maxAge: 10 + }) + + cache.set('foo', 'bar') + t.equal(cache.has('foo'), true) + cache.set('blu', 'baz') + t.equal(cache.has('foo'), false) + t.equal(cache.has('blu'), true) + setTimeout(function() { + t.equal(cache.has('blu'), false) + t.end() + }, 15) +}) + +test("stale", function(t) { + var cache = new LRU({ + maxAge: 10, + stale: true + }) + + cache.set('foo', 'bar') + t.equal(cache.get('foo'), 'bar') + t.equal(cache.has('foo'), true) + setTimeout(function() { + t.equal(cache.has('foo'), false) + t.equal(cache.get('foo'), 'bar') + t.equal(cache.get('foo'), undefined) + t.end() + }, 15) +}) + +test("lru update via set", function(t) { + var cache = LRU({ max: 2 }); + + cache.set('foo', 1); + cache.set('bar', 2); + cache.del('bar'); + cache.set('baz', 3); + cache.set('qux', 4); + + t.equal(cache.get('foo'), undefined) + t.equal(cache.get('bar'), undefined) + t.equal(cache.get('baz'), 3) + t.equal(cache.get('qux'), 4) + t.end() +}) + +test("least recently set w/ peek", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + t.equal(cache.peek("a"), "A") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("pop the least used item", function (t) { + var cache = new LRU(3) + , last + + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + + t.equal(cache.length, 3) + t.equal(cache.max, 3) + + // Ensure we pop a, c, b + cache.get("b", "B") + + last = cache.pop() + t.equal(last.key, "a") + t.equal(last.value, "A") + t.equal(cache.length, 2) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "c") + t.equal(last.value, "C") + t.equal(cache.length, 1) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "b") + t.equal(last.value, "B") + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last, null) + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js new file mode 100644 index 00000000..eefb80d9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -0,0 +1,52 @@ +var test = require('tap').test +var LRU = require('../') + +test('forEach', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 9 + l.forEach(function (val, key, cache) { + t.equal(cache, l) + t.equal(key, i.toString()) + t.equal(val, i.toString(2)) + i -= 1 + }) + + // get in order of most recently used + l.get(6) + l.get(8) + + var order = [ 8, 6, 9, 7, 5 ] + var i = 0 + + l.forEach(function (val, key, cache) { + var j = order[i ++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + + t.end() +}) + +test('keys() and values()', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + t.similar(l.keys(), ['9', '8', '7', '6', '5']) + t.similar(l.values(), ['1001', '1000', '111', '110', '101']) + + // get in order of most recently used + l.get(6) + l.get(8) + + t.similar(l.keys(), ['8', '6', '9', '7', '5']) + t.similar(l.values(), ['1000', '110', '1001', '111', '101']) + + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js new file mode 100644 index 00000000..7af45b02 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node --expose_gc + +var weak = require('weak'); +var test = require('tap').test +var LRU = require('../') +var l = new LRU({ max: 10 }) +var refs = 0 +function X() { + refs ++ + weak(this, deref) +} + +function deref() { + refs -- +} + +test('no leaks', function (t) { + // fill up the cache + for (var i = 0; i < 100; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var start = process.memoryUsage() + + // capture the memory + var startRefs = refs + + // do it again, but more + for (var i = 0; i < 10000; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var end = process.memoryUsage() + t.equal(refs, startRefs, 'no leaky refs') + + console.error('start: %j\n' + + 'end: %j', start, end); + t.pass(); + t.end(); +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md new file mode 100644 index 00000000..7e365129 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md @@ -0,0 +1,53 @@ +# sigmund + +Quick and dirty signatures for Objects. + +This is like a much faster `deepEquals` comparison, which returns a +string key suitable for caches and the like. + +## Usage + +```javascript +function doSomething (someObj) { + var key = sigmund(someObj, maxDepth) // max depth defaults to 10 + var cached = cache.get(key) + if (cached) return cached) + + var result = expensiveCalculation(someObj) + cache.set(key, result) + return result +} +``` + +The resulting key will be as unique and reproducible as calling +`JSON.stringify` or `util.inspect` on the object, but is much faster. +In order to achieve this speed, some differences are glossed over. +For example, the object `{0:'foo'}` will be treated identically to the +array `['foo']`. + +Also, just as there is no way to summon the soul from the scribblings +of a cocain-addled psychoanalyst, there is no way to revive the object +from the signature string that sigmund gives you. In fact, it's +barely even readable. + +As with `sys.inspect` and `JSON.stringify`, larger objects will +produce larger signature strings. + +Because sigmund is a bit less strict than the more thorough +alternatives, the strings will be shorter, and also there is a +slightly higher chance for collisions. For example, these objects +have the same signature: + + var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} + var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +Like a good Freudian, sigmund is most effective when you already have +some understanding of what you're looking for. It can help you help +yourself, but you must be willing to do some work as well. + +Cycles are handled, and cyclical objects are silently omitted (though +the key is included in the signature output.) + +The second argument is the maximum depth, which defaults to 10, +because that is the maximum object traversal depth covered by most +insurance carriers. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js new file mode 100644 index 00000000..5acfd6d9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js @@ -0,0 +1,283 @@ +// different ways to id objects +// use a req/res pair, since it's crazy deep and cyclical + +// sparseFE10 and sigmund are usually pretty close, which is to be expected, +// since they are essentially the same algorithm, except that sigmund handles +// regular expression objects properly. + + +var http = require('http') +var util = require('util') +var sigmund = require('./sigmund.js') +var sreq, sres, creq, cres, test + +http.createServer(function (q, s) { + sreq = q + sres = s + sres.end('ok') + this.close(function () { setTimeout(function () { + start() + }, 200) }) +}).listen(1337, function () { + creq = http.get({ port: 1337 }) + creq.on('response', function (s) { cres = s }) +}) + +function start () { + test = [sreq, sres, creq, cres] + // test = sreq + // sreq.sres = sres + // sreq.creq = creq + // sreq.cres = cres + + for (var i in exports.compare) { + console.log(i) + var hash = exports.compare[i]() + console.log(hash) + console.log(hash.length) + console.log('') + } + + require('bench').runMain() +} + +function customWs (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return customWs(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + customWs(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function custom (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return '' + obj + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return custom(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + custom(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function sparseFE2 (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ':' + ch(v[k], depth + 1) + }) + soFar += '}' + } + ch(obj, 0) + return soFar +} + +function sparseFE (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ch(v[k], depth + 1) + }) + } + ch(obj, 0) + return soFar +} + +function sparse (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ch(v[k], depth + 1) + } + } + ch(obj, 0) + return soFar +} + +function noCommas (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + + +function flatten (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + soFar += ',' + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + +exports.compare = +{ + // 'custom 2': function () { + // return custom(test, 2, 0) + // }, + // 'customWs 2': function () { + // return customWs(test, 2, 0) + // }, + 'JSON.stringify (guarded)': function () { + var seen = [] + return JSON.stringify(test, function (k, v) { + if (typeof v !== 'object' || !v) return v + if (seen.indexOf(v) !== -1) return undefined + seen.push(v) + return v + }) + }, + + 'flatten 10': function () { + return flatten(test, 10) + }, + + // 'flattenFE 10': function () { + // return flattenFE(test, 10) + // }, + + 'noCommas 10': function () { + return noCommas(test, 10) + }, + + 'sparse 10': function () { + return sparse(test, 10) + }, + + 'sparseFE 10': function () { + return sparseFE(test, 10) + }, + + 'sparseFE2 10': function () { + return sparseFE2(test, 10) + }, + + sigmund: function() { + return sigmund(test, 10) + }, + + + // 'util.inspect 1': function () { + // return util.inspect(test, false, 1, false) + // }, + // 'util.inspect undefined': function () { + // util.inspect(test) + // }, + // 'util.inspect 2': function () { + // util.inspect(test, false, 2, false) + // }, + // 'util.inspect 3': function () { + // util.inspect(test, false, 3, false) + // }, + // 'util.inspect 4': function () { + // util.inspect(test, false, 4, false) + // }, + // 'util.inspect Infinity': function () { + // util.inspect(test, false, Infinity, false) + // } +} + +/** results +**/ diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json new file mode 100644 index 00000000..cb7e2bd4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json @@ -0,0 +1,42 @@ +{ + "name": "sigmund", + "version": "1.0.0", + "description": "Quick and dirty signatures for Objects.", + "main": "sigmund.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.3.0" + }, + "scripts": { + "test": "tap test/*.js", + "bench": "node bench.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/sigmund" + }, + "keywords": [ + "object", + "signature", + "key", + "data", + "psychoanalysis" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "BSD", + "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/sigmund/issues" + }, + "homepage": "https://github.com/isaacs/sigmund", + "_id": "sigmund@1.0.0", + "_from": "sigmund@~1.0.0" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js new file mode 100644 index 00000000..82c7ab8c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js @@ -0,0 +1,39 @@ +module.exports = sigmund +function sigmund (subject, maxSessions) { + maxSessions = maxSessions || 10; + var notes = []; + var analysis = ''; + var RE = RegExp; + + function psychoAnalyze (subject, session) { + if (session > maxSessions) return; + + if (typeof subject === 'function' || + typeof subject === 'undefined') { + return; + } + + if (typeof subject !== 'object' || !subject || + (subject instanceof RE)) { + analysis += subject; + return; + } + + if (notes.indexOf(subject) !== -1 || session === maxSessions) return; + + notes.push(subject); + analysis += '{'; + Object.keys(subject).forEach(function (issue, _, __) { + // pseudo-private values. skip those. + if (issue.charAt(0) === '_') return; + var to = typeof subject[issue]; + if (to === 'function' || to === 'undefined') return; + analysis += issue; + psychoAnalyze(subject[issue], session + 1); + }); + } + psychoAnalyze(subject, 0); + return analysis; +} + +// vim: set softtabstop=4 shiftwidth=4: diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js new file mode 100644 index 00000000..50c53a13 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js @@ -0,0 +1,24 @@ +var test = require('tap').test +var sigmund = require('../sigmund.js') + + +// occasionally there are duplicates +// that's an acceptable edge-case. JSON.stringify and util.inspect +// have some collision potential as well, though less, and collision +// detection is expensive. +var hash = '{abc/def/g{0h1i2{jkl' +var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} +var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +var obj3 = JSON.parse(JSON.stringify(obj1)) +obj3.c = /def/ +obj3.g[2].cycle = obj3 +var cycleHash = '{abc/def/g{0h1i2{jklcycle' + +test('basic', function (t) { + t.equal(sigmund(obj1), hash) + t.equal(sigmund(obj2), hash) + t.equal(sigmund(obj3), cycleHash) + t.end() +}) + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json new file mode 100644 index 00000000..f8f545aa --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "0.2.14", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "devDependencies": { + "tap": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" + }, + "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself. When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "homepage": "https://github.com/isaacs/minimatch", + "_id": "minimatch@0.2.14", + "_from": "minimatch@~0.2.11" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js new file mode 100644 index 00000000..ae7ac73c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js @@ -0,0 +1,399 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + + +var patterns = + [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + // https://github.com/isaacs/minimatch/issues/5 + , function () { + files = [ 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' + , 'a/b/.x' + , 'a/b/.x/' + , 'a/.x/b' + , '.x' + , '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b/.x/c' + , '.x/.x' ] + } + , ["**/.x/**", [ '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b' + , 'a/b/.x/' + , 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' ] ] + + ] + +var regexps = + [ '/^(?:(?=.)a[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:\\*)$/', + '/^(?:(?=.)\\*[^/]*?)$/', + '/^(?:\\*\\*)$/', + '/^(?:(?=.)b[^/]*?\\/)$/', + '/^(?:(?=.)c[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', + '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', + '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', + '/^(?:(?=.)a[^/]*?[^c])$/', + '/^(?:(?=.)a[X-]b)$/', + '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', + '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[^/]c)$/', + '/^(?:a\\*c)$/', + 'false', + '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', + '/^(?:man\\/man1\\/bash\\.1)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[-abc])$/', + '/^(?:(?!\\.)(?=.)[abc-])$/', + '/^(?:\\\\)$/', + '/^(?:(?!\\.)(?=.)[\\\\])$/', + '/^(?:(?!\\.)(?=.)[\\[])$/', + '/^(?:\\[)$/', + '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[\\]])$/', + '/^(?:(?!\\.)(?=.)[\\]-])$/', + '/^(?:(?!\\.)(?=.)[a-z])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:\\[\\])$/', + '/^(?:\\[abc)$/', + '/^(?:(?=.)XYZ)$/i', + '/^(?:(?=.)ab[^/]*?)$/i', + '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', + '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', + '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', + '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', + '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', + '/^(?:(?=.)a[^/]b)$/', + '/^(?:(?=.)#[^/]*?)$/', + '/^(?!^(?:(?=.)a[^/]*?)$).*$/', + '/^(?:(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)a[^/]*?)$/', + '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] +var re = 0; + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + patterns.forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var m = new mm.Minimatch(pattern, options) + var r = m.makeRe() + var expectRe = regexps[re++] + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + + t.equal(tapOpts.re, expectRe, tapOpts) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js new file mode 100644 index 00000000..7ee278a2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js @@ -0,0 +1,33 @@ +var tap = require("tap") + , minimatch = require("../") + +tap.test("brace expansion", function (t) { + // [ pattern, [expanded] ] + ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" + , [ "abxy" + , "abxz" + , "acdxy" + , "acdxz" + , "acexy" + , "acexz" + , "afhxy" + , "afhxz" + , "aghxy" + , "aghxz" ] ] + , [ "a{1..5}b" + , [ "a1b" + , "a2b" + , "a3b" + , "a4b" + , "a5b" ] ] + , [ "a{b}c", ["a{b}c"] ] + ].forEach(function (tc) { + var p = tc[0] + , expect = tc[1] + t.equivalent(minimatch.braceExpand(p), expect, p) + }) + console.error("ending") + t.end() +}) + + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js new file mode 100644 index 00000000..0fec4b0f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js @@ -0,0 +1,14 @@ +var Minimatch = require("../minimatch.js").Minimatch +var tap = require("tap") +tap.test("cache test", function (t) { + var mm1 = new Minimatch("a?b") + var mm2 = new Minimatch("a?b") + t.equal(mm1, mm2, "should get the same object") + // the lru should drop it after 100 entries + for (var i = 0; i < 100; i ++) { + new Minimatch("a"+i) + } + mm2 = new Minimatch("a?b") + t.notEqual(mm1, mm2, "cache should have dropped") + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js new file mode 100644 index 00000000..25f1f601 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js @@ -0,0 +1,274 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + ; [ "http://www.bashcookbook.com/bashinfo" + + "/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + ].forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var Class = mm.defaults(options).Minimatch + var m = new Class(pattern, {}) + var r = m.makeRe() + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js new file mode 100644 index 00000000..6676e262 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js @@ -0,0 +1,8 @@ +var test = require('tap').test +var minimatch = require('../') + +test('extglob ending with statechar', function(t) { + t.notOk(minimatch('ax', 'a?(b*)')) + t.ok(minimatch('ax', '?(a*|b)')) + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/package.json new file mode 100644 index 00000000..bfbbbcca --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "glob", + "description": "a little globber", + "version": "3.2.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "main": "glob.js", + "engines": { + "node": "*" + }, + "dependencies": { + "minimatch": "~0.2.11", + "graceful-fs": "~2.0.0", + "inherits": "2" + }, + "devDependencies": { + "tap": "~0.4.0", + "mkdirp": "0", + "rimraf": "1" + }, + "scripts": { + "test": "tap test/*.js" + }, + "license": "BSD", + "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "homepage": "https://github.com/isaacs/node-glob", + "_id": "glob@3.2.3", + "_from": "glob@3.2.3" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/00-setup.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/00-setup.js new file mode 100644 index 00000000..245afafd --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/00-setup.js @@ -0,0 +1,176 @@ +// just a little pre-run script to set up the fixtures. +// zz-finish cleans it up + +var mkdirp = require("mkdirp") +var path = require("path") +var i = 0 +var tap = require("tap") +var fs = require("fs") +var rimraf = require("rimraf") + +var files = +[ "a/.abcdef/x/y/z/a" +, "a/abcdef/g/h" +, "a/abcfed/g/h" +, "a/b/c/d" +, "a/bc/e/f" +, "a/c/d/c/b" +, "a/cb/e/f" +] + +var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c") +var symlinkFrom = "../.." + +files = files.map(function (f) { + return path.resolve(__dirname, f) +}) + +tap.test("remove fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "remove fixtures") + t.end() + }) +}) + +files.forEach(function (f) { + tap.test(f, function (t) { + var d = path.dirname(f) + mkdirp(d, 0755, function (er) { + if (er) { + t.fail(er) + return t.bailout() + } + fs.writeFile(f, "i like tests", function (er) { + t.ifError(er, "make file") + t.end() + }) + }) + }) +}) + +if (process.platform !== "win32") { + tap.test("symlinky", function (t) { + var d = path.dirname(symlinkTo) + console.error("mkdirp", d) + mkdirp(d, 0755, function (er) { + t.ifError(er) + fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) { + t.ifError(er, "make symlink") + t.end() + }) + }) + }) +} + +;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) { + w = "/tmp/glob-test/" + w + tap.test("create " + w, function (t) { + mkdirp(w, function (er) { + if (er) + throw er + t.pass(w) + t.end() + }) + }) +}) + + +// generate the bash pattern test-fixtures if possible +if (process.platform === "win32" || !process.env.TEST_REGEN) { + console.error("Windows, or TEST_REGEN unset. Using cached fixtures.") + return +} + +var spawn = require("child_process").spawn; +var globs = + // put more patterns here. + // anything that would be directly in / should be in /tmp/glob-test + ["test/a/*/+(c|g)/./d" + ,"test/a/**/[cg]/../[cg]" + ,"test/a/{b,c,d,e,f}/**/g" + ,"test/a/b/**" + ,"test/**/g" + ,"test/a/abc{fed,def}/g/h" + ,"test/a/abc{fed/g,def}/**/" + ,"test/a/abc{fed/g,def}/**///**/" + ,"test/**/a/**/" + ,"test/+(a|b|c)/a{/,bc*}/**" + ,"test/*/*/*/f" + ,"test/**/f" + ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" + ,"{./*/*,/tmp/glob-test/*}" + ,"{/tmp/glob-test/*,*}" // evil owl face! how you taunt me! + ,"test/a/!(symlink)/**" + ] +var bashOutput = {} +var fs = require("fs") + +globs.forEach(function (pattern) { + tap.test("generate fixture " + pattern, function (t) { + var cmd = "shopt -s globstar && " + + "shopt -s extglob && " + + "shopt -s nullglob && " + + // "shopt >&2; " + + "eval \'for i in " + pattern + "; do echo $i; done\'" + var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) }) + var out = [] + cp.stdout.on("data", function (c) { + out.push(c) + }) + cp.stderr.pipe(process.stderr) + cp.on("close", function (code) { + out = flatten(out) + if (!out) + out = [] + else + out = cleanResults(out.split(/\r*\n/)) + + bashOutput[pattern] = out + t.notOk(code, "bash test should finish nicely") + t.end() + }) + }) +}) + +tap.test("save fixtures", function (t) { + var fname = path.resolve(__dirname, "bash-results.json") + var data = JSON.stringify(bashOutput, null, 2) + "\n" + fs.writeFile(fname, data, function (er) { + t.ifError(er) + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +function flatten (chunks) { + var s = 0 + chunks.forEach(function (c) { s += c.length }) + var out = new Buffer(s) + s = 0 + chunks.forEach(function (c) { + c.copy(out, s) + s += c.length + }) + + return out.toString().trim() +} + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-comparison.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-comparison.js new file mode 100644 index 00000000..239ed1a9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-comparison.js @@ -0,0 +1,63 @@ +// basic test +// show that it does the same thing by default as the shell. +var tap = require("tap") +, child_process = require("child_process") +, bashResults = require("./bash-results.json") +, globs = Object.keys(bashResults) +, glob = require("../") +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +globs.forEach(function (pattern) { + var expect = bashResults[pattern] + // anything regarding the symlink thing will fail on windows, so just skip it + if (process.platform === "win32" && + expect.some(function (m) { + return /\/symlink\//.test(m) + })) + return + + tap.test(pattern, function (t) { + glob(pattern, function (er, matches) { + if (er) + throw er + + // sort and unmark, just to match the shell results + matches = cleanResults(matches) + + t.deepEqual(matches, expect, pattern) + t.end() + }) + }) + + tap.test(pattern + " sync", function (t) { + var matches = cleanResults(glob.sync(pattern)) + + t.deepEqual(matches, expect, "should match shell") + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/') + }) +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-results.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-results.json new file mode 100644 index 00000000..a9bc347d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/bash-results.json @@ -0,0 +1,350 @@ +{ + "test/a/*/+(c|g)/./d": [ + "test/a/b/c/./d" + ], + "test/a/**/[cg]/../[cg]": [ + "test/a/abcdef/g/../g", + "test/a/abcfed/g/../g", + "test/a/b/c/../c", + "test/a/c/../c", + "test/a/c/d/c/../c", + "test/a/symlink/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c" + ], + "test/a/{b,c,d,e,f}/**/g": [], + "test/a/b/**": [ + "test/a/b", + "test/a/b/c", + "test/a/b/c/d" + ], + "test/**/g": [ + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed,def}/g/h": [ + "test/a/abcdef/g/h", + "test/a/abcfed/g/h" + ], + "test/a/abc{fed/g,def}/**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed/g,def}/**///**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/**/a/**/": [ + "test/a", + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/b", + "test/a/b/c", + "test/a/bc", + "test/a/bc/e", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/cb", + "test/a/cb/e", + "test/a/symlink", + "test/a/symlink/a", + "test/a/symlink/a/b", + "test/a/symlink/a/b/c", + "test/a/symlink/a/b/c/a", + "test/a/symlink/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b" + ], + "test/+(a|b|c)/a{/,bc*}/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h" + ], + "test/*/*/*/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/**/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [ + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c" + ], + "{./*/*,/tmp/glob-test/*}": [ + "./examples/g.js", + "./examples/usr-local.js", + "./node_modules/graceful-fs", + "./node_modules/inherits", + "./node_modules/minimatch", + "./node_modules/mkdirp", + "./node_modules/rimraf", + "./node_modules/tap", + "./test/00-setup.js", + "./test/a", + "./test/bash-comparison.js", + "./test/bash-results.json", + "./test/cwd-test.js", + "./test/globstar-match.js", + "./test/mark.js", + "./test/nocase-nomagic.js", + "./test/pause-resume.js", + "./test/root-nomount.js", + "./test/root.js", + "./test/stat.js", + "./test/zz-cleanup.js", + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq" + ], + "{/tmp/glob-test/*,*}": [ + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq", + "examples", + "glob.js", + "LICENSE", + "node_modules", + "package.json", + "README.md", + "test" + ], + "test/a/!(symlink)/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h", + "test/a/b", + "test/a/b/c", + "test/a/b/c/d", + "test/a/bc", + "test/a/bc/e", + "test/a/bc/e/f", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/c/d/c/b", + "test/a/cb", + "test/a/cb/e", + "test/a/cb/e/f" + ] +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/cwd-test.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/cwd-test.js new file mode 100644 index 00000000..352c27ef --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/cwd-test.js @@ -0,0 +1,55 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing cwd and searching for **/d", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('**/d', function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('a', function (t) { + glob('**/d', {cwd:path.resolve('a')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'b/c/d', 'c/d' ]) + t.end() + }) + }) + + t.test('a/b', function (t) { + glob('**/d', {cwd:path.resolve('a/b')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('a/b/', function (t) { + glob('**/d', {cwd:path.resolve('a/b/')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('.', function (t) { + glob('**/d', {cwd: process.cwd()}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/globstar-match.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/globstar-match.js new file mode 100644 index 00000000..9b234fa2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/globstar-match.js @@ -0,0 +1,19 @@ +var Glob = require("../glob.js").Glob +var test = require('tap').test + +test('globstar should not have dupe matches', function(t) { + var pattern = 'a/**/[gh]' + var g = new Glob(pattern, { cwd: __dirname }) + var matches = [] + g.on('match', function(m) { + console.error('match %j', m) + matches.push(m) + }) + g.on('end', function(set) { + console.error('set', set) + matches = matches.sort() + set = set.sort() + t.same(matches, set, 'should have same set of matches') + t.end() + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/mark.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/mark.js new file mode 100644 index 00000000..ed68a335 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/mark.js @@ -0,0 +1,74 @@ +var test = require("tap").test +var glob = require('../') +process.chdir(__dirname) + +test("mark, no / on pattern", function (t) { + glob("a/*", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + + if (process.platform !== "win32") + expect.push('a/symlink/') + + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, no / on pattern", function (t) { + glob("a/*", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef', + 'a/abcfed', + 'a/b', + 'a/bc', + 'a/c', + 'a/cb' ] + + if (process.platform !== "win32") + expect.push('a/symlink') + t.same(results, expect) + t.end() + }) +}) + +test("mark=true, / on pattern", function (t) { + glob("a/*/", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, / on pattern", function (t) { + glob("a/*/", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js new file mode 100644 index 00000000..d8629709 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js @@ -0,0 +1,113 @@ +var fs = require('graceful-fs'); +var test = require('tap').test; +var glob = require('../'); + +test('mock fs', function(t) { + var stat = fs.stat + var statSync = fs.statSync + var readdir = fs.readdir + var readdirSync = fs.readdirSync + + function fakeStat(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = { isDirectory: function() { return true } } + break + case '/tmp/a': + ret = { isDirectory: function() { return false } } + break + } + return ret + } + + fs.stat = function(path, cb) { + var f = fakeStat(path); + if (f) { + process.nextTick(function() { + cb(null, f) + }) + } else { + stat.call(fs, path, cb) + } + } + + fs.statSync = function(path) { + return fakeStat(path) || statSync.call(fs, path) + } + + function fakeReaddir(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = [ 'a', 'A' ] + break + case '/': + ret = ['tmp', 'tMp', 'tMP', 'TMP'] + } + return ret + } + + fs.readdir = function(path, cb) { + var f = fakeReaddir(path) + if (f) + process.nextTick(function() { + cb(null, f) + }) + else + readdir.call(fs, path, cb) + } + + fs.readdirSync = function(path) { + return fakeReaddir(path) || readdirSync.call(fs, path) + } + + t.pass('mocked') + t.end() +}) + +test('nocase, nomagic', function(t) { + var n = 2 + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/a', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) + glob('/tmp/A', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) +}) + +test('nocase, with some magic', function(t) { + t.plan(2) + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/pause-resume.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/pause-resume.js new file mode 100644 index 00000000..e1ffbab1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/pause-resume.js @@ -0,0 +1,73 @@ +// show that no match events happen while paused. +var tap = require("tap") +, child_process = require("child_process") +// just some gnarly pattern with lots of matches +, pattern = "test/a/!(symlink)/**" +, bashResults = require("./bash-results.json") +, patterns = Object.keys(bashResults) +, glob = require("../") +, Glob = glob.Glob +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +var globResults = [] +tap.test("use a Glob object, and pause/resume it", function (t) { + var g = new Glob(pattern) + , paused = false + , res = [] + , expect = bashResults[pattern] + + g.on("pause", function () { + console.error("pause") + }) + + g.on("resume", function () { + console.error("resume") + }) + + g.on("match", function (m) { + t.notOk(g.paused, "must not be paused") + globResults.push(m) + g.pause() + t.ok(g.paused, "must be paused") + setTimeout(g.resume.bind(g), 10) + }) + + g.on("end", function (matches) { + t.pass("reached glob end") + globResults = cleanResults(globResults) + matches = cleanResults(matches) + t.deepEqual(matches, globResults, + "end event matches should be the same as match events") + + t.deepEqual(matches, expect, + "glob matches should be the same as bash results") + + t.end() + }) +}) + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root-nomount.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root-nomount.js new file mode 100644 index 00000000..3ac5979b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root-nomount.js @@ -0,0 +1,39 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing root and searching for /b*/**", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.', nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) + }) + + t.test('a', function (t) { + glob('/b*/**', { globDebug: true, root: path.resolve('a'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root.js new file mode 100644 index 00000000..95c23f99 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/root.js @@ -0,0 +1,46 @@ +var t = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +var glob = require('../') +var path = require('path') + +t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) +}) + + +t.test('a', function (t) { + console.error("root=" + path.resolve('a')) + glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) { + t.ifError(er) + var wanted = [ + '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' + ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + }) + + t.like(matches, wanted) + t.end() + }) +}) + +t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + })) + t.end() + }) +}) + +t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/stat.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/stat.js new file mode 100644 index 00000000..62917114 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/stat.js @@ -0,0 +1,32 @@ +var glob = require('../') +var test = require('tap').test +var path = require('path') + +test('stat all the things', function(t) { + var g = new glob.Glob('a/*abc*/**', { stat: true, cwd: __dirname }) + var matches = [] + g.on('match', function(m) { + matches.push(m) + }) + var stats = [] + g.on('stat', function(m) { + stats.push(m) + }) + g.on('end', function(eof) { + stats = stats.sort() + matches = matches.sort() + eof = eof.sort() + t.same(stats, matches) + t.same(eof, matches) + var cache = Object.keys(this.statCache) + t.same(cache.map(function (f) { + return path.relative(__dirname, f) + }).sort(), matches) + + cache.forEach(function(c) { + t.equal(typeof this.statCache[c], 'object') + }, this) + + t.end() + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/zz-cleanup.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/zz-cleanup.js new file mode 100644 index 00000000..e085f0fa --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/glob/test/zz-cleanup.js @@ -0,0 +1,11 @@ +// remove the fixtures +var tap = require("tap") +, rimraf = require("rimraf") +, path = require("path") + +tap.test("cleanup fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "removed") + t.end() + }) +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/History.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/History.md new file mode 100644 index 00000000..a4b7b49f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/History.md @@ -0,0 +1,63 @@ + +1.7.0 / 2012-12-30 +================== + + * support transient notifications in Gnome + +1.6.1 / 2012-09-25 +================== + + * restore compatibility with node < 0.8 [fgnass] + +1.6.0 / 2012-09-06 +================== + + * add notification center support [drudge] + +1.5.1 / 2012-04-08 +================== + + * Merge pull request #16 from KyleAMathews/patch-1 + * Fixes #15 + +1.5.0 / 2012-02-08 +================== + + * Added windows support [perfusorius] + +1.4.1 / 2011-12-28 +================== + + * Fixed: dont exit(). Closes #9 + +1.4.0 / 2011-12-17 +================== + + * Changed API: `growl.notify()` -> `growl()` + +1.3.0 / 2011-12-17 +================== + + * Added support for Ubuntu/Debian/Linux users [niftylettuce] + * Fixed: send notifications even if title not specified [alessioalex] + +1.2.0 / 2011-10-06 +================== + + * Add support for priority. + +1.1.0 / 2011-03-15 +================== + + * Added optional callbacks + * Added parsing of version + +1.0.1 / 2010-03-26 +================== + + * Fixed; sys.exec -> child_process.exec to support latest node + +1.0.0 / 2010-03-19 +================== + + * Initial release diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/Readme.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/Readme.md new file mode 100644 index 00000000..48d717cc --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/Readme.md @@ -0,0 +1,99 @@ +# Growl for nodejs + +Growl support for Nodejs. This is essentially a port of my [Ruby Growl Library](http://github.com/visionmedia/growl). Ubuntu/Linux support added thanks to [@niftylettuce](http://github.com/niftylettuce). + +## Installation + +### Install + +### Mac OS X (Darwin): + + Install [growlnotify(1)](http://growl.info/extras.php#growlnotify). On OS X 10.8, Notification Center is supported using [terminal-notifier](https://github.com/alloy/terminal-notifier). To install: + + $ sudo gem install terminal-notifier + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +### Ubuntu (Linux): + + Install `notify-send` through the [libnotify-bin](http://packages.ubuntu.com/libnotify-bin) package: + + $ sudo apt-get install libnotify-bin + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +### Windows: + + Download and install [Growl for Windows](http://www.growlforwindows.com/gfw/default.aspx) + + Download [growlnotify](http://www.growlforwindows.com/gfw/help/growlnotify.aspx) - **IMPORTANT :** Unpack growlnotify to a folder that is present in your path! + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +## Examples + +Callback functions are optional + + var growl = require('growl') + growl('You have mail!') + growl('5 new messages', { sticky: true }) + growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true }) + growl('Message with title', { title: 'Title'}) + growl('Set priority', { priority: 2 }) + growl('Show Safari icon', { image: 'Safari' }) + growl('Show icon', { image: 'path/to/icon.icns' }) + growl('Show image', { image: 'path/to/my.image.png' }) + growl('Show png filesystem icon', { image: 'png' }) + growl('Show pdf filesystem icon', { image: 'article.pdf' }) + growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(err){ + // ... notified + }) + +## Options + + - title + - notification title + - name + - application name + - priority + - priority for the notification (default is 0) + - sticky + - weither or not the notification should remainin until closed + - image + - Auto-detects the context: + - path to an icon sets --iconpath + - path to an image sets --image + - capitalized word sets --appIcon + - filename uses extname as --icon + - otherwise treated as --icon + +## License + +(The MIT License) + +Copyright (c) 2009 TJ Holowaychuk + +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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/lib/growl.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/lib/growl.js new file mode 100644 index 00000000..04f4f9b4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/lib/growl.js @@ -0,0 +1,234 @@ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) + +/** + * Module dependencies. + */ + +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; + +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; + + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; + } +} + +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} + +/** + * Expose `growl`. + */ + +exports = module.exports = growl; + +/** + * Node-growl version. + */ + +exports.version = '1.4.1' + +/** + * Send growl notification _msg_ with _options_. + * + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public + */ + +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; + + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; + + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, image) + break; + case 'Linux': + args.push(cmd.icon + " " + image); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } + } + + // sticky + if (options.sticky) args.push(cmd.sticky); + + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } + } + + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } + + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.title)); + } + break; + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg)); + } else { + args.push(quote(msg)); + } + break; + case 'Windows': + args.push(quote(msg)); + if (options.title) args.push(cmd.title + quote(options.title)); + break; + } + + // execute + exec(args.join(' '), fn); +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/package.json new file mode 100644 index 00000000..6565e46d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/package.json @@ -0,0 +1,14 @@ +{ + "name": "growl", + "version": "1.7.0", + "description": "Growl unobtrusive notifications", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "main": "./lib/growl.js", + "readme": "# Growl for nodejs\n\nGrowl support for Nodejs. This is essentially a port of my [Ruby Growl Library](http://github.com/visionmedia/growl). Ubuntu/Linux support added thanks to [@niftylettuce](http://github.com/niftylettuce). \n\n## Installation\n\n### Install \n\n### Mac OS X (Darwin):\n\n Install [growlnotify(1)](http://growl.info/extras.php#growlnotify). On OS X 10.8, Notification Center is supported using [terminal-notifier](https://github.com/alloy/terminal-notifier). To install:\n \n $ sudo gem install terminal-notifier\n \n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n### Ubuntu (Linux):\n\n Install `notify-send` through the [libnotify-bin](http://packages.ubuntu.com/libnotify-bin) package:\n\n $ sudo apt-get install libnotify-bin\n\n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n### Windows:\n\n Download and install [Growl for Windows](http://www.growlforwindows.com/gfw/default.aspx)\n\n Download [growlnotify](http://www.growlforwindows.com/gfw/help/growlnotify.aspx) - **IMPORTANT :** Unpack growlnotify to a folder that is present in your path!\n\n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n## Examples\n\nCallback functions are optional\n\n var growl = require('growl')\n growl('You have mail!')\n growl('5 new messages', { sticky: true })\n growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true })\n growl('Message with title', { title: 'Title'})\n growl('Set priority', { priority: 2 })\n growl('Show Safari icon', { image: 'Safari' })\n growl('Show icon', { image: 'path/to/icon.icns' })\n growl('Show image', { image: 'path/to/my.image.png' })\n growl('Show png filesystem icon', { image: 'png' })\n growl('Show pdf filesystem icon', { image: 'article.pdf' })\n growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(err){\n // ... notified\n })\n\n## Options\n\n - title\n - notification title\n - name\n - application name\n - priority\n - priority for the notification (default is 0)\n - sticky\n - weither or not the notification should remainin until closed\n - image\n - Auto-detects the context:\n - path to an icon sets --iconpath\n - path to an image sets --image\n - capitalized word sets --appIcon\n - filename uses extname as --icon\n - otherwise treated as --icon\n \n## License \n\n(The MIT License)\n\nCopyright (c) 2009 TJ Holowaychuk \n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "_id": "growl@1.7.0", + "_from": "growl@1.7.x" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/test.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/test.js new file mode 100644 index 00000000..cf22d90b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/growl/test.js @@ -0,0 +1,20 @@ + +var growl = require('./lib/growl') + +growl('You have mail!') +growl('5 new messages', { sticky: true }) +growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true }) +growl('Message with title', { title: 'Title'}) +growl('Set priority', { priority: 2 }) +growl('Show Safari icon', { image: 'Safari' }) +growl('Show icon', { image: 'path/to/icon.icns' }) +growl('Show image', { image: 'path/to/my.image.png' }) +growl('Show png filesystem icon', { image: 'png' }) +growl('Show pdf filesystem icon', { image: 'article.pdf' }) +growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(){ + console.log('callback'); +}) +growl('Show pdf filesystem icon', { title: 'Use show()', image: 'article.pdf' }) +growl('here \' are \n some \\ characters that " need escaping', {}, function(error, stdout, stderr) { + if (error !== null) throw new Error('escaping failed:\n' + stdout + stderr); +}) diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/.npmignore new file mode 100644 index 00000000..b9af3d4b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/.npmignore @@ -0,0 +1,15 @@ +test +support +benchmarks +examples +lib-cov +coverage.html +.gitmodules +.travis.yml +History.md +Readme.md +Makefile +test/ +support/ +benchmarks/ +examples/ diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/LICENSE new file mode 100644 index 00000000..8ad0e0d3 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2009-2010 TJ Holowaychuk + +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. \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/bin/jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/bin/jade new file mode 100755 index 00000000..7e6002f9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/bin/jade @@ -0,0 +1,147 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var fs = require('fs') + , program = require('commander') + , path = require('path') + , basename = path.basename + , dirname = path.dirname + , resolve = path.resolve + , join = path.join + , mkdirp = require('mkdirp') + , jade = require('../'); + +// jade options + +var options = {}; + +// options + +program + .version(jade.version) + .usage('[options] [dir|file ...]') + .option('-o, --obj ', 'javascript options object') + .option('-O, --out ', 'output the compiled html to ') + .option('-p, --path ', 'filename used to resolve includes') + .option('-P, --pretty', 'compile pretty html output') + .option('-c, --client', 'compile for client-side runtime.js') + .option('-D, --no-debug', 'compile without debugging (smaller functions)') + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' # translate jade the templates dir'); + console.log(' $ jade templates'); + console.log(''); + console.log(' # create {foo,bar}.html'); + console.log(' $ jade {foo,bar}.jade'); + console.log(''); + console.log(' # jade over stdio'); + console.log(' $ jade < my.jade > my.html'); + console.log(''); + console.log(' # jade over stdio'); + console.log(' $ echo "h1 Jade!" | jade'); + console.log(''); + console.log(' # foo, bar dirs rendering to /tmp'); + console.log(' $ jade foo bar --out /tmp '); + console.log(''); +}); + +program.parse(process.argv); + +// options given, parse them + +if (program.obj) options = eval('(' + program.obj + ')'); + +// --filename + +if (program.path) options.filename = program.path; + +// --no-debug + +options.compileDebug = program.debug; + +// --client + +options.client = program.client; + +// --pretty + +options.pretty = program.pretty; + +// left-over args are file paths + +var files = program.args; + +// compile files + +if (files.length) { + console.log(); + files.forEach(renderFile); + process.on('exit', console.log); +// stdio +} else { + stdin(); +} + +/** + * Compile from stdin. + */ + +function stdin() { + var buf = ''; + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function(chunk){ buf += chunk; }); + process.stdin.on('end', function(){ + var fn = jade.compile(buf, options); + var output = options.client + ? fn.toString() + : fn(options); + process.stdout.write(output); + }).resume(); +} + +/** + * Process the given path, compiling the jade files found. + * Always walk the subdirectories. + */ + +function renderFile(path) { + var re = /\.jade$/; + fs.lstat(path, function(err, stat) { + if (err) throw err; + // Found jade file + if (stat.isFile() && re.test(path)) { + fs.readFile(path, 'utf8', function(err, str){ + if (err) throw err; + options.filename = path; + var fn = jade.compile(str, options); + var extname = options.client ? '.js' : '.html'; + path = path.replace(re, extname); + if (program.out) path = join(program.out, basename(path)); + var dir = resolve(dirname(path)); + mkdirp(dir, 0755, function(err){ + if (err) throw err; + var output = options.client + ? fn.toString() + : fn(options); + fs.writeFile(path, output, function(err){ + if (err) throw err; + console.log(' \033[90mrendered \033[36m%s\033[0m', path); + }); + }); + }); + // Found directory + } else if (stat.isDirectory()) { + fs.readdir(path, function(err, files) { + if (err) throw err; + files.map(function(filename) { + return path + '/' + filename; + }).forEach(renderFile); + }); + } + }); +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/index.js new file mode 100644 index 00000000..8ad059f7 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/index.js @@ -0,0 +1,4 @@ + +module.exports = process.env.JADE_COV + ? require('./lib-cov/jade') + : require('./lib/jade'); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.js new file mode 100644 index 00000000..1983a203 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.js @@ -0,0 +1,3586 @@ +(function() { + +// CommonJS require() + +function require(p){ + var path = require.resolve(p) + , mod = require.modules[path]; + if (!mod) throw new Error('failed to require "' + p + '"'); + if (!mod.exports) { + mod.exports = {}; + mod.call(mod.exports, mod, mod.exports, require.relative(path)); + } + return mod.exports; + } + +require.modules = {}; + +require.resolve = function (path){ + var orig = path + , reg = path + '.js' + , index = path + '/index.js'; + return require.modules[reg] && reg + || require.modules[index] && index + || orig; + }; + +require.register = function (path, fn){ + require.modules[path] = fn; + }; + +require.relative = function (parent) { + return function(p){ + if ('.' != p.charAt(0)) return require(p); + + var path = parent.split('/') + , segs = p.split('/'); + path.pop(); + + for (var i = 0; i < segs.length; i++) { + var seg = segs[i]; + if ('..' == seg) path.pop(); + else if ('.' != seg) path.push(seg); + } + + return require(path.join('/')); + }; + }; + + +require.register("compiler.js", function(module, exports, require){ + +/*! + * Jade - Compiler + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var nodes = require('./nodes') + , filters = require('./filters') + , doctypes = require('./doctypes') + , selfClosing = require('./self-closing') + , runtime = require('./runtime') + , utils = require('./utils'); + + + if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } + } + + if (!String.prototype.trimLeft) { + String.prototype.trimLeft = function(){ + return this.replace(/^\s+/, ''); + } + } + + + +/** + * Initialize `Compiler` with the given `node`. + * + * @param {Node} node + * @param {Object} options + * @api public + */ + +var Compiler = module.exports = function Compiler(node, options) { + this.options = options = options || {}; + this.node = node; + this.hasCompiledDoctype = false; + this.hasCompiledTag = false; + this.pp = options.pretty || false; + this.debug = false !== options.compileDebug; + this.indents = 0; + this.parentIndents = 0; + if (options.doctype) this.setDoctype(options.doctype); +}; + +/** + * Compiler prototype. + */ + +Compiler.prototype = { + + /** + * Compile parse tree to JavaScript. + * + * @api public + */ + + compile: function(){ + this.buf = ['var interp;']; + if (this.pp) this.buf.push("var __indent = [];"); + this.lastBufferedIdx = -1; + this.visit(this.node); + return this.buf.join('\n'); + }, + + /** + * Sets the default doctype `name`. Sets terse mode to `true` when + * html 5 is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {string} name + * @api public + */ + + setDoctype: function(name){ + var doctype = doctypes[(name || 'default').toLowerCase()]; + doctype = doctype || ''; + this.doctype = doctype; + this.terse = '5' == name || 'html' == name; + this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) + this.prettyIndent(1, true); + + for (var i = 0; i < len; ++i) { + // Pretty print text + if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) + this.prettyIndent(1, false); + + this.visit(block.nodes[i]); + // Multiple text nodes are separated by newlines + if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) + this.buffer('\\n'); + } + }, + + /** + * Visit `doctype`. Sets terse mode to `true` when html 5 + * is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {Doctype} doctype + * @api public + */ + + visitDoctype: function(doctype){ + if (doctype && (doctype.val || !this.doctype)) { + this.setDoctype(doctype.val || 'default'); + } + + if (this.doctype) this.buffer(this.doctype); + this.hasCompiledDoctype = true; + }, + + /** + * Visit `mixin`, generating a function that + * may be called within the template. + * + * @param {Mixin} mixin + * @api public + */ + + visitMixin: function(mixin){ + var name = mixin.name.replace(/-/g, '_') + '_mixin' + , args = mixin.args || '' + , block = mixin.block + , attrs = mixin.attrs + , pp = this.pp; + + if (mixin.call) { + if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") + if (block || attrs.length) { + + this.buf.push(name + '.call({'); + + if (block) { + this.buf.push('block: function(){'); + + // Render block with no indents, dynamically added when rendered + this.parentIndents++; + var _indents = this.indents; + this.indents = 0; + this.visit(mixin.block); + this.indents = _indents; + this.parentIndents--; + + if (attrs.length) { + this.buf.push('},'); + } else { + this.buf.push('}'); + } + } + + if (attrs.length) { + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push('attributes: merge({' + val.buf + + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); + } else { + this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); + } + } + + if (args) { + this.buf.push('}, ' + args + ');'); + } else { + this.buf.push('});'); + } + + } else { + this.buf.push(name + '(' + args + ');'); + } + if (pp) this.buf.push("__indent.pop();") + } else { + this.buf.push('var ' + name + ' = function(' + args + '){'); + this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); + this.parentIndents++; + this.visit(block); + this.parentIndents--; + this.buf.push('};'); + } + }, + + /** + * Visit `tag` buffering tag markup, generating + * attributes, visiting the `tag`'s code and block. + * + * @param {Tag} tag + * @api public + */ + + visitTag: function(tag){ + this.indents++; + var name = tag.name + , pp = this.pp; + + if (tag.buffer) name = "' + (" + name + ") + '"; + + if (!this.hasCompiledTag) { + if (!this.hasCompiledDoctype && 'html' == name) { + this.visitDoctype(); + } + this.hasCompiledTag = true; + } + + // pretty print + if (pp && !tag.isInline()) + this.prettyIndent(0, true); + + if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { + this.buffer('<' + name); + this.visitAttributes(tag.attrs); + this.terse + ? this.buffer('>') + : this.buffer('/>'); + } else { + // Optimize attributes buffering + if (tag.attrs.length) { + this.buffer('<' + name); + if (tag.attrs.length) this.visitAttributes(tag.attrs); + this.buffer('>'); + } else { + this.buffer('<' + name + '>'); + } + if (tag.code) this.visitCode(tag.code); + this.escape = 'pre' == tag.name; + this.visit(tag.block); + + // pretty print + if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) + this.prettyIndent(0, true); + + this.buffer(''); + } + this.indents--; + }, + + /** + * Visit `filter`, throwing when the filter does not exist. + * + * @param {Filter} filter + * @api public + */ + + visitFilter: function(filter){ + var fn = filters[filter.name]; + + // unknown filter + if (!fn) { + if (filter.isASTFilter) { + throw new Error('unknown ast filter "' + filter.name + ':"'); + } else { + throw new Error('unknown filter ":' + filter.name + '"'); + } + } + + if (filter.isASTFilter) { + this.buf.push(fn(filter.block, this, filter.attrs)); + } else { + var text = filter.block.nodes.map(function(node){ return node.val }).join('\n'); + filter.attrs = filter.attrs || {}; + filter.attrs.filename = this.options.filename; + this.buffer(utils.text(fn(text, filter.attrs))); + } + }, + + /** + * Visit `text` node. + * + * @param {Text} text + * @api public + */ + + visitText: function(text){ + text = utils.text(text.val.replace(/\\/g, '\\\\')); + if (this.escape) text = escape(text); + this.buffer(text); + }, + + /** + * Visit a `comment`, only buffering when the buffer flag is set. + * + * @param {Comment} comment + * @api public + */ + + visitComment: function(comment){ + if (!comment.buffer) return; + if (this.pp) this.prettyIndent(1, true); + this.buffer(''); + }, + + /** + * Visit a `BlockComment`. + * + * @param {Comment} comment + * @api public + */ + + visitBlockComment: function(comment){ + if (!comment.buffer) return; + if (0 == comment.val.trim().indexOf('if')) { + this.buffer(''); + } else { + this.buffer(''); + } + }, + + /** + * Visit `code`, respecting buffer / escape flags. + * If the code is followed by a block, wrap it in + * a self-calling function. + * + * @param {Code} code + * @api public + */ + + visitCode: function(code){ + // Wrap code blocks with {}. + // we only wrap unbuffered code blocks ATM + // since they are usually flow control + + // Buffer code + if (code.buffer) { + var val = code.val.trimLeft(); + this.buf.push('var __val__ = ' + val); + val = 'null == __val__ ? "" : __val__'; + if (code.escape) val = 'escape(' + val + ')'; + this.buf.push("buf.push(" + val + ");"); + } else { + this.buf.push(code.val); + } + + // Block support + if (code.block) { + if (!code.buffer) this.buf.push('{'); + this.visit(code.block); + if (!code.buffer) this.buf.push('}'); + } + }, + + /** + * Visit `each` block. + * + * @param {Each} each + * @api public + */ + + visitEach: function(each){ + this.buf.push('' + + '// iterate ' + each.obj + '\n' + + ';(function(){\n' + + ' if (\'number\' == typeof ' + each.obj + '.length) {\n' + + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push('' + + ' }\n' + + ' } else {\n' + + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' + + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push(' }\n'); + + this.buf.push(' }\n }\n}).call(this);\n'); + }, + + /** + * Visit `attrs`. + * + * @param {Array} attrs + * @api public + */ + + visitAttributes: function(attrs){ + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push("buf.push(attrs(merge({ " + val.buf + + " }, attributes), merge(" + val.escaped + ", escaped, true)));"); + } else if (val.constant) { + eval('var buf={' + val.buf + '};'); + this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); + } else { + this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); + } + }, + + /** + * Compile attributes. + */ + + attrs: function(attrs){ + var buf = [] + , classes = [] + , escaped = {} + , constant = attrs.every(function(attr){ return isConstant(attr.val) }) + , inherits = false; + + if (this.terse) buf.push('terse: true'); + + attrs.forEach(function(attr){ + if (attr.name == 'attributes') return inherits = true; + escaped[attr.name] = attr.escaped; + if (attr.name == 'class') { + classes.push('(' + attr.val + ')'); + } else { + var pair = "'" + attr.name + "':(" + attr.val + ')'; + buf.push(pair); + } + }); + + if (classes.length) { + classes = classes.join(" + ' ' + "); + buf.push("class: " + classes); + } + + return { + buf: buf.join(', ').replace('class:', '"class":'), + escaped: JSON.stringify(escaped), + inherits: inherits, + constant: constant + }; + } +}; + +/** + * Check if expression can be evaluated to a constant + * + * @param {String} expression + * @return {Boolean} + * @api private + */ + +function isConstant(val){ + // Check strings/literals + if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) + return true; + + // Check numbers + if (!isNaN(Number(val))) + return true; + + // Check arrays + var matches; + if (matches = /^ *\[(.*)\] *$/.exec(val)) + return matches[1].split(',').every(isConstant); + + return false; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +function escape(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} +}); // module: compiler.js + +require.register("doctypes.js", function(module, exports, require){ + +/*! + * Jade - doctypes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + '5': '' + , 'default': '' + , 'xml': '' + , 'transitional': '' + , 'strict': '' + , 'frameset': '' + , '1.1': '' + , 'basic': '' + , 'mobile': '' +}; +}); // module: doctypes.js + +require.register("filters.js", function(module, exports, require){ + +/*! + * Jade - filters + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + + /** + * Wrap text with CDATA block. + */ + + cdata: function(str){ + return ''; + }, + + /** + * Transform sass to css, wrapped in style tags. + */ + + sass: function(str){ + str = str.replace(/\\n/g, '\n'); + var sass = require('sass').render(str).replace(/\n/g, '\\n'); + return ''; + }, + + /** + * Transform stylus to css, wrapped in style tags. + */ + + stylus: function(str, options){ + var ret; + str = str.replace(/\\n/g, '\n'); + var stylus = require('stylus'); + stylus(str, options).render(function(err, css){ + if (err) throw err; + ret = css.replace(/\n/g, '\\n'); + }); + return ''; + }, + + /** + * Transform less to css, wrapped in style tags. + */ + + less: function(str){ + var ret; + str = str.replace(/\\n/g, '\n'); + require('less').render(str, function(err, css){ + if (err) throw err; + ret = ''; + }); + return ret; + }, + + /** + * Transform markdown to html. + */ + + markdown: function(str){ + var md; + + // support markdown / discount + try { + md = require('markdown'); + } catch (err){ + try { + md = require('discount'); + } catch (err) { + try { + md = require('markdown-js'); + } catch (err) { + try { + md = require('marked'); + } catch (err) { + throw new + Error('Cannot find markdown library, install markdown, discount, or marked.'); + } + } + } + } + + str = str.replace(/\\n/g, '\n'); + return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); + }, + + /** + * Transform coffeescript to javascript. + */ + + coffeescript: function(str){ + str = str.replace(/\\n/g, '\n'); + var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); + return ''; + } +}; + +}); // module: filters.js + +require.register("inline-tags.js", function(module, exports, require){ + +/*! + * Jade - inline tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'a' + , 'abbr' + , 'acronym' + , 'b' + , 'br' + , 'code' + , 'em' + , 'font' + , 'i' + , 'img' + , 'ins' + , 'kbd' + , 'map' + , 'samp' + , 'small' + , 'span' + , 'strong' + , 'sub' + , 'sup' +]; +}); // module: inline-tags.js + +require.register("jade.js", function(module, exports, require){ +/*! + * Jade + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Parser = require('./parser') + , Lexer = require('./lexer') + , Compiler = require('./compiler') + , runtime = require('./runtime') + +/** + * Library version. + */ + +exports.version = '0.26.1'; + +/** + * Expose self closing tags. + */ + +exports.selfClosing = require('./self-closing'); + +/** + * Default supported doctypes. + */ + +exports.doctypes = require('./doctypes'); + +/** + * Text filters. + */ + +exports.filters = require('./filters'); + +/** + * Utilities. + */ + +exports.utils = require('./utils'); + +/** + * Expose `Compiler`. + */ + +exports.Compiler = Compiler; + +/** + * Expose `Parser`. + */ + +exports.Parser = Parser; + +/** + * Expose `Lexer`. + */ + +exports.Lexer = Lexer; + +/** + * Nodes. + */ + +exports.nodes = require('./nodes'); + +/** + * Jade runtime helpers. + */ + +exports.runtime = runtime; + +/** + * Template function cache. + */ + +exports.cache = {}; + +/** + * Parse the given `str` of jade and return a function body. + * + * @param {String} str + * @param {Object} options + * @return {String} + * @api private + */ + +function parse(str, options){ + try { + // Parse + var parser = new Parser(str, options.filename, options); + + // Compile + var compiler = new (options.compiler || Compiler)(parser.parse(), options) + , js = compiler.compile(); + + // Debug compiler + if (options.debug) { + console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); + } + + return '' + + 'var buf = [];\n' + + (options.self + ? 'var self = locals || {};\n' + js + : 'with (locals || {}) {\n' + js + '\n}\n') + + 'return buf.join("");'; + } catch (err) { + parser = parser.context(); + runtime.rethrow(err, parser.filename, parser.lexer.lineno); + } +} + +/** + * Compile a `Function` representation of the given jade `str`. + * + * Options: + * + * - `compileDebug` when `false` debugging code is stripped from the compiled template + * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` + * for use with the Jade client-side runtime.js + * + * @param {String} str + * @param {Options} options + * @return {Function} + * @api public + */ + +exports.compile = function(str, options){ + var options = options || {} + , client = options.client + , filename = options.filename + ? JSON.stringify(options.filename) + : 'undefined' + , fn; + + if (options.compileDebug !== false) { + fn = [ + 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' + , 'try {' + , parse(String(str), options) + , '} catch (err) {' + , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' + , '}' + ].join('\n'); + } else { + fn = parse(String(str), options); + } + + if (client) { + fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; + } + + fn = new Function('locals, attrs, escape, rethrow, merge', fn); + + if (client) return fn; + + return function(locals){ + return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); + }; +}; + +/** + * Render the given `str` of jade and invoke + * the callback `fn(err, str)`. + * + * Options: + * + * - `cache` enable template caching + * - `filename` filename required for `include` / `extends` and caching + * + * @param {String} str + * @param {Object|Function} options or fn + * @param {Function} fn + * @api public + */ + +exports.render = function(str, options, fn){ + // swap args + if ('function' == typeof options) { + fn = options, options = {}; + } + + // cache requires .filename + if (options.cache && !options.filename) { + return fn(new Error('the "filename" option is required for caching')); + } + + try { + var path = options.filename; + var tmpl = options.cache + ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) + : exports.compile(str, options); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Render a Jade file at the given `path` and callback `fn(err, str)`. + * + * @param {String} path + * @param {Object|Function} options or callback + * @param {Function} fn + * @api public + */ + +exports.renderFile = function(path, options, fn){ + var key = path + ':string'; + + if ('function' == typeof options) { + fn = options, options = {}; + } + + try { + options.filename = path; + var str = options.cache + ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) + : fs.readFileSync(path, 'utf8'); + exports.render(str, options, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Express support. + */ + +exports.__express = exports.renderFile; + +}); // module: jade.js + +require.register("lexer.js", function(module, exports, require){ + +/*! + * Jade - Lexer + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize `Lexer` with the given `str`. + * + * Options: + * + * - `colons` allow colons for attr delimiters + * + * @param {String} str + * @param {Object} options + * @api private + */ + +var Lexer = module.exports = function Lexer(str, options) { + options = options || {}; + this.input = str.replace(/\r\n|\r/g, '\n'); + this.colons = options.colons; + this.deferredTokens = []; + this.lastIndents = 0; + this.lineno = 1; + this.stash = []; + this.indentStack = []; + this.indentRe = null; + this.pipeless = false; +}; + +/** + * Lexer prototype. + */ + +Lexer.prototype = { + + /** + * Construct a token with the given `type` and `val`. + * + * @param {String} type + * @param {String} val + * @return {Object} + * @api private + */ + + tok: function(type, val){ + return { + type: type + , line: this.lineno + , val: val + } + }, + + /** + * Consume the given `len` of input. + * + * @param {Number} len + * @api private + */ + + consume: function(len){ + this.input = this.input.substr(len); + }, + + /** + * Scan for `type` with the given `regexp`. + * + * @param {String} type + * @param {RegExp} regexp + * @return {Object} + * @api private + */ + + scan: function(regexp, type){ + var captures; + if (captures = regexp.exec(this.input)) { + this.consume(captures[0].length); + return this.tok(type, captures[1]); + } + }, + + /** + * Defer the given `tok`. + * + * @param {Object} tok + * @api private + */ + + defer: function(tok){ + this.deferredTokens.push(tok); + }, + + /** + * 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.next()); + return this.stash[--n]; + }, + + /** + * Return the indexOf `start` / `end` delimiters. + * + * @param {String} start + * @param {String} end + * @return {Number} + * @api private + */ + + indexOfDelimiters: function(start, end){ + var str = this.input + , nstart = 0 + , nend = 0 + , pos = 0; + for (var i = 0, len = str.length; i < len; ++i) { + if (start == str.charAt(i)) { + ++nstart; + } else if (end == str.charAt(i)) { + if (++nend == nstart) { + pos = i; + break; + } + } + } + return pos; + }, + + /** + * Stashed token. + */ + + stashed: function() { + return this.stash.length + && this.stash.shift(); + }, + + /** + * Deferred token. + */ + + deferred: function() { + return this.deferredTokens.length + && this.deferredTokens.shift(); + }, + + /** + * end-of-source. + */ + + eos: function() { + if (this.input.length) return; + if (this.indentStack.length) { + this.indentStack.shift(); + return this.tok('outdent'); + } else { + return this.tok('eos'); + } + }, + + /** + * Blank line. + */ + + blank: function() { + var captures; + if (captures = /^\n *\n/.exec(this.input)) { + this.consume(captures[0].length - 1); + if (this.pipeless) return this.tok('text', ''); + return this.next(); + } + }, + + /** + * Comment. + */ + + comment: function() { + var captures; + if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('comment', captures[2]); + tok.buffer = '-' != captures[1]; + return tok; + } + }, + + /** + * Interpolated tag. + */ + + interpolation: function() { + var captures; + if (captures = /^#\{(.*?)\}/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('interpolation', captures[1]); + } + }, + + /** + * Tag. + */ + + tag: function() { + var captures; + if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { + this.consume(captures[0].length); + var tok, name = captures[1]; + if (':' == name[name.length - 1]) { + name = name.slice(0, -1); + tok = this.tok('tag', name); + this.defer(this.tok(':')); + while (' ' == this.input[0]) this.input = this.input.substr(1); + } else { + tok = this.tok('tag', name); + } + tok.selfClosing = !! captures[2]; + return tok; + } + }, + + /** + * Filter. + */ + + filter: function() { + return this.scan(/^:(\w+)/, 'filter'); + }, + + /** + * Doctype. + */ + + doctype: function() { + return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); + }, + + /** + * Id. + */ + + id: function() { + return this.scan(/^#([\w-]+)/, 'id'); + }, + + /** + * Class. + */ + + className: function() { + return this.scan(/^\.([\w-]+)/, 'class'); + }, + + /** + * Text. + */ + + text: function() { + return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); + }, + + /** + * Extends. + */ + + "extends": function() { + return this.scan(/^extends? +([^\n]+)/, 'extends'); + }, + + /** + * Block prepend. + */ + + prepend: function() { + var captures; + if (captures = /^prepend +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'prepend' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block append. + */ + + append: function() { + var captures; + if (captures = /^append +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'append' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block. + */ + + block: function() { + var captures; + if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = captures[1] || 'replace' + , name = captures[2] + , tok = this.tok('block', name); + + tok.mode = mode; + return tok; + } + }, + + /** + * Yield. + */ + + yield: function() { + return this.scan(/^yield */, 'yield'); + }, + + /** + * Include. + */ + + include: function() { + return this.scan(/^include +([^\n]+)/, 'include'); + }, + + /** + * Case. + */ + + "case": function() { + return this.scan(/^case +([^\n]+)/, 'case'); + }, + + /** + * When. + */ + + when: function() { + return this.scan(/^when +([^:\n]+)/, 'when'); + }, + + /** + * Default. + */ + + "default": function() { + return this.scan(/^default */, 'default'); + }, + + /** + * Assignment. + */ + + assignment: function() { + var captures; + if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { + this.consume(captures[0].length); + var name = captures[1] + , val = captures[2]; + return this.tok('code', 'var ' + name + ' = (' + val + ');'); + } + }, + + /** + * Call mixin. + */ + + call: function(){ + var captures; + if (captures = /^\+([-\w]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('call', captures[1]); + + // Check for args (not attributes) + if (captures = /^ *\((.*?)\)/.exec(this.input)) { + if (!/^ *[-\w]+ *=/.test(captures[1])) { + this.consume(captures[0].length); + tok.args = captures[1]; + } + } + + return tok; + } + }, + + /** + * Mixin. + */ + + mixin: function(){ + var captures; + if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('mixin', captures[1]); + tok.args = captures[2]; + return tok; + } + }, + + /** + * Conditional. + */ + + conditional: function() { + var captures; + if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var type = captures[1] + , js = captures[2]; + + switch (type) { + case 'if': js = 'if (' + js + ')'; break; + case 'unless': js = 'if (!(' + js + '))'; break; + case 'else if': js = 'else if (' + js + ')'; break; + case 'else': js = 'else'; break; + } + + return this.tok('code', js); + } + }, + + /** + * While. + */ + + "while": function() { + var captures; + if (captures = /^while +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('code', 'while (' + captures[1] + ')'); + } + }, + + /** + * Each. + */ + + each: function() { + var captures; + if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('each', captures[1]); + tok.key = captures[2] || '$index'; + tok.code = captures[3]; + return tok; + } + }, + + /** + * Code. + */ + + code: function() { + var captures; + if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var flags = captures[1]; + captures[1] = captures[2]; + var tok = this.tok('code', captures[1]); + tok.escape = flags[0] === '='; + tok.buffer = flags[0] === '=' || flags[1] === '='; + return tok; + } + }, + + /** + * Attributes. + */ + + attrs: function() { + if ('(' == this.input.charAt(0)) { + var index = this.indexOfDelimiters('(', ')') + , str = this.input.substr(1, index-1) + , tok = this.tok('attrs') + , len = str.length + , colons = this.colons + , states = ['key'] + , escapedAttr + , key = '' + , val = '' + , quote + , c + , p; + + function state(){ + return states[states.length - 1]; + } + + function interpolate(attr) { + return attr.replace(/#\{([^}]+)\}/g, function(_, expr){ + return quote + " + (" + expr + ") + " + quote; + }); + } + + this.consume(index + 1); + tok.attrs = {}; + tok.escaped = {}; + + function parse(c) { + var real = c; + // TODO: remove when people fix ":" + if (colons && ':' == c) c = '='; + switch (c) { + case ',': + case '\n': + switch (state()) { + case 'expr': + case 'array': + case 'string': + case 'object': + val += c; + break; + default: + states.push('key'); + val = val.trim(); + key = key.trim(); + if ('' == key) return; + key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); + tok.escaped[key] = escapedAttr; + tok.attrs[key] = '' == val + ? true + : interpolate(val); + key = val = ''; + } + break; + case '=': + switch (state()) { + case 'key char': + key += real; + break; + case 'val': + case 'expr': + case 'array': + case 'string': + case 'object': + val += real; + break; + default: + escapedAttr = '!' != p; + states.push('val'); + } + break; + case '(': + if ('val' == state() + || 'expr' == state()) states.push('expr'); + val += c; + break; + case ')': + if ('expr' == state() + || 'val' == state()) states.pop(); + val += c; + break; + case '{': + if ('val' == state()) states.push('object'); + val += c; + break; + case '}': + if ('object' == state()) states.pop(); + val += c; + break; + case '[': + if ('val' == state()) states.push('array'); + val += c; + break; + case ']': + if ('array' == state()) states.pop(); + val += c; + break; + case '"': + case "'": + switch (state()) { + case 'key': + states.push('key char'); + break; + case 'key char': + states.pop(); + break; + case 'string': + if (c == quote) states.pop(); + val += c; + break; + default: + states.push('string'); + val += c; + quote = c; + } + break; + case '': + break; + default: + switch (state()) { + case 'key': + case 'key char': + key += c; + break; + default: + val += c; + } + } + p = c; + } + + for (var i = 0; i < len; ++i) { + parse(str.charAt(i)); + } + + parse(','); + + if ('/' == this.input.charAt(0)) { + this.consume(1); + tok.selfClosing = true; + } + + return tok; + } + }, + + /** + * Indent | Outdent | Newline. + */ + + indent: function() { + var captures, re; + + // established regexp + if (this.indentRe) { + captures = this.indentRe.exec(this.input); + // determine regexp + } else { + // tabs + re = /^\n(\t*) */; + captures = re.exec(this.input); + + // spaces + if (captures && !captures[1].length) { + re = /^\n( *)/; + captures = re.exec(this.input); + } + + // established + if (captures && captures[1].length) this.indentRe = re; + } + + if (captures) { + var tok + , indents = captures[1].length; + + ++this.lineno; + this.consume(indents + 1); + + if (' ' == this.input[0] || '\t' == this.input[0]) { + throw new Error('Invalid indentation, you can use tabs or spaces but not both'); + } + + // blank line + if ('\n' == this.input[0]) return this.tok('newline'); + + // outdent + if (this.indentStack.length && indents < this.indentStack[0]) { + while (this.indentStack.length && this.indentStack[0] > indents) { + this.stash.push(this.tok('outdent')); + this.indentStack.shift(); + } + tok = this.stash.pop(); + // indent + } else if (indents && indents != this.indentStack[0]) { + this.indentStack.unshift(indents); + tok = this.tok('indent', indents); + // newline + } else { + tok = this.tok('newline'); + } + + return tok; + } + }, + + /** + * Pipe-less text consumed only when + * pipeless is true; + */ + + pipelessText: function() { + if (this.pipeless) { + if ('\n' == this.input[0]) return; + var i = this.input.indexOf('\n'); + if (-1 == i) i = this.input.length; + var str = this.input.substr(0, i); + this.consume(str.length); + return this.tok('text', str); + } + }, + + /** + * ':' + */ + + colon: function() { + return this.scan(/^: */, ':'); + }, + + /** + * Return the next token object, or those + * previously stashed by lookahead. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.stashed() + || this.next(); + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + next: function() { + return this.deferred() + || this.blank() + || this.eos() + || this.pipelessText() + || this.yield() + || this.doctype() + || this.interpolation() + || this["case"]() + || this.when() + || this["default"]() + || this["extends"]() + || this.append() + || this.prepend() + || this.block() + || this.include() + || this.mixin() + || this.call() + || this.conditional() + || this.each() + || this["while"]() + || this.assignment() + || this.tag() + || this.filter() + || this.code() + || this.id() + || this.className() + || this.attrs() + || this.indent() + || this.comment() + || this.colon() + || this.text(); + } +}; + +}); // module: lexer.js + +require.register("nodes/attrs.js", function(module, exports, require){ + +/*! + * Jade - nodes - Attrs + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'), + Block = require('./block'); + +/** + * Initialize a `Attrs` node. + * + * @api public + */ + +var Attrs = module.exports = function Attrs() { + this.attrs = []; +}; + +/** + * Inherit from `Node`. + */ + +Attrs.prototype = new Node; +Attrs.prototype.constructor = Attrs; + + +/** + * Set attribute `name` to `val`, keep in mind these become + * part of a raw js object literal, so to quote a value you must + * '"quote me"', otherwise or example 'user.name' is literal JavaScript. + * + * @param {String} name + * @param {String} val + * @param {Boolean} escaped + * @return {Tag} for chaining + * @api public + */ + +Attrs.prototype.setAttribute = function(name, val, escaped){ + this.attrs.push({ name: name, val: val, escaped: escaped }); + return this; +}; + +/** + * Remove attribute `name` when present. + * + * @param {String} name + * @api public + */ + +Attrs.prototype.removeAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + delete this.attrs[i]; + } + } +}; + +/** + * Get attribute value by `name`. + * + * @param {String} name + * @return {String} + * @api public + */ + +Attrs.prototype.getAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + return this.attrs[i].val; + } + } +}; + +}); // module: nodes/attrs.js + +require.register("nodes/block-comment.js", function(module, exports, require){ + +/*! + * Jade - nodes - BlockComment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `BlockComment` with the given `block`. + * + * @param {String} val + * @param {Block} block + * @param {Boolean} buffer + * @api public + */ + +var BlockComment = module.exports = function BlockComment(val, block, buffer) { + this.block = block; + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +BlockComment.prototype = new Node; +BlockComment.prototype.constructor = BlockComment; + +}); // module: nodes/block-comment.js + +require.register("nodes/block.js", function(module, exports, require){ + +/*! + * Jade - nodes - Block + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Block` with an optional `node`. + * + * @param {Node} node + * @api public + */ + +var Block = module.exports = function Block(node){ + this.nodes = []; + if (node) this.push(node); +}; + +/** + * Inherit from `Node`. + */ + +Block.prototype = new Node; +Block.prototype.constructor = Block; + + +/** + * Block flag. + */ + +Block.prototype.isBlock = true; + +/** + * Replace the nodes in `other` with the nodes + * in `this` block. + * + * @param {Block} other + * @api private + */ + +Block.prototype.replace = function(other){ + other.nodes = this.nodes; +}; + +/** + * Pust the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.push = function(node){ + return this.nodes.push(node); +}; + +/** + * Check if this block is empty. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.isEmpty = function(){ + return 0 == this.nodes.length; +}; + +/** + * Unshift the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.unshift = function(node){ + return this.nodes.unshift(node); +}; + +/** + * Return the "last" block, or the first `yield` node. + * + * @return {Block} + * @api private + */ + +Block.prototype.includeBlock = function(){ + var ret = this + , node; + + for (var i = 0, len = this.nodes.length; i < len; ++i) { + node = this.nodes[i]; + if (node.yield) return node; + else if (node.textOnly) continue; + else if (node.includeBlock) ret = node.includeBlock(); + else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); + } + + return ret; +}; + +/** + * Return a clone of this block. + * + * @return {Block} + * @api private + */ + +Block.prototype.clone = function(){ + var clone = new Block; + for (var i = 0, len = this.nodes.length; i < len; ++i) { + clone.push(this.nodes[i].clone()); + } + return clone; +}; + + +}); // module: nodes/block.js + +require.register("nodes/case.js", function(module, exports, require){ + +/*! + * Jade - nodes - Case + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Case` with `expr`. + * + * @param {String} expr + * @api public + */ + +var Case = exports = module.exports = function Case(expr, block){ + this.expr = expr; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Case.prototype = new Node; +Case.prototype.constructor = Case; + + +var When = exports.When = function When(expr, block){ + this.expr = expr; + this.block = block; + this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +When.prototype = new Node; +When.prototype.constructor = When; + + + +}); // module: nodes/case.js + +require.register("nodes/code.js", function(module, exports, require){ + +/*! + * Jade - nodes - Code + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Code` node with the given code `val`. + * Code may also be optionally buffered and escaped. + * + * @param {String} val + * @param {Boolean} buffer + * @param {Boolean} escape + * @api public + */ + +var Code = module.exports = function Code(val, buffer, escape) { + this.val = val; + this.buffer = buffer; + this.escape = escape; + if (val.match(/^ *else/)) this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +Code.prototype = new Node; +Code.prototype.constructor = Code; + +}); // module: nodes/code.js + +require.register("nodes/comment.js", function(module, exports, require){ + +/*! + * Jade - nodes - Comment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Comment` with the given `val`, optionally `buffer`, + * otherwise the comment may render in the output. + * + * @param {String} val + * @param {Boolean} buffer + * @api public + */ + +var Comment = module.exports = function Comment(val, buffer) { + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +Comment.prototype = new Node; +Comment.prototype.constructor = Comment; + +}); // module: nodes/comment.js + +require.register("nodes/doctype.js", function(module, exports, require){ + +/*! + * Jade - nodes - Doctype + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Doctype` with the given `val`. + * + * @param {String} val + * @api public + */ + +var Doctype = module.exports = function Doctype(val) { + this.val = val; +}; + +/** + * Inherit from `Node`. + */ + +Doctype.prototype = new Node; +Doctype.prototype.constructor = Doctype; + +}); // module: nodes/doctype.js + +require.register("nodes/each.js", function(module, exports, require){ + +/*! + * Jade - nodes - Each + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize an `Each` node, representing iteration + * + * @param {String} obj + * @param {String} val + * @param {String} key + * @param {Block} block + * @api public + */ + +var Each = module.exports = function Each(obj, val, key, block) { + this.obj = obj; + this.val = val; + this.key = key; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Each.prototype = new Node; +Each.prototype.constructor = Each; + +}); // module: nodes/each.js + +require.register("nodes/filter.js", function(module, exports, require){ + +/*! + * Jade - nodes - Filter + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , Block = require('./block'); + +/** + * Initialize a `Filter` node with the given + * filter `name` and `block`. + * + * @param {String} name + * @param {Block|Node} block + * @api public + */ + +var Filter = module.exports = function Filter(name, block, attrs) { + this.name = name; + this.block = block; + this.attrs = attrs; + this.isASTFilter = !block.nodes.every(function(node){ return node.isText }); +}; + +/** + * Inherit from `Node`. + */ + +Filter.prototype = new Node; +Filter.prototype.constructor = Filter; + +}); // module: nodes/filter.js + +require.register("nodes/index.js", function(module, exports, require){ + +/*! + * Jade - nodes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +exports.Node = require('./node'); +exports.Tag = require('./tag'); +exports.Code = require('./code'); +exports.Each = require('./each'); +exports.Case = require('./case'); +exports.Text = require('./text'); +exports.Block = require('./block'); +exports.Mixin = require('./mixin'); +exports.Filter = require('./filter'); +exports.Comment = require('./comment'); +exports.Literal = require('./literal'); +exports.BlockComment = require('./block-comment'); +exports.Doctype = require('./doctype'); + +}); // module: nodes/index.js + +require.register("nodes/literal.js", function(module, exports, require){ + +/*! + * Jade - nodes - Literal + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Literal` node with the given `str. + * + * @param {String} str + * @api public + */ + +var Literal = module.exports = function Literal(str) { + this.str = str + .replace(/\\/g, "\\\\") + .replace(/\n|\r\n/g, "\\n") + .replace(/'/g, "\\'"); +}; + +/** + * Inherit from `Node`. + */ + +Literal.prototype = new Node; +Literal.prototype.constructor = Literal; + + +}); // module: nodes/literal.js + +require.register("nodes/mixin.js", function(module, exports, require){ + +/*! + * Jade - nodes - Mixin + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'); + +/** + * Initialize a new `Mixin` with `name` and `block`. + * + * @param {String} name + * @param {String} args + * @param {Block} block + * @api public + */ + +var Mixin = module.exports = function Mixin(name, args, block, call){ + this.name = name; + this.args = args; + this.block = block; + this.attrs = []; + this.call = call; +}; + +/** + * Inherit from `Attrs`. + */ + +Mixin.prototype = new Attrs; +Mixin.prototype.constructor = Mixin; + + + +}); // module: nodes/mixin.js + +require.register("nodes/node.js", function(module, exports, require){ + +/*! + * Jade - nodes - Node + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize a `Node`. + * + * @api public + */ + +var Node = module.exports = function Node(){}; + +/** + * Clone this node (return itself) + * + * @return {Node} + * @api private + */ + +Node.prototype.clone = function(){ + return this; +}; + +}); // module: nodes/node.js + +require.register("nodes/tag.js", function(module, exports, require){ + +/*! + * Jade - nodes - Tag + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'), + Block = require('./block'), + inlineTags = require('../inline-tags'); + +/** + * Initialize a `Tag` node with the given tag `name` and optional `block`. + * + * @param {String} name + * @param {Block} block + * @api public + */ + +var Tag = module.exports = function Tag(name, block) { + this.name = name; + this.attrs = []; + this.block = block || new Block; +}; + +/** + * Inherit from `Attrs`. + */ + +Tag.prototype = new Attrs; +Tag.prototype.constructor = Tag; + + +/** + * Clone this tag. + * + * @return {Tag} + * @api private + */ + +Tag.prototype.clone = function(){ + var clone = new Tag(this.name, this.block.clone()); + clone.line = this.line; + clone.attrs = this.attrs; + clone.textOnly = this.textOnly; + return clone; +}; + +/** + * Check if this tag is an inline tag. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.isInline = function(){ + return ~inlineTags.indexOf(this.name); +}; + +/** + * Check if this tag's contents can be inlined. Used for pretty printing. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.canInline = function(){ + var nodes = this.block.nodes; + + function isInline(node){ + // Recurse if the node is a block + if (node.isBlock) return node.nodes.every(isInline); + return node.isText || (node.isInline && node.isInline()); + } + + // Empty tag + if (!nodes.length) return true; + + // Text-only or inline-only tag + if (1 == nodes.length) return isInline(nodes[0]); + + // Multi-line inline-only tag + if (this.block.nodes.every(isInline)) { + for (var i = 1, len = nodes.length; i < len; ++i) { + if (nodes[i-1].isText && nodes[i].isText) + return false; + } + return true; + } + + // Mixed tag + return false; +}; +}); // module: nodes/tag.js + +require.register("nodes/text.js", function(module, exports, require){ + +/*! + * Jade - nodes - Text + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Text` node with optional `line`. + * + * @param {String} line + * @api public + */ + +var Text = module.exports = function Text(line) { + this.val = ''; + if ('string' == typeof line) this.val = line; +}; + +/** + * Inherit from `Node`. + */ + +Text.prototype = new Node; +Text.prototype.constructor = Text; + + +/** + * Flag as text. + */ + +Text.prototype.isText = true; +}); // module: nodes/text.js + +require.register("parser.js", function(module, exports, require){ + +/*! + * Jade - Parser + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Lexer = require('./lexer') + , nodes = require('./nodes'); + +/** + * Initialize `Parser` with the given input `str` and `filename`. + * + * @param {String} str + * @param {String} filename + * @param {Object} options + * @api public + */ + +var Parser = exports = module.exports = function Parser(str, filename, options){ + this.input = str; + this.lexer = new Lexer(str, options); + this.filename = filename; + this.blocks = {}; + this.mixins = {}; + this.options = options; + this.contexts = [this]; +}; + +/** + * Tags that may not contain tags. + */ + +var textOnly = exports.textOnly = ['script', 'style']; + +/** + * Parser prototype. + */ + +Parser.prototype = { + + /** + * Push `parser` onto the context stack, + * or pop and return a `Parser`. + */ + + context: function(parser){ + if (parser) { + this.contexts.push(parser); + } else { + return this.contexts.pop(); + } + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.lexer.advance(); + }, + + /** + * Skip `n` tokens. + * + * @param {Number} n + * @api private + */ + + skip: function(n){ + while (n--) this.advance(); + }, + + /** + * Single token lookahead. + * + * @return {Object} + * @api private + */ + + peek: function() { + return this.lookahead(1); + }, + + /** + * Return lexer lineno. + * + * @return {Number} + * @api private + */ + + line: function() { + return this.lexer.lineno; + }, + + /** + * `n` token lookahead. + * + * @param {Number} n + * @return {Object} + * @api private + */ + + lookahead: function(n){ + return this.lexer.lookahead(n); + }, + + /** + * Parse input returning a string of js for evaluation. + * + * @return {String} + * @api public + */ + + parse: function(){ + var block = new nodes.Block, parser; + block.line = this.line(); + + while ('eos' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + + if (parser = this.extending) { + this.context(parser); + var ast = parser.parse(); + this.context(); + // hoist mixins + for (var name in this.mixins) + ast.unshift(this.mixins[name]); + return ast; + } + + return block; + }, + + /** + * Expect the given type, or throw an exception. + * + * @param {String} type + * @api private + */ + + expect: function(type){ + if (this.peek().type === type) { + return this.advance(); + } else { + throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); + } + }, + + /** + * Accept the given `type`. + * + * @param {String} type + * @api private + */ + + accept: function(type){ + if (this.peek().type === type) { + return this.advance(); + } + }, + + /** + * tag + * | doctype + * | mixin + * | include + * | filter + * | comment + * | text + * | each + * | code + * | yield + * | id + * | class + * | interpolation + */ + + parseExpr: function(){ + switch (this.peek().type) { + case 'tag': + return this.parseTag(); + case 'mixin': + return this.parseMixin(); + case 'block': + return this.parseBlock(); + case 'case': + return this.parseCase(); + case 'when': + return this.parseWhen(); + case 'default': + return this.parseDefault(); + case 'extends': + return this.parseExtends(); + case 'include': + return this.parseInclude(); + case 'doctype': + return this.parseDoctype(); + case 'filter': + return this.parseFilter(); + case 'comment': + return this.parseComment(); + case 'text': + return this.parseText(); + case 'each': + return this.parseEach(); + case 'code': + return this.parseCode(); + case 'call': + return this.parseCall(); + case 'interpolation': + return this.parseInterpolation(); + case 'yield': + this.advance(); + var block = new nodes.Block; + block.yield = true; + return block; + case 'id': + case 'class': + var tok = this.advance(); + this.lexer.defer(this.lexer.tok('tag', 'div')); + this.lexer.defer(tok); + return this.parseExpr(); + default: + throw new Error('unexpected token "' + this.peek().type + '"'); + } + }, + + /** + * Text + */ + + parseText: function(){ + var tok = this.expect('text') + , node = new nodes.Text(tok.val); + node.line = this.line(); + return node; + }, + + /** + * ':' expr + * | block + */ + + parseBlockExpansion: function(){ + if (':' == this.peek().type) { + this.advance(); + return new nodes.Block(this.parseExpr()); + } else { + return this.block(); + } + }, + + /** + * case + */ + + parseCase: function(){ + var val = this.expect('case').val + , node = new nodes.Case(val); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * when + */ + + parseWhen: function(){ + var val = this.expect('when').val + return new nodes.Case.When(val, this.parseBlockExpansion()); + }, + + /** + * default + */ + + parseDefault: function(){ + this.expect('default'); + return new nodes.Case.When('default', this.parseBlockExpansion()); + }, + + /** + * code + */ + + parseCode: function(){ + var tok = this.expect('code') + , node = new nodes.Code(tok.val, tok.buffer, tok.escape) + , block + , i = 1; + node.line = this.line(); + while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; + block = 'indent' == this.lookahead(i).type; + if (block) { + this.skip(i-1); + node.block = this.block(); + } + return node; + }, + + /** + * comment + */ + + parseComment: function(){ + var tok = this.expect('comment') + , node; + + if ('indent' == this.peek().type) { + node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); + } else { + node = new nodes.Comment(tok.val, tok.buffer); + } + + node.line = this.line(); + return node; + }, + + /** + * doctype + */ + + parseDoctype: function(){ + var tok = this.expect('doctype') + , node = new nodes.Doctype(tok.val); + node.line = this.line(); + return node; + }, + + /** + * filter attrs? text-block + */ + + parseFilter: function(){ + var block + , tok = this.expect('filter') + , attrs = this.accept('attrs'); + + this.lexer.pipeless = true; + block = this.parseTextBlock(); + this.lexer.pipeless = false; + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * tag ':' attrs? block + */ + + parseASTFilter: function(){ + var block + , tok = this.expect('tag') + , attrs = this.accept('attrs'); + + this.expect(':'); + block = this.block(); + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * each block + */ + + parseEach: function(){ + var tok = this.expect('each') + , node = new nodes.Each(tok.code, tok.val, tok.key); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * 'extends' name + */ + + parseExtends: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + if (!this.filename) + throw new Error('the "filename" option is required to extend templates'); + + var path = this.expect('extends').val.trim() + , dir = dirname(this.filename); + + var path = join(dir, path + '.jade') + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + + parser.blocks = this.blocks; + parser.contexts = this.contexts; + this.extending = parser; + + // TODO: null node + return new nodes.Literal(''); + }, + + /** + * 'block' name block + */ + + parseBlock: function(){ + var block = this.expect('block') + , mode = block.mode + , name = block.val.trim(); + + block = 'indent' == this.peek().type + ? this.block() + : new nodes.Block(new nodes.Literal('')); + + var prev = this.blocks[name]; + + if (prev) { + switch (prev.mode) { + case 'append': + block.nodes = block.nodes.concat(prev.nodes); + prev = block; + break; + case 'prepend': + block.nodes = prev.nodes.concat(block.nodes); + prev = block; + break; + } + } + + block.mode = mode; + return this.blocks[name] = prev || block; + }, + + /** + * include block? + */ + + parseInclude: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + var path = this.expect('include').val.trim() + , dir = dirname(this.filename); + + if (!this.filename) + throw new Error('the "filename" option is required to use includes'); + + // no extension + if (!~basename(path).indexOf('.')) { + path += '.jade'; + } + + // non-jade + if ('.jade' != path.substr(-5)) { + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8'); + return new nodes.Literal(str); + } + + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + parser.blocks = this.blocks; + parser.mixins = this.mixins; + + this.context(parser); + var ast = parser.parse(); + this.context(); + ast.filename = path; + + if ('indent' == this.peek().type) { + ast.includeBlock().push(this.block()); + } + + return ast; + }, + + /** + * call ident block + */ + + parseCall: function(){ + var tok = this.expect('call') + , name = tok.val + , args = tok.args + , mixin = new nodes.Mixin(name, args, new nodes.Block, true); + + this.tag(mixin); + if (mixin.block.isEmpty()) mixin.block = null; + return mixin; + }, + + /** + * mixin block + */ + + parseMixin: function(){ + var tok = this.expect('mixin') + , name = tok.val + , args = tok.args + , mixin; + + // definition + if ('indent' == this.peek().type) { + mixin = new nodes.Mixin(name, args, this.block(), false); + this.mixins[name] = mixin; + return mixin; + // call + } else { + return new nodes.Mixin(name, args, null, true); + } + }, + + /** + * indent (text | newline)* outdent + */ + + parseTextBlock: function(){ + var block = new nodes.Block; + block.line = this.line(); + var spaces = this.expect('indent').val; + if (null == this._spaces) this._spaces = spaces; + var indent = Array(spaces - this._spaces + 1).join(' '); + while ('outdent' != this.peek().type) { + switch (this.peek().type) { + case 'newline': + this.advance(); + break; + case 'indent': + this.parseTextBlock().nodes.forEach(function(node){ + block.push(node); + }); + break; + default: + var text = new nodes.Text(indent + this.advance().val); + text.line = this.line(); + block.push(text); + } + } + + if (spaces == this._spaces) this._spaces = null; + this.expect('outdent'); + return block; + }, + + /** + * indent expr* outdent + */ + + block: function(){ + var block = new nodes.Block; + block.line = this.line(); + this.expect('indent'); + while ('outdent' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + this.expect('outdent'); + return block; + }, + + /** + * interpolation (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseInterpolation: function(){ + var tok = this.advance(); + var tag = new nodes.Tag(tok.val); + tag.buffer = true; + return this.tag(tag); + }, + + /** + * tag (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseTag: function(){ + // ast-filter look-ahead + var i = 2; + if ('attrs' == this.lookahead(i).type) ++i; + if (':' == this.lookahead(i).type) { + if ('indent' == this.lookahead(++i).type) { + return this.parseASTFilter(); + } + } + + var tok = this.advance() + , tag = new nodes.Tag(tok.val); + + tag.selfClosing = tok.selfClosing; + + return this.tag(tag); + }, + + /** + * Parse tag. + */ + + tag: function(tag){ + var dot; + + tag.line = this.line(); + + // (attrs | class | id)* + out: + while (true) { + switch (this.peek().type) { + case 'id': + case 'class': + var tok = this.advance(); + tag.setAttribute(tok.type, "'" + tok.val + "'"); + continue; + case 'attrs': + var tok = this.advance() + , obj = tok.attrs + , escaped = tok.escaped + , names = Object.keys(obj); + + if (tok.selfClosing) tag.selfClosing = true; + + for (var i = 0, len = names.length; i < len; ++i) { + var name = names[i] + , val = obj[name]; + tag.setAttribute(name, val, escaped[name]); + } + continue; + default: + break out; + } + } + + // check immediate '.' + if ('.' == this.peek().val) { + dot = tag.textOnly = true; + this.advance(); + } + + // (text | code | ':')? + switch (this.peek().type) { + case 'text': + tag.block.push(this.parseText()); + break; + case 'code': + tag.code = this.parseCode(); + break; + case ':': + this.advance(); + tag.block = new nodes.Block; + tag.block.push(this.parseExpr()); + break; + } + + // newline* + while ('newline' == this.peek().type) this.advance(); + + tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); + + // script special-case + if ('script' == tag.name) { + var type = tag.getAttribute('type'); + if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { + tag.textOnly = false; + } + } + + // block? + if ('indent' == this.peek().type) { + if (tag.textOnly) { + this.lexer.pipeless = true; + tag.block = this.parseTextBlock(); + this.lexer.pipeless = false; + } else { + var block = this.block(); + if (tag.block) { + for (var i = 0, len = block.nodes.length; i < len; ++i) { + tag.block.push(block.nodes[i]); + } + } else { + tag.block = block; + } + } + } + + return tag; + } +}; + +}); // module: parser.js + +require.register("runtime.js", function(module, exports, require){ + +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; + +}); // module: runtime.js + +require.register("self-closing.js", function(module, exports, require){ + +/*! + * Jade - self closing tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'meta' + , 'img' + , 'link' + , 'input' + , 'source' + , 'area' + , 'base' + , 'col' + , 'br' + , 'hr' +]; +}); // module: self-closing.js + +require.register("utils.js", function(module, exports, require){ + +/*! + * Jade - utils + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Convert interpolation in the given string to JavaScript. + * + * @param {String} str + * @return {String} + * @api private + */ + +var interpolate = exports.interpolate = function(str){ + return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){ + return escape + ? str + : "' + " + + ('!' == flag ? '' : 'escape') + + "((interp = " + code.replace(/\\'/g, "'") + + ") == null ? '' : interp) + '"; + }); +}; + +/** + * Escape single quotes in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +var escape = exports.escape = function(str) { + return str.replace(/'/g, "\\'"); +}; + +/** + * Interpolate, and escape the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.text = function(str){ + return interpolate(escape(str)); +}; +}); // module: utils.js + +window.jade = require("jade"); +})(); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.md new file mode 100644 index 00000000..051dc031 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.md @@ -0,0 +1,510 @@ + +# Jade + + The jade template engine for node.js + +## Synopsis + + jade [-h|--help] [-v|--version] [-o|--obj STR] + [-O|--out DIR] [-p|--path PATH] [-P|--pretty] + [-c|--client] [-D|--no-debug] + +## Examples + + translate jade the templates dir + + $ jade templates + + create {foo,bar}.html + + $ jade {foo,bar}.jade + + jade over stdio + + $ jade < my.jade > my.html + + jade over s + + $ echo "h1 Jade!" | jade + + foo, bar dirs rendering to /tmp + + $ jade foo bar --out /tmp + + compile client-side templates without debugging + instrumentation, making the output javascript + very light-weight. This requires runtime.js + in your projects. + + $ jade --client --no-debug < my.jade + +## Tags + + Tags are simply nested via whitespace, closing + tags defined for you. These indents are called "blocks". + + ul + li + a Foo + li + a Bar + + You may have several tags in one "block": + + ul + li + a Foo + a Bar + a Baz + +## Self-closing Tags + + Some tags are flagged as self-closing by default, such + as `meta`, `link`, and so on. To explicitly self-close + a tag simply append the `/` character: + + foo/ + foo(bar='baz')/ + + Would yield: + + + + +## Attributes + + Tag attributes look similar to HTML, however + the values are regular JavaScript, here are + some examples: + + a(href='google.com') Google + a(class='button', href='google.com') Google + + As mentioned the attribute values are just JavaScript, + this means ternary operations and other JavaScript expressions + work just fine: + + body(class=user.authenticated ? 'authenticated' : 'anonymous') + a(href=user.website || 'http://google.com') + + Multiple lines work too: + + input(type='checkbox', + name='agreement', + checked) + + Multiple lines without the comma work fine: + + input(type='checkbox' + name='agreement' + checked) + + Funky whitespace? fine: + + input( + type='checkbox' + name='agreement' + checked) + +## Boolean attributes + + Boolean attributes are mirrored by Jade, and accept + bools, aka _true_ or _false_. When no value is specified + _true_ is assumed. For example: + + input(type="checkbox", checked) + // => "" + + For example if the checkbox was for an agreement, perhaps `user.agreed` + was _true_ the following would also output 'checked="checked"': + + input(type="checkbox", checked=user.agreed) + +## Class attributes + + The _class_ attribute accepts an array of classes, + this can be handy when generated from a javascript + function etc: + + classes = ['foo', 'bar', 'baz'] + a(class=classes) + // => "" + +## Class literal + + Classes may be defined using a ".CLASSNAME" syntax: + + .button + // => "
      " + + Or chained: + + .large.button + // => "
      " + + The previous defaulted to divs, however you + may also specify the tag type: + + h1.title My Title + // => "

      My Title

      " + +## Id literal + + Much like the class literal there's an id literal: + + #user-1 + // => "
      " + + Again we may specify the tag as well: + + ul#menu + li: a(href='/home') Home + li: a(href='/store') Store + li: a(href='/contact') Contact + + Finally all of these may be used in any combination, + the following are all valid tags: + + a.button#contact(style: 'color: red') Contact + a.button(style: 'color: red')#contact Contact + a(style: 'color: red').button#contact Contact + +## Block expansion + + Jade supports the concept of "block expansion", in which + using a trailing ":" after a tag will inject a block: + + ul + li: a Foo + li: a Bar + li: a Baz + +## Text + + Arbitrary text may follow tags: + + p Welcome to my site + + yields: + +

      Welcome to my site

      + +## Pipe text + + Another form of text is "pipe" text. Pipes act + as the text margin for large bodies of text. + + p + | This is a large + | body of text for + | this tag. + | + | Nothing too + | exciting. + + yields: + +

      This is a large + body of text for + this tag. + + Nothing too + exciting. +

      + + Using pipes we can also specify regular Jade tags + within the text: + + p + | Click to visit + a(href='http://google.com') Google + | if you want. + +## Text only tags + + As an alternative to pipe text you may add + a trailing "." to indicate that the block + contains nothing but plain-text, no tags: + + p. + This is a large + body of text for + this tag. + + Nothing too + exciting. + + Some tags are text-only by default, for example + _script_, _textarea_, and _style_ tags do not + contain nested HTML so Jade implies the trailing ".": + + script + if (foo) { + bar(); + } + + style + body { + padding: 50px; + font: 14px Helvetica; + } + +## Template script tags + + Sometimes it's useful to define HTML in script + tags using Jade, typically for client-side templates. + + To do this simply give the _script_ tag an arbitrary + _type_ attribute such as _text/x-template_: + + script(type='text/template') + h1 Look! + p Jade still works in here! + +## Interpolation + + Both plain-text and piped-text support interpolation, + which comes in two forms, escapes and non-escaped. The + following will output the _user.name_ in the paragraph + but HTML within it will be escaped to prevent XSS attacks: + + p Welcome #{user.name} + + The following syntax is identical however it will _not_ escape + HTML, and should only be used with strings that you trust: + + p Welcome !{user.name} + +## Inline HTML + + Sometimes constructing small inline snippets of HTML + in Jade can be annoying, luckily we can add plain + HTML as well: + + p Welcome #{user.name} + +## Code + + To buffer output with Jade simply use _=_ at the beginning + of a line or after a tag. This method escapes any HTML + present in the string. + + p= user.description + + To buffer output unescaped use the _!=_ variant, but again + be careful of XSS. + + p!= user.description + + The final way to mess with JavaScript code in Jade is the unbuffered + _-_, which can be used for conditionals, defining variables etc: + + - var user = { description: 'foo bar baz' } + #user + - if (user.description) { + h2 Description + p.description= user.description + - } + + When compiled blocks are wrapped in anonymous functions, so the + following is also valid, without braces: + + - var user = { description: 'foo bar baz' } + #user + - if (user.description) + h2 Description + p.description= user.description + + If you really want you could even use `.forEach()` and others: + + - users.forEach(function(user){ + .user + h2= user.name + p User #{user.name} is #{user.age} years old + - }) + + Taking this further Jade provides some syntax for conditionals, + iteration, switch statements etc. Let's look at those next! + +## Assignment + + Jade's first-class assignment is simple, simply use the _=_ + operator and Jade will _var_ it for you. The following are equivalent: + + - var user = { name: 'tobi' } + user = { name: 'tobi' } + +## Conditionals + + Jade's first-class conditional syntax allows for optional + parenthesis, and you may now omit the leading _-_ otherwise + it's identical, still just regular javascript: + + user = { description: 'foo bar baz' } + #user + if user.description + h2 Description + p.description= user.description + + Jade provides the negated version, _unless_ as well, the following + are equivalent: + + - if (!(user.isAnonymous)) + p You're logged in as #{user.name} + + unless user.isAnonymous + p You're logged in as #{user.name} + +## Iteration + + JavaScript's _for_ loops don't look very declarative, so Jade + also provides its own _for_ loop construct, aliased as _each_: + + for user in users + .user + h2= user.name + p user #{user.name} is #{user.age} year old + + As mentioned _each_ is identical: + + each user in users + .user + h2= user.name + + If necessary the index is available as well: + + for user, i in users + .user(class='user-#{i}') + h2= user.name + + Remember, it's just JavaScript: + + ul#letters + for letter in ['a', 'b', 'c'] + li= letter + +## Mixins + + Mixins provide a way to define jade "functions" which "mix in" + their contents when called. This is useful for abstracting + out large fragments of Jade. + + The simplest possible mixin which accepts no arguments might + look like this: + + mixin hello + p Hello + + You use a mixin by placing `+` before the name: + + +hello + + For something a little more dynamic, mixins can take + arguments, the mixin itself is converted to a javascript + function internally: + + mixin hello(user) + p Hello #{user} + + +hello('Tobi') + + Yields: + +

      Hello Tobi

      + + Mixins may optionally take blocks, when a block is passed + its contents becomes the implicit `block` argument. For + example here is a mixin passed a block, and also invoked + without passing a block: + + mixin article(title) + .article + .article-wrapper + h1= title + if block + block + else + p No content provided + + +article('Hello world') + + +article('Hello world') + p This is my + p Amazing article + + yields: + +
      +
      +

      Hello world

      +

      No content provided

      +
      +
      + +
      +
      +

      Hello world

      +

      This is my

      +

      Amazing article

      +
      +
      + + Mixins can even take attributes, just like a tag. When + attributes are passed they become the implicit `attributes` + argument. Individual attributes can be accessed just like + normal object properties: + + mixin centered + .centered(class=attributes.class) + block + + +centered.bold Hello world + + +centered.red + p This is my + p Amazing article + + yields: + +
      Hello world
      +
      +

      This is my

      +

      Amazing article

      +
      + + If you use `attributes` directly, *all* passed attributes + get used: + + mixin link + a.menu(attributes) + block + + +link.highlight(href='#top') Top + +link#sec1.plain(href='#section1') Section 1 + +link#sec2.plain(href='#section2') Section 2 + + yields: + + Top + Section 1 + Section 2 + + If you pass arguments, they must directly follow the mixin: + + mixin list(arr) + if block + .title + block + ul(attributes) + each item in arr + li= item + + +list(['foo', 'bar', 'baz'])(id='myList', class='bold') + + yields: + +
        +
      • foo
      • +
      • bar
      • +
      • baz
      • +
      diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.min.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.min.js new file mode 100644 index 00000000..72e4535e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/jade.min.js @@ -0,0 +1,2 @@ +(function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');return mod.exports||(mod.exports={},mod.call(mod.exports,mod,mod.exports,require.relative(path))),mod.exports}require.modules={},require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&®||require.modules[index]&&index||orig},require.register=function(path,fn){require.modules[path]=fn},require.relative=function(parent){return function(p){if("."!=p.charAt(0))return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i",this.doctype=doctype,this.terse="5"==name||"html"==name,this.xml=0==this.doctype.indexOf("1&&!escape&&block.nodes[0].isText&&block.nodes[1].isText&&this.prettyIndent(1,!0);for(var i=0;i0&&!escape&&block.nodes[i].isText&&block.nodes[i-1].isText&&this.prettyIndent(1,!1),this.visit(block.nodes[i]),block.nodes[i+1]&&block.nodes[i].isText&&block.nodes[i+1].isText&&this.buffer("\\n")},visitDoctype:function(doctype){doctype&&(doctype.val||!this.doctype)&&this.setDoctype(doctype.val||"default"),this.doctype&&this.buffer(this.doctype),this.hasCompiledDoctype=!0},visitMixin:function(mixin){var name=mixin.name.replace(/-/g,"_")+"_mixin",args=mixin.args||"",block=mixin.block,attrs=mixin.attrs,pp=this.pp;if(mixin.call){pp&&this.buf.push("__indent.push('"+Array(this.indents+1).join(" ")+"');");if(block||attrs.length){this.buf.push(name+".call({");if(block){this.buf.push("block: function(){"),this.parentIndents++;var _indents=this.indents;this.indents=0,this.visit(mixin.block),this.indents=_indents,this.parentIndents--,attrs.length?this.buf.push("},"):this.buf.push("}")}if(attrs.length){var val=this.attrs(attrs);val.inherits?this.buf.push("attributes: merge({"+val.buf+"}, attributes), escaped: merge("+val.escaped+", escaped, true)"):this.buf.push("attributes: {"+val.buf+"}, escaped: "+val.escaped)}args?this.buf.push("}, "+args+");"):this.buf.push("});")}else this.buf.push(name+"("+args+");");pp&&this.buf.push("__indent.pop();")}else this.buf.push("var "+name+" = function("+args+"){"),this.buf.push("var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};"),this.parentIndents++,this.visit(block),this.parentIndents--,this.buf.push("};")},visitTag:function(tag){this.indents++;var name=tag.name,pp=this.pp;tag.buffer&&(name="' + ("+name+") + '"),this.hasCompiledTag||(!this.hasCompiledDoctype&&"html"==name&&this.visitDoctype(),this.hasCompiledTag=!0),pp&&!tag.isInline()&&this.prettyIndent(0,!0),(~selfClosing.indexOf(name)||tag.selfClosing)&&!this.xml?(this.buffer("<"+name),this.visitAttributes(tag.attrs),this.terse?this.buffer(">"):this.buffer("/>")):(tag.attrs.length?(this.buffer("<"+name),tag.attrs.length&&this.visitAttributes(tag.attrs),this.buffer(">")):this.buffer("<"+name+">"),tag.code&&this.visitCode(tag.code),this.escape="pre"==tag.name,this.visit(tag.block),pp&&!tag.isInline()&&"pre"!=tag.name&&!tag.canInline()&&this.prettyIndent(0,!0),this.buffer("")),this.indents--},visitFilter:function(filter){var fn=filters[filter.name];if(!fn)throw filter.isASTFilter?new Error('unknown ast filter "'+filter.name+':"'):new Error('unknown filter ":'+filter.name+'"');if(filter.isASTFilter)this.buf.push(fn(filter.block,this,filter.attrs));else{var text=filter.block.nodes.map(function(node){return node.val}).join("\n");filter.attrs=filter.attrs||{},filter.attrs.filename=this.options.filename,this.buffer(utils.text(fn(text,filter.attrs)))}},visitText:function(text){text=utils.text(text.val.replace(/\\/g,"\\\\")),this.escape&&(text=escape(text)),this.buffer(text)},visitComment:function(comment){if(!comment.buffer)return;this.pp&&this.prettyIndent(1,!0),this.buffer("")},visitBlockComment:function(comment){if(!comment.buffer)return;0==comment.val.trim().indexOf("if")?(this.buffer("")):(this.buffer(""))},visitCode:function(code){if(code.buffer){var val=code.val.trimLeft();this.buf.push("var __val__ = "+val),val='null == __val__ ? "" : __val__',code.escape&&(val="escape("+val+")"),this.buf.push("buf.push("+val+");")}else this.buf.push(code.val);code.block&&(code.buffer||this.buf.push("{"),this.visit(code.block),code.buffer||this.buf.push("}"))},visitEach:function(each){this.buf.push("// iterate "+each.obj+"\n"+";(function(){\n"+" if ('number' == typeof "+each.obj+".length) {\n"+" for (var "+each.key+" = 0, $$l = "+each.obj+".length; "+each.key+" < $$l; "+each.key+"++) {\n"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n } else {\n for (var "+each.key+" in "+each.obj+") {\n"+" if ("+each.obj+".hasOwnProperty("+each.key+")){"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n"),this.buf.push(" }\n }\n}).call(this);\n")},visitAttributes:function(attrs){var val=this.attrs(attrs);val.inherits?this.buf.push("buf.push(attrs(merge({ "+val.buf+" }, attributes), merge("+val.escaped+", escaped, true)));"):val.constant?(eval("var buf={"+val.buf+"};"),this.buffer(runtime.attrs(buf,JSON.parse(val.escaped)),!0)):this.buf.push("buf.push(attrs({ "+val.buf+" }, "+val.escaped+"));")},attrs:function(attrs){var buf=[],classes=[],escaped={},constant=attrs.every(function(attr){return isConstant(attr.val)}),inherits=!1;return this.terse&&buf.push("terse: true"),attrs.forEach(function(attr){if(attr.name=="attributes")return inherits=!0;escaped[attr.name]=attr.escaped;if(attr.name=="class")classes.push("("+attr.val+")");else{var pair="'"+attr.name+"':("+attr.val+")";buf.push(pair)}}),classes.length&&(classes=classes.join(" + ' ' + "),buf.push("class: "+classes)),{buf:buf.join(", ").replace("class:",'"class":'),escaped:JSON.stringify(escaped),inherits:inherits,constant:constant}}};function isConstant(val){if(/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))return!0;if(!isNaN(Number(val)))return!0;var matches;return(matches=/^ *\[(.*)\] *$/.exec(val))?matches[1].split(",").every(isConstant):!1}function escape(html){return String(html).replace(/&(?!\w+;)/g,"&").replace(//g,">").replace(/"/g,""")}}),require.register("doctypes.js",function(module,exports,require){module.exports={5:"","default":"",xml:'',transitional:'',strict:'',frameset:'',1.1:'',basic:'',mobile:''}}),require.register("filters.js",function(module,exports,require){module.exports={cdata:function(str){return""},sass:function(str){str=str.replace(/\\n/g,"\n");var sass=require("sass").render(str).replace(/\n/g,"\\n");return'"},stylus:function(str,options){var ret;str=str.replace(/\\n/g,"\n");var stylus=require("stylus");return stylus(str,options).render(function(err,css){if(err)throw err;ret=css.replace(/\n/g,"\\n")}),'"},less:function(str){var ret;return str=str.replace(/\\n/g,"\n"),require("less").render(str,function(err,css){if(err)throw err;ret='"}),ret},markdown:function(str){var md;try{md=require("markdown")}catch(err){try{md=require("discount")}catch(err){try{md=require("markdown-js")}catch(err){try{md=require("marked")}catch(err){throw new Error("Cannot find markdown library, install markdown, discount, or marked.")}}}}return str=str.replace(/\\n/g,"\n"),md.parse(str).replace(/\n/g,"\\n").replace(/'/g,"'")},coffeescript:function(str){str=str.replace(/\\n/g,"\n");var js=require("coffee-script").compile(str).replace(/\\/g,"\\\\").replace(/\n/g,"\\n");return'"}}}),require.register("inline-tags.js",function(module,exports,require){module.exports=["a","abbr","acronym","b","br","code","em","font","i","img","ins","kbd","map","samp","small","span","strong","sub","sup"]}),require.register("jade.js",function(module,exports,require){var Parser=require("./parser"),Lexer=require("./lexer"),Compiler=require("./compiler"),runtime=require("./runtime");exports.version="0.26.1",exports.selfClosing=require("./self-closing"),exports.doctypes=require("./doctypes"),exports.filters=require("./filters"),exports.utils=require("./utils"),exports.Compiler=Compiler,exports.Parser=Parser,exports.Lexer=Lexer,exports.nodes=require("./nodes"),exports.runtime=runtime,exports.cache={};function parse(str,options){try{var parser=new Parser(str,options.filename,options),compiler=new(options.compiler||Compiler)(parser.parse(),options),js=compiler.compile();return options.debug&&console.error("\nCompiled Function:\n\n%s",js.replace(/^/gm," ")),"var buf = [];\n"+(options.self?"var self = locals || {};\n"+js:"with (locals || {}) {\n"+js+"\n}\n")+'return buf.join("");'}catch(err){parser=parser.context(),runtime.rethrow(err,parser.filename,parser.lexer.lineno)}}exports.compile=function(str,options){var options=options||{},client=options.client,filename=options.filename?JSON.stringify(options.filename):"undefined",fn;return options.compileDebug!==!1?fn=["var __jade = [{ lineno: 1, filename: "+filename+" }];","try {",parse(String(str),options),"} catch (err) {"," rethrow(err, __jade[0].filename, __jade[0].lineno);","}"].join("\n"):fn=parse(String(str),options),client&&(fn="attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n"+fn),fn=new Function("locals, attrs, escape, rethrow, merge",fn),client?fn:function(locals){return fn(locals,runtime.attrs,runtime.escape,runtime.rethrow,runtime.merge)}},exports.render=function(str,options,fn){"function"==typeof options&&(fn=options,options={});if(options.cache&&!options.filename)return fn(new Error('the "filename" option is required for caching'));try{var path=options.filename,tmpl=options.cache?exports.cache[path]||(exports.cache[path]=exports.compile(str,options)):exports.compile(str,options);fn(null,tmpl(options))}catch(err){fn(err)}},exports.renderFile=function(path,options,fn){var key=path+":string";"function"==typeof options&&(fn=options,options={});try{options.filename=path;var str=options.cache?exports.cache[key]||(exports.cache[key]=fs.readFileSync(path,"utf8")):fs.readFileSync(path,"utf8");exports.render(str,options,fn)}catch(err){fn(err)}},exports.__express=exports.renderFile}),require.register("lexer.js",function(module,exports,require){var Lexer=module.exports=function Lexer(str,options){options=options||{},this.input=str.replace(/\r\n|\r/g,"\n"),this.colons=options.colons,this.deferredTokens=[],this.lastIndents=0,this.lineno=1,this.stash=[],this.indentStack=[],this.indentRe=null,this.pipeless=!1};Lexer.prototype={tok:function(type,val){return{type:type,line:this.lineno,val:val}},consume:function(len){this.input=this.input.substr(len)},scan:function(regexp,type){var captures;if(captures=regexp.exec(this.input))return this.consume(captures[0].length),this.tok(type,captures[1])},defer:function(tok){this.deferredTokens.push(tok)},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-->0)this.stash.push(this.next());return this.stash[--n]},indexOfDelimiters:function(start,end){var str=this.input,nstart=0,nend=0,pos=0;for(var i=0,len=str.length;iindents)this.stash.push(this.tok("outdent")),this.indentStack.shift();tok=this.stash.pop()}else indents&&indents!=this.indentStack[0]?(this.indentStack.unshift(indents),tok=this.tok("indent",indents)):tok=this.tok("newline");return tok}},pipelessText:function(){if(this.pipeless){if("\n"==this.input[0])return;var i=this.input.indexOf("\n");-1==i&&(i=this.input.length);var str=this.input.substr(0,i);return this.consume(str.length),this.tok("text",str)}},colon:function(){return this.scan(/^: */,":")},advance:function(){return this.stashed()||this.next()},next:function(){return this.deferred()||this.blank()||this.eos()||this.pipelessText()||this.yield()||this.doctype()||this.interpolation()||this["case"]()||this.when()||this["default"]()||this["extends"]()||this.append()||this.prepend()||this.block()||this.include()||this.mixin()||this.call()||this.conditional()||this.each()||this["while"]()||this.assignment()||this.tag()||this.filter()||this.code()||this.id()||this.className()||this.attrs()||this.indent()||this.comment()||this.colon()||this.text()}}}),require.register("nodes/attrs.js",function(module,exports,require){var Node=require("./node"),Block=require("./block"),Attrs=module.exports=function Attrs(){this.attrs=[]};Attrs.prototype=new Node,Attrs.prototype.constructor=Attrs,Attrs.prototype.setAttribute=function(name,val,escaped){return this.attrs.push({name:name,val:val,escaped:escaped}),this},Attrs.prototype.removeAttribute=function(name){for(var i=0,len=this.attrs.length;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err}}),require.register("self-closing.js",function(module,exports,require){module.exports=["meta","img","link","input","source","area","base","col","br","hr"]}),require.register("utils.js",function(module,exports,require){var interpolate=exports.interpolate=function(str){return str.replace(/(\\)?([#!]){(.*?)}/g,function(str,escape,flag,code){return escape?str:"' + "+("!"==flag?"":"escape")+"((interp = "+code.replace(/\\'/g,"'")+") == null ? '' : interp) + '"})},escape=exports.escape=function(str){return str.replace(/'/g,"\\'")};exports.text=function(str){return interpolate(escape(str))}}),window.jade=require("jade")})(); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/compiler.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/compiler.js new file mode 100644 index 00000000..516ac83d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/compiler.js @@ -0,0 +1,642 @@ + +/*! + * Jade - Compiler + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var nodes = require('./nodes') + , filters = require('./filters') + , doctypes = require('./doctypes') + , selfClosing = require('./self-closing') + , runtime = require('./runtime') + , utils = require('./utils'); + +// if browser +// +// if (!Object.keys) { +// Object.keys = function(obj){ +// var arr = []; +// for (var key in obj) { +// if (obj.hasOwnProperty(key)) { +// arr.push(key); +// } +// } +// return arr; +// } +// } +// +// if (!String.prototype.trimLeft) { +// String.prototype.trimLeft = function(){ +// return this.replace(/^\s+/, ''); +// } +// } +// +// end + + +/** + * Initialize `Compiler` with the given `node`. + * + * @param {Node} node + * @param {Object} options + * @api public + */ + +var Compiler = module.exports = function Compiler(node, options) { + this.options = options = options || {}; + this.node = node; + this.hasCompiledDoctype = false; + this.hasCompiledTag = false; + this.pp = options.pretty || false; + this.debug = false !== options.compileDebug; + this.indents = 0; + this.parentIndents = 0; + if (options.doctype) this.setDoctype(options.doctype); +}; + +/** + * Compiler prototype. + */ + +Compiler.prototype = { + + /** + * Compile parse tree to JavaScript. + * + * @api public + */ + + compile: function(){ + this.buf = ['var interp;']; + if (this.pp) this.buf.push("var __indent = [];"); + this.lastBufferedIdx = -1; + this.visit(this.node); + return this.buf.join('\n'); + }, + + /** + * Sets the default doctype `name`. Sets terse mode to `true` when + * html 5 is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {string} name + * @api public + */ + + setDoctype: function(name){ + var doctype = doctypes[(name || 'default').toLowerCase()]; + doctype = doctype || ''; + this.doctype = doctype; + this.terse = '5' == name || 'html' == name; + this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) + this.prettyIndent(1, true); + + for (var i = 0; i < len; ++i) { + // Pretty print text + if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) + this.prettyIndent(1, false); + + this.visit(block.nodes[i]); + // Multiple text nodes are separated by newlines + if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) + this.buffer('\\n'); + } + }, + + /** + * Visit `doctype`. Sets terse mode to `true` when html 5 + * is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {Doctype} doctype + * @api public + */ + + visitDoctype: function(doctype){ + if (doctype && (doctype.val || !this.doctype)) { + this.setDoctype(doctype.val || 'default'); + } + + if (this.doctype) this.buffer(this.doctype); + this.hasCompiledDoctype = true; + }, + + /** + * Visit `mixin`, generating a function that + * may be called within the template. + * + * @param {Mixin} mixin + * @api public + */ + + visitMixin: function(mixin){ + var name = mixin.name.replace(/-/g, '_') + '_mixin' + , args = mixin.args || '' + , block = mixin.block + , attrs = mixin.attrs + , pp = this.pp; + + if (mixin.call) { + if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") + if (block || attrs.length) { + + this.buf.push(name + '.call({'); + + if (block) { + this.buf.push('block: function(){'); + + // Render block with no indents, dynamically added when rendered + this.parentIndents++; + var _indents = this.indents; + this.indents = 0; + this.visit(mixin.block); + this.indents = _indents; + this.parentIndents--; + + if (attrs.length) { + this.buf.push('},'); + } else { + this.buf.push('}'); + } + } + + if (attrs.length) { + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push('attributes: merge({' + val.buf + + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); + } else { + this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); + } + } + + if (args) { + this.buf.push('}, ' + args + ');'); + } else { + this.buf.push('});'); + } + + } else { + this.buf.push(name + '(' + args + ');'); + } + if (pp) this.buf.push("__indent.pop();") + } else { + this.buf.push('var ' + name + ' = function(' + args + '){'); + this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); + this.parentIndents++; + this.visit(block); + this.parentIndents--; + this.buf.push('};'); + } + }, + + /** + * Visit `tag` buffering tag markup, generating + * attributes, visiting the `tag`'s code and block. + * + * @param {Tag} tag + * @api public + */ + + visitTag: function(tag){ + this.indents++; + var name = tag.name + , pp = this.pp; + + if (tag.buffer) name = "' + (" + name + ") + '"; + + if (!this.hasCompiledTag) { + if (!this.hasCompiledDoctype && 'html' == name) { + this.visitDoctype(); + } + this.hasCompiledTag = true; + } + + // pretty print + if (pp && !tag.isInline()) + this.prettyIndent(0, true); + + if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { + this.buffer('<' + name); + this.visitAttributes(tag.attrs); + this.terse + ? this.buffer('>') + : this.buffer('/>'); + } else { + // Optimize attributes buffering + if (tag.attrs.length) { + this.buffer('<' + name); + if (tag.attrs.length) this.visitAttributes(tag.attrs); + this.buffer('>'); + } else { + this.buffer('<' + name + '>'); + } + if (tag.code) this.visitCode(tag.code); + this.escape = 'pre' == tag.name; + this.visit(tag.block); + + // pretty print + if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) + this.prettyIndent(0, true); + + this.buffer(''); + } + this.indents--; + }, + + /** + * Visit `filter`, throwing when the filter does not exist. + * + * @param {Filter} filter + * @api public + */ + + visitFilter: function(filter){ + var fn = filters[filter.name]; + + // unknown filter + if (!fn) { + if (filter.isASTFilter) { + throw new Error('unknown ast filter "' + filter.name + ':"'); + } else { + throw new Error('unknown filter ":' + filter.name + '"'); + } + } + + if (filter.isASTFilter) { + this.buf.push(fn(filter.block, this, filter.attrs)); + } else { + var text = filter.block.nodes.map(function(node){ return node.val }).join('\n'); + filter.attrs = filter.attrs || {}; + filter.attrs.filename = this.options.filename; + this.buffer(utils.text(fn(text, filter.attrs))); + } + }, + + /** + * Visit `text` node. + * + * @param {Text} text + * @api public + */ + + visitText: function(text){ + text = utils.text(text.val.replace(/\\/g, '\\\\')); + if (this.escape) text = escape(text); + this.buffer(text); + }, + + /** + * Visit a `comment`, only buffering when the buffer flag is set. + * + * @param {Comment} comment + * @api public + */ + + visitComment: function(comment){ + if (!comment.buffer) return; + if (this.pp) this.prettyIndent(1, true); + this.buffer(''); + }, + + /** + * Visit a `BlockComment`. + * + * @param {Comment} comment + * @api public + */ + + visitBlockComment: function(comment){ + if (!comment.buffer) return; + if (0 == comment.val.trim().indexOf('if')) { + this.buffer(''); + } else { + this.buffer(''); + } + }, + + /** + * Visit `code`, respecting buffer / escape flags. + * If the code is followed by a block, wrap it in + * a self-calling function. + * + * @param {Code} code + * @api public + */ + + visitCode: function(code){ + // Wrap code blocks with {}. + // we only wrap unbuffered code blocks ATM + // since they are usually flow control + + // Buffer code + if (code.buffer) { + var val = code.val.trimLeft(); + this.buf.push('var __val__ = ' + val); + val = 'null == __val__ ? "" : __val__'; + if (code.escape) val = 'escape(' + val + ')'; + this.buf.push("buf.push(" + val + ");"); + } else { + this.buf.push(code.val); + } + + // Block support + if (code.block) { + if (!code.buffer) this.buf.push('{'); + this.visit(code.block); + if (!code.buffer) this.buf.push('}'); + } + }, + + /** + * Visit `each` block. + * + * @param {Each} each + * @api public + */ + + visitEach: function(each){ + this.buf.push('' + + '// iterate ' + each.obj + '\n' + + ';(function(){\n' + + ' if (\'number\' == typeof ' + each.obj + '.length) {\n' + + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push('' + + ' }\n' + + ' } else {\n' + + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' + // if browser + // + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' + // end + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + // if browser + // this.buf.push(' }\n'); + // end + + this.buf.push(' }\n }\n}).call(this);\n'); + }, + + /** + * Visit `attrs`. + * + * @param {Array} attrs + * @api public + */ + + visitAttributes: function(attrs){ + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push("buf.push(attrs(merge({ " + val.buf + + " }, attributes), merge(" + val.escaped + ", escaped, true)));"); + } else if (val.constant) { + eval('var buf={' + val.buf + '};'); + this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); + } else { + this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); + } + }, + + /** + * Compile attributes. + */ + + attrs: function(attrs){ + var buf = [] + , classes = [] + , escaped = {} + , constant = attrs.every(function(attr){ return isConstant(attr.val) }) + , inherits = false; + + if (this.terse) buf.push('terse: true'); + + attrs.forEach(function(attr){ + if (attr.name == 'attributes') return inherits = true; + escaped[attr.name] = attr.escaped; + if (attr.name == 'class') { + classes.push('(' + attr.val + ')'); + } else { + var pair = "'" + attr.name + "':(" + attr.val + ')'; + buf.push(pair); + } + }); + + if (classes.length) { + classes = classes.join(" + ' ' + "); + buf.push("class: " + classes); + } + + return { + buf: buf.join(', ').replace('class:', '"class":'), + escaped: JSON.stringify(escaped), + inherits: inherits, + constant: constant + }; + } +}; + +/** + * Check if expression can be evaluated to a constant + * + * @param {String} expression + * @return {Boolean} + * @api private + */ + +function isConstant(val){ + // Check strings/literals + if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) + return true; + + // Check numbers + if (!isNaN(Number(val))) + return true; + + // Check arrays + var matches; + if (matches = /^ *\[(.*)\] *$/.exec(val)) + return matches[1].split(',').every(isConstant); + + return false; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +function escape(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/doctypes.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/doctypes.js new file mode 100644 index 00000000..e87ca1e4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/doctypes.js @@ -0,0 +1,18 @@ + +/*! + * Jade - doctypes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + '5': '' + , 'default': '' + , 'xml': '' + , 'transitional': '' + , 'strict': '' + , 'frameset': '' + , '1.1': '' + , 'basic': '' + , 'mobile': '' +}; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/filters.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/filters.js new file mode 100644 index 00000000..fdb634cb --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/filters.js @@ -0,0 +1,97 @@ + +/*! + * Jade - filters + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + + /** + * Wrap text with CDATA block. + */ + + cdata: function(str){ + return ''; + }, + + /** + * Transform sass to css, wrapped in style tags. + */ + + sass: function(str){ + str = str.replace(/\\n/g, '\n'); + var sass = require('sass').render(str).replace(/\n/g, '\\n'); + return ''; + }, + + /** + * Transform stylus to css, wrapped in style tags. + */ + + stylus: function(str, options){ + var ret; + str = str.replace(/\\n/g, '\n'); + var stylus = require('stylus'); + stylus(str, options).render(function(err, css){ + if (err) throw err; + ret = css.replace(/\n/g, '\\n'); + }); + return ''; + }, + + /** + * Transform less to css, wrapped in style tags. + */ + + less: function(str){ + var ret; + str = str.replace(/\\n/g, '\n'); + require('less').render(str, function(err, css){ + if (err) throw err; + ret = ''; + }); + return ret; + }, + + /** + * Transform markdown to html. + */ + + markdown: function(str){ + var md; + + // support markdown / discount + try { + md = require('markdown'); + } catch (err){ + try { + md = require('discount'); + } catch (err) { + try { + md = require('markdown-js'); + } catch (err) { + try { + md = require('marked'); + } catch (err) { + throw new + Error('Cannot find markdown library, install markdown, discount, or marked.'); + } + } + } + } + + str = str.replace(/\\n/g, '\n'); + return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); + }, + + /** + * Transform coffeescript to javascript. + */ + + coffeescript: function(str){ + str = str.replace(/\\n/g, '\n'); + var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); + return ''; + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/inline-tags.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/inline-tags.js new file mode 100644 index 00000000..491de0b5 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/inline-tags.js @@ -0,0 +1,28 @@ + +/*! + * Jade - inline tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'a' + , 'abbr' + , 'acronym' + , 'b' + , 'br' + , 'code' + , 'em' + , 'font' + , 'i' + , 'img' + , 'ins' + , 'kbd' + , 'map' + , 'samp' + , 'small' + , 'span' + , 'strong' + , 'sub' + , 'sup' +]; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/jade.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/jade.js new file mode 100644 index 00000000..00f0abb1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/jade.js @@ -0,0 +1,237 @@ +/*! + * Jade + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Parser = require('./parser') + , Lexer = require('./lexer') + , Compiler = require('./compiler') + , runtime = require('./runtime') +// if node + , fs = require('fs'); +// end + +/** + * Library version. + */ + +exports.version = '0.26.3'; + +/** + * Expose self closing tags. + */ + +exports.selfClosing = require('./self-closing'); + +/** + * Default supported doctypes. + */ + +exports.doctypes = require('./doctypes'); + +/** + * Text filters. + */ + +exports.filters = require('./filters'); + +/** + * Utilities. + */ + +exports.utils = require('./utils'); + +/** + * Expose `Compiler`. + */ + +exports.Compiler = Compiler; + +/** + * Expose `Parser`. + */ + +exports.Parser = Parser; + +/** + * Expose `Lexer`. + */ + +exports.Lexer = Lexer; + +/** + * Nodes. + */ + +exports.nodes = require('./nodes'); + +/** + * Jade runtime helpers. + */ + +exports.runtime = runtime; + +/** + * Template function cache. + */ + +exports.cache = {}; + +/** + * Parse the given `str` of jade and return a function body. + * + * @param {String} str + * @param {Object} options + * @return {String} + * @api private + */ + +function parse(str, options){ + try { + // Parse + var parser = new Parser(str, options.filename, options); + + // Compile + var compiler = new (options.compiler || Compiler)(parser.parse(), options) + , js = compiler.compile(); + + // Debug compiler + if (options.debug) { + console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); + } + + return '' + + 'var buf = [];\n' + + (options.self + ? 'var self = locals || {};\n' + js + : 'with (locals || {}) {\n' + js + '\n}\n') + + 'return buf.join("");'; + } catch (err) { + parser = parser.context(); + runtime.rethrow(err, parser.filename, parser.lexer.lineno); + } +} + +/** + * Compile a `Function` representation of the given jade `str`. + * + * Options: + * + * - `compileDebug` when `false` debugging code is stripped from the compiled template + * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` + * for use with the Jade client-side runtime.js + * + * @param {String} str + * @param {Options} options + * @return {Function} + * @api public + */ + +exports.compile = function(str, options){ + var options = options || {} + , client = options.client + , filename = options.filename + ? JSON.stringify(options.filename) + : 'undefined' + , fn; + + if (options.compileDebug !== false) { + fn = [ + 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' + , 'try {' + , parse(String(str), options) + , '} catch (err) {' + , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' + , '}' + ].join('\n'); + } else { + fn = parse(String(str), options); + } + + if (client) { + fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; + } + + fn = new Function('locals, attrs, escape, rethrow, merge', fn); + + if (client) return fn; + + return function(locals){ + return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); + }; +}; + +/** + * Render the given `str` of jade and invoke + * the callback `fn(err, str)`. + * + * Options: + * + * - `cache` enable template caching + * - `filename` filename required for `include` / `extends` and caching + * + * @param {String} str + * @param {Object|Function} options or fn + * @param {Function} fn + * @api public + */ + +exports.render = function(str, options, fn){ + // swap args + if ('function' == typeof options) { + fn = options, options = {}; + } + + // cache requires .filename + if (options.cache && !options.filename) { + return fn(new Error('the "filename" option is required for caching')); + } + + try { + var path = options.filename; + var tmpl = options.cache + ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) + : exports.compile(str, options); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Render a Jade file at the given `path` and callback `fn(err, str)`. + * + * @param {String} path + * @param {Object|Function} options or callback + * @param {Function} fn + * @api public + */ + +exports.renderFile = function(path, options, fn){ + var key = path + ':string'; + + if ('function' == typeof options) { + fn = options, options = {}; + } + + try { + options.filename = path; + var str = options.cache + ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) + : fs.readFileSync(path, 'utf8'); + exports.render(str, options, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Express support. + */ + +exports.__express = exports.renderFile; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/lexer.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/lexer.js new file mode 100644 index 00000000..bca314a9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/lexer.js @@ -0,0 +1,771 @@ + +/*! + * Jade - Lexer + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize `Lexer` with the given `str`. + * + * Options: + * + * - `colons` allow colons for attr delimiters + * + * @param {String} str + * @param {Object} options + * @api private + */ + +var Lexer = module.exports = function Lexer(str, options) { + options = options || {}; + this.input = str.replace(/\r\n|\r/g, '\n'); + this.colons = options.colons; + this.deferredTokens = []; + this.lastIndents = 0; + this.lineno = 1; + this.stash = []; + this.indentStack = []; + this.indentRe = null; + this.pipeless = false; +}; + +/** + * Lexer prototype. + */ + +Lexer.prototype = { + + /** + * Construct a token with the given `type` and `val`. + * + * @param {String} type + * @param {String} val + * @return {Object} + * @api private + */ + + tok: function(type, val){ + return { + type: type + , line: this.lineno + , val: val + } + }, + + /** + * Consume the given `len` of input. + * + * @param {Number} len + * @api private + */ + + consume: function(len){ + this.input = this.input.substr(len); + }, + + /** + * Scan for `type` with the given `regexp`. + * + * @param {String} type + * @param {RegExp} regexp + * @return {Object} + * @api private + */ + + scan: function(regexp, type){ + var captures; + if (captures = regexp.exec(this.input)) { + this.consume(captures[0].length); + return this.tok(type, captures[1]); + } + }, + + /** + * Defer the given `tok`. + * + * @param {Object} tok + * @api private + */ + + defer: function(tok){ + this.deferredTokens.push(tok); + }, + + /** + * 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.next()); + return this.stash[--n]; + }, + + /** + * Return the indexOf `start` / `end` delimiters. + * + * @param {String} start + * @param {String} end + * @return {Number} + * @api private + */ + + indexOfDelimiters: function(start, end){ + var str = this.input + , nstart = 0 + , nend = 0 + , pos = 0; + for (var i = 0, len = str.length; i < len; ++i) { + if (start == str.charAt(i)) { + ++nstart; + } else if (end == str.charAt(i)) { + if (++nend == nstart) { + pos = i; + break; + } + } + } + return pos; + }, + + /** + * Stashed token. + */ + + stashed: function() { + return this.stash.length + && this.stash.shift(); + }, + + /** + * Deferred token. + */ + + deferred: function() { + return this.deferredTokens.length + && this.deferredTokens.shift(); + }, + + /** + * end-of-source. + */ + + eos: function() { + if (this.input.length) return; + if (this.indentStack.length) { + this.indentStack.shift(); + return this.tok('outdent'); + } else { + return this.tok('eos'); + } + }, + + /** + * Blank line. + */ + + blank: function() { + var captures; + if (captures = /^\n *\n/.exec(this.input)) { + this.consume(captures[0].length - 1); + if (this.pipeless) return this.tok('text', ''); + return this.next(); + } + }, + + /** + * Comment. + */ + + comment: function() { + var captures; + if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('comment', captures[2]); + tok.buffer = '-' != captures[1]; + return tok; + } + }, + + /** + * Interpolated tag. + */ + + interpolation: function() { + var captures; + if (captures = /^#\{(.*?)\}/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('interpolation', captures[1]); + } + }, + + /** + * Tag. + */ + + tag: function() { + var captures; + if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { + this.consume(captures[0].length); + var tok, name = captures[1]; + if (':' == name[name.length - 1]) { + name = name.slice(0, -1); + tok = this.tok('tag', name); + this.defer(this.tok(':')); + while (' ' == this.input[0]) this.input = this.input.substr(1); + } else { + tok = this.tok('tag', name); + } + tok.selfClosing = !! captures[2]; + return tok; + } + }, + + /** + * Filter. + */ + + filter: function() { + return this.scan(/^:(\w+)/, 'filter'); + }, + + /** + * Doctype. + */ + + doctype: function() { + return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); + }, + + /** + * Id. + */ + + id: function() { + return this.scan(/^#([\w-]+)/, 'id'); + }, + + /** + * Class. + */ + + className: function() { + return this.scan(/^\.([\w-]+)/, 'class'); + }, + + /** + * Text. + */ + + text: function() { + return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); + }, + + /** + * Extends. + */ + + "extends": function() { + return this.scan(/^extends? +([^\n]+)/, 'extends'); + }, + + /** + * Block prepend. + */ + + prepend: function() { + var captures; + if (captures = /^prepend +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'prepend' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block append. + */ + + append: function() { + var captures; + if (captures = /^append +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'append' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block. + */ + + block: function() { + var captures; + if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = captures[1] || 'replace' + , name = captures[2] + , tok = this.tok('block', name); + + tok.mode = mode; + return tok; + } + }, + + /** + * Yield. + */ + + yield: function() { + return this.scan(/^yield */, 'yield'); + }, + + /** + * Include. + */ + + include: function() { + return this.scan(/^include +([^\n]+)/, 'include'); + }, + + /** + * Case. + */ + + "case": function() { + return this.scan(/^case +([^\n]+)/, 'case'); + }, + + /** + * When. + */ + + when: function() { + return this.scan(/^when +([^:\n]+)/, 'when'); + }, + + /** + * Default. + */ + + "default": function() { + return this.scan(/^default */, 'default'); + }, + + /** + * Assignment. + */ + + assignment: function() { + var captures; + if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { + this.consume(captures[0].length); + var name = captures[1] + , val = captures[2]; + return this.tok('code', 'var ' + name + ' = (' + val + ');'); + } + }, + + /** + * Call mixin. + */ + + call: function(){ + var captures; + if (captures = /^\+([-\w]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('call', captures[1]); + + // Check for args (not attributes) + if (captures = /^ *\((.*?)\)/.exec(this.input)) { + if (!/^ *[-\w]+ *=/.test(captures[1])) { + this.consume(captures[0].length); + tok.args = captures[1]; + } + } + + return tok; + } + }, + + /** + * Mixin. + */ + + mixin: function(){ + var captures; + if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('mixin', captures[1]); + tok.args = captures[2]; + return tok; + } + }, + + /** + * Conditional. + */ + + conditional: function() { + var captures; + if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var type = captures[1] + , js = captures[2]; + + switch (type) { + case 'if': js = 'if (' + js + ')'; break; + case 'unless': js = 'if (!(' + js + '))'; break; + case 'else if': js = 'else if (' + js + ')'; break; + case 'else': js = 'else'; break; + } + + return this.tok('code', js); + } + }, + + /** + * While. + */ + + "while": function() { + var captures; + if (captures = /^while +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('code', 'while (' + captures[1] + ')'); + } + }, + + /** + * Each. + */ + + each: function() { + var captures; + if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('each', captures[1]); + tok.key = captures[2] || '$index'; + tok.code = captures[3]; + return tok; + } + }, + + /** + * Code. + */ + + code: function() { + var captures; + if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var flags = captures[1]; + captures[1] = captures[2]; + var tok = this.tok('code', captures[1]); + tok.escape = flags[0] === '='; + tok.buffer = flags[0] === '=' || flags[1] === '='; + return tok; + } + }, + + /** + * Attributes. + */ + + attrs: function() { + if ('(' == this.input.charAt(0)) { + var index = this.indexOfDelimiters('(', ')') + , str = this.input.substr(1, index-1) + , tok = this.tok('attrs') + , len = str.length + , colons = this.colons + , states = ['key'] + , escapedAttr + , key = '' + , val = '' + , quote + , c + , p; + + function state(){ + return states[states.length - 1]; + } + + function interpolate(attr) { + return attr.replace(/#\{([^}]+)\}/g, function(_, expr){ + return quote + " + (" + expr + ") + " + quote; + }); + } + + this.consume(index + 1); + tok.attrs = {}; + tok.escaped = {}; + + function parse(c) { + var real = c; + // TODO: remove when people fix ":" + if (colons && ':' == c) c = '='; + switch (c) { + case ',': + case '\n': + switch (state()) { + case 'expr': + case 'array': + case 'string': + case 'object': + val += c; + break; + default: + states.push('key'); + val = val.trim(); + key = key.trim(); + if ('' == key) return; + key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); + tok.escaped[key] = escapedAttr; + tok.attrs[key] = '' == val + ? true + : interpolate(val); + key = val = ''; + } + break; + case '=': + switch (state()) { + case 'key char': + key += real; + break; + case 'val': + case 'expr': + case 'array': + case 'string': + case 'object': + val += real; + break; + default: + escapedAttr = '!' != p; + states.push('val'); + } + break; + case '(': + if ('val' == state() + || 'expr' == state()) states.push('expr'); + val += c; + break; + case ')': + if ('expr' == state() + || 'val' == state()) states.pop(); + val += c; + break; + case '{': + if ('val' == state()) states.push('object'); + val += c; + break; + case '}': + if ('object' == state()) states.pop(); + val += c; + break; + case '[': + if ('val' == state()) states.push('array'); + val += c; + break; + case ']': + if ('array' == state()) states.pop(); + val += c; + break; + case '"': + case "'": + switch (state()) { + case 'key': + states.push('key char'); + break; + case 'key char': + states.pop(); + break; + case 'string': + if (c == quote) states.pop(); + val += c; + break; + default: + states.push('string'); + val += c; + quote = c; + } + break; + case '': + break; + default: + switch (state()) { + case 'key': + case 'key char': + key += c; + break; + default: + val += c; + } + } + p = c; + } + + for (var i = 0; i < len; ++i) { + parse(str.charAt(i)); + } + + parse(','); + + if ('/' == this.input.charAt(0)) { + this.consume(1); + tok.selfClosing = true; + } + + return tok; + } + }, + + /** + * Indent | Outdent | Newline. + */ + + indent: function() { + var captures, re; + + // established regexp + if (this.indentRe) { + captures = this.indentRe.exec(this.input); + // determine regexp + } else { + // tabs + re = /^\n(\t*) */; + captures = re.exec(this.input); + + // spaces + if (captures && !captures[1].length) { + re = /^\n( *)/; + captures = re.exec(this.input); + } + + // established + if (captures && captures[1].length) this.indentRe = re; + } + + if (captures) { + var tok + , indents = captures[1].length; + + ++this.lineno; + this.consume(indents + 1); + + if (' ' == this.input[0] || '\t' == this.input[0]) { + throw new Error('Invalid indentation, you can use tabs or spaces but not both'); + } + + // blank line + if ('\n' == this.input[0]) return this.tok('newline'); + + // outdent + if (this.indentStack.length && indents < this.indentStack[0]) { + while (this.indentStack.length && this.indentStack[0] > indents) { + this.stash.push(this.tok('outdent')); + this.indentStack.shift(); + } + tok = this.stash.pop(); + // indent + } else if (indents && indents != this.indentStack[0]) { + this.indentStack.unshift(indents); + tok = this.tok('indent', indents); + // newline + } else { + tok = this.tok('newline'); + } + + return tok; + } + }, + + /** + * Pipe-less text consumed only when + * pipeless is true; + */ + + pipelessText: function() { + if (this.pipeless) { + if ('\n' == this.input[0]) return; + var i = this.input.indexOf('\n'); + if (-1 == i) i = this.input.length; + var str = this.input.substr(0, i); + this.consume(str.length); + return this.tok('text', str); + } + }, + + /** + * ':' + */ + + colon: function() { + return this.scan(/^: */, ':'); + }, + + /** + * Return the next token object, or those + * previously stashed by lookahead. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.stashed() + || this.next(); + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + next: function() { + return this.deferred() + || this.blank() + || this.eos() + || this.pipelessText() + || this.yield() + || this.doctype() + || this.interpolation() + || this["case"]() + || this.when() + || this["default"]() + || this["extends"]() + || this.append() + || this.prepend() + || this.block() + || this.include() + || this.mixin() + || this.call() + || this.conditional() + || this.each() + || this["while"]() + || this.assignment() + || this.tag() + || this.filter() + || this.code() + || this.id() + || this.className() + || this.attrs() + || this.indent() + || this.comment() + || this.colon() + || this.text(); + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js new file mode 100644 index 00000000..5de9b59c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js @@ -0,0 +1,77 @@ + +/*! + * Jade - nodes - Attrs + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'), + Block = require('./block'); + +/** + * Initialize a `Attrs` node. + * + * @api public + */ + +var Attrs = module.exports = function Attrs() { + this.attrs = []; +}; + +/** + * Inherit from `Node`. + */ + +Attrs.prototype.__proto__ = Node.prototype; + +/** + * Set attribute `name` to `val`, keep in mind these become + * part of a raw js object literal, so to quote a value you must + * '"quote me"', otherwise or example 'user.name' is literal JavaScript. + * + * @param {String} name + * @param {String} val + * @param {Boolean} escaped + * @return {Tag} for chaining + * @api public + */ + +Attrs.prototype.setAttribute = function(name, val, escaped){ + this.attrs.push({ name: name, val: val, escaped: escaped }); + return this; +}; + +/** + * Remove attribute `name` when present. + * + * @param {String} name + * @api public + */ + +Attrs.prototype.removeAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + delete this.attrs[i]; + } + } +}; + +/** + * Get attribute value by `name`. + * + * @param {String} name + * @return {String} + * @api public + */ + +Attrs.prototype.getAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + return this.attrs[i].val; + } + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js new file mode 100644 index 00000000..4f41e4a5 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js @@ -0,0 +1,33 @@ + +/*! + * Jade - nodes - BlockComment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `BlockComment` with the given `block`. + * + * @param {String} val + * @param {Block} block + * @param {Boolean} buffer + * @api public + */ + +var BlockComment = module.exports = function BlockComment(val, block, buffer) { + this.block = block; + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +BlockComment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block.js new file mode 100644 index 00000000..bb00a1d9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/block.js @@ -0,0 +1,121 @@ + +/*! + * Jade - nodes - Block + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Block` with an optional `node`. + * + * @param {Node} node + * @api public + */ + +var Block = module.exports = function Block(node){ + this.nodes = []; + if (node) this.push(node); +}; + +/** + * Inherit from `Node`. + */ + +Block.prototype.__proto__ = Node.prototype; + +/** + * Block flag. + */ + +Block.prototype.isBlock = true; + +/** + * Replace the nodes in `other` with the nodes + * in `this` block. + * + * @param {Block} other + * @api private + */ + +Block.prototype.replace = function(other){ + other.nodes = this.nodes; +}; + +/** + * Pust the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.push = function(node){ + return this.nodes.push(node); +}; + +/** + * Check if this block is empty. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.isEmpty = function(){ + return 0 == this.nodes.length; +}; + +/** + * Unshift the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.unshift = function(node){ + return this.nodes.unshift(node); +}; + +/** + * Return the "last" block, or the first `yield` node. + * + * @return {Block} + * @api private + */ + +Block.prototype.includeBlock = function(){ + var ret = this + , node; + + for (var i = 0, len = this.nodes.length; i < len; ++i) { + node = this.nodes[i]; + if (node.yield) return node; + else if (node.textOnly) continue; + else if (node.includeBlock) ret = node.includeBlock(); + else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); + } + + return ret; +}; + +/** + * Return a clone of this block. + * + * @return {Block} + * @api private + */ + +Block.prototype.clone = function(){ + var clone = new Block; + for (var i = 0, len = this.nodes.length; i < len; ++i) { + clone.push(this.nodes[i].clone()); + } + return clone; +}; + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/case.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/case.js new file mode 100644 index 00000000..08ff0337 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/case.js @@ -0,0 +1,43 @@ + +/*! + * Jade - nodes - Case + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Case` with `expr`. + * + * @param {String} expr + * @api public + */ + +var Case = exports = module.exports = function Case(expr, block){ + this.expr = expr; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Case.prototype.__proto__ = Node.prototype; + +var When = exports.When = function When(expr, block){ + this.expr = expr; + this.block = block; + this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +When.prototype.__proto__ = Node.prototype; + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/code.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/code.js new file mode 100644 index 00000000..babc6759 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/code.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Code + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Code` node with the given code `val`. + * Code may also be optionally buffered and escaped. + * + * @param {String} val + * @param {Boolean} buffer + * @param {Boolean} escape + * @api public + */ + +var Code = module.exports = function Code(val, buffer, escape) { + this.val = val; + this.buffer = buffer; + this.escape = escape; + if (val.match(/^ *else/)) this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +Code.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/comment.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/comment.js new file mode 100644 index 00000000..2e1469e7 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/comment.js @@ -0,0 +1,32 @@ + +/*! + * Jade - nodes - Comment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Comment` with the given `val`, optionally `buffer`, + * otherwise the comment may render in the output. + * + * @param {String} val + * @param {Boolean} buffer + * @api public + */ + +var Comment = module.exports = function Comment(val, buffer) { + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +Comment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js new file mode 100644 index 00000000..b8f33e56 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js @@ -0,0 +1,29 @@ + +/*! + * Jade - nodes - Doctype + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Doctype` with the given `val`. + * + * @param {String} val + * @api public + */ + +var Doctype = module.exports = function Doctype(val) { + this.val = val; +}; + +/** + * Inherit from `Node`. + */ + +Doctype.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/each.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/each.js new file mode 100644 index 00000000..f54101f1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/each.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Each + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize an `Each` node, representing iteration + * + * @param {String} obj + * @param {String} val + * @param {String} key + * @param {Block} block + * @api public + */ + +var Each = module.exports = function Each(obj, val, key, block) { + this.obj = obj; + this.val = val; + this.key = key; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Each.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/filter.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/filter.js new file mode 100644 index 00000000..851a0040 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/filter.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Filter + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , Block = require('./block'); + +/** + * Initialize a `Filter` node with the given + * filter `name` and `block`. + * + * @param {String} name + * @param {Block|Node} block + * @api public + */ + +var Filter = module.exports = function Filter(name, block, attrs) { + this.name = name; + this.block = block; + this.attrs = attrs; + this.isASTFilter = !block.nodes.every(function(node){ return node.isText }); +}; + +/** + * Inherit from `Node`. + */ + +Filter.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/index.js new file mode 100644 index 00000000..386ad2f9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/index.js @@ -0,0 +1,20 @@ + +/*! + * Jade - nodes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +exports.Node = require('./node'); +exports.Tag = require('./tag'); +exports.Code = require('./code'); +exports.Each = require('./each'); +exports.Case = require('./case'); +exports.Text = require('./text'); +exports.Block = require('./block'); +exports.Mixin = require('./mixin'); +exports.Filter = require('./filter'); +exports.Comment = require('./comment'); +exports.Literal = require('./literal'); +exports.BlockComment = require('./block-comment'); +exports.Doctype = require('./doctype'); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/literal.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/literal.js new file mode 100644 index 00000000..fde586be --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/literal.js @@ -0,0 +1,32 @@ + +/*! + * Jade - nodes - Literal + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Literal` node with the given `str. + * + * @param {String} str + * @api public + */ + +var Literal = module.exports = function Literal(str) { + this.str = str + .replace(/\\/g, "\\\\") + .replace(/\n|\r\n/g, "\\n") + .replace(/'/g, "\\'"); +}; + +/** + * Inherit from `Node`. + */ + +Literal.prototype.__proto__ = Node.prototype; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js new file mode 100644 index 00000000..8407bc79 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js @@ -0,0 +1,36 @@ + +/*! + * Jade - nodes - Mixin + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'); + +/** + * Initialize a new `Mixin` with `name` and `block`. + * + * @param {String} name + * @param {String} args + * @param {Block} block + * @api public + */ + +var Mixin = module.exports = function Mixin(name, args, block, call){ + this.name = name; + this.args = args; + this.block = block; + this.attrs = []; + this.call = call; +}; + +/** + * Inherit from `Attrs`. + */ + +Mixin.prototype.__proto__ = Attrs.prototype; + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/node.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/node.js new file mode 100644 index 00000000..e98f042c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/node.js @@ -0,0 +1,25 @@ + +/*! + * Jade - nodes - Node + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize a `Node`. + * + * @api public + */ + +var Node = module.exports = function Node(){}; + +/** + * Clone this node (return itself) + * + * @return {Node} + * @api private + */ + +Node.prototype.clone = function(){ + return this; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/tag.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/tag.js new file mode 100644 index 00000000..4b6728ad --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/tag.js @@ -0,0 +1,95 @@ + +/*! + * Jade - nodes - Tag + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'), + Block = require('./block'), + inlineTags = require('../inline-tags'); + +/** + * Initialize a `Tag` node with the given tag `name` and optional `block`. + * + * @param {String} name + * @param {Block} block + * @api public + */ + +var Tag = module.exports = function Tag(name, block) { + this.name = name; + this.attrs = []; + this.block = block || new Block; +}; + +/** + * Inherit from `Attrs`. + */ + +Tag.prototype.__proto__ = Attrs.prototype; + +/** + * Clone this tag. + * + * @return {Tag} + * @api private + */ + +Tag.prototype.clone = function(){ + var clone = new Tag(this.name, this.block.clone()); + clone.line = this.line; + clone.attrs = this.attrs; + clone.textOnly = this.textOnly; + return clone; +}; + +/** + * Check if this tag is an inline tag. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.isInline = function(){ + return ~inlineTags.indexOf(this.name); +}; + +/** + * Check if this tag's contents can be inlined. Used for pretty printing. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.canInline = function(){ + var nodes = this.block.nodes; + + function isInline(node){ + // Recurse if the node is a block + if (node.isBlock) return node.nodes.every(isInline); + return node.isText || (node.isInline && node.isInline()); + } + + // Empty tag + if (!nodes.length) return true; + + // Text-only or inline-only tag + if (1 == nodes.length) return isInline(nodes[0]); + + // Multi-line inline-only tag + if (this.block.nodes.every(isInline)) { + for (var i = 1, len = nodes.length; i < len; ++i) { + if (nodes[i-1].isText && nodes[i].isText) + return false; + } + return true; + } + + // Mixed tag + return false; +}; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/text.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/text.js new file mode 100644 index 00000000..3b5dd557 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/nodes/text.js @@ -0,0 +1,36 @@ + +/*! + * Jade - nodes - Text + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Text` node with optional `line`. + * + * @param {String} line + * @api public + */ + +var Text = module.exports = function Text(line) { + this.val = ''; + if ('string' == typeof line) this.val = line; +}; + +/** + * Inherit from `Node`. + */ + +Text.prototype.__proto__ = Node.prototype; + +/** + * Flag as text. + */ + +Text.prototype.isText = true; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/parser.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/parser.js new file mode 100644 index 00000000..92f2af0c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/parser.js @@ -0,0 +1,710 @@ + +/*! + * Jade - Parser + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Lexer = require('./lexer') + , nodes = require('./nodes'); + +/** + * Initialize `Parser` with the given input `str` and `filename`. + * + * @param {String} str + * @param {String} filename + * @param {Object} options + * @api public + */ + +var Parser = exports = module.exports = function Parser(str, filename, options){ + this.input = str; + this.lexer = new Lexer(str, options); + this.filename = filename; + this.blocks = {}; + this.mixins = {}; + this.options = options; + this.contexts = [this]; +}; + +/** + * Tags that may not contain tags. + */ + +var textOnly = exports.textOnly = ['script', 'style']; + +/** + * Parser prototype. + */ + +Parser.prototype = { + + /** + * Push `parser` onto the context stack, + * or pop and return a `Parser`. + */ + + context: function(parser){ + if (parser) { + this.contexts.push(parser); + } else { + return this.contexts.pop(); + } + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.lexer.advance(); + }, + + /** + * Skip `n` tokens. + * + * @param {Number} n + * @api private + */ + + skip: function(n){ + while (n--) this.advance(); + }, + + /** + * Single token lookahead. + * + * @return {Object} + * @api private + */ + + peek: function() { + return this.lookahead(1); + }, + + /** + * Return lexer lineno. + * + * @return {Number} + * @api private + */ + + line: function() { + return this.lexer.lineno; + }, + + /** + * `n` token lookahead. + * + * @param {Number} n + * @return {Object} + * @api private + */ + + lookahead: function(n){ + return this.lexer.lookahead(n); + }, + + /** + * Parse input returning a string of js for evaluation. + * + * @return {String} + * @api public + */ + + parse: function(){ + var block = new nodes.Block, parser; + block.line = this.line(); + + while ('eos' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + + if (parser = this.extending) { + this.context(parser); + var ast = parser.parse(); + this.context(); + // hoist mixins + for (var name in this.mixins) + ast.unshift(this.mixins[name]); + return ast; + } + + return block; + }, + + /** + * Expect the given type, or throw an exception. + * + * @param {String} type + * @api private + */ + + expect: function(type){ + if (this.peek().type === type) { + return this.advance(); + } else { + throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); + } + }, + + /** + * Accept the given `type`. + * + * @param {String} type + * @api private + */ + + accept: function(type){ + if (this.peek().type === type) { + return this.advance(); + } + }, + + /** + * tag + * | doctype + * | mixin + * | include + * | filter + * | comment + * | text + * | each + * | code + * | yield + * | id + * | class + * | interpolation + */ + + parseExpr: function(){ + switch (this.peek().type) { + case 'tag': + return this.parseTag(); + case 'mixin': + return this.parseMixin(); + case 'block': + return this.parseBlock(); + case 'case': + return this.parseCase(); + case 'when': + return this.parseWhen(); + case 'default': + return this.parseDefault(); + case 'extends': + return this.parseExtends(); + case 'include': + return this.parseInclude(); + case 'doctype': + return this.parseDoctype(); + case 'filter': + return this.parseFilter(); + case 'comment': + return this.parseComment(); + case 'text': + return this.parseText(); + case 'each': + return this.parseEach(); + case 'code': + return this.parseCode(); + case 'call': + return this.parseCall(); + case 'interpolation': + return this.parseInterpolation(); + case 'yield': + this.advance(); + var block = new nodes.Block; + block.yield = true; + return block; + case 'id': + case 'class': + var tok = this.advance(); + this.lexer.defer(this.lexer.tok('tag', 'div')); + this.lexer.defer(tok); + return this.parseExpr(); + default: + throw new Error('unexpected token "' + this.peek().type + '"'); + } + }, + + /** + * Text + */ + + parseText: function(){ + var tok = this.expect('text') + , node = new nodes.Text(tok.val); + node.line = this.line(); + return node; + }, + + /** + * ':' expr + * | block + */ + + parseBlockExpansion: function(){ + if (':' == this.peek().type) { + this.advance(); + return new nodes.Block(this.parseExpr()); + } else { + return this.block(); + } + }, + + /** + * case + */ + + parseCase: function(){ + var val = this.expect('case').val + , node = new nodes.Case(val); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * when + */ + + parseWhen: function(){ + var val = this.expect('when').val + return new nodes.Case.When(val, this.parseBlockExpansion()); + }, + + /** + * default + */ + + parseDefault: function(){ + this.expect('default'); + return new nodes.Case.When('default', this.parseBlockExpansion()); + }, + + /** + * code + */ + + parseCode: function(){ + var tok = this.expect('code') + , node = new nodes.Code(tok.val, tok.buffer, tok.escape) + , block + , i = 1; + node.line = this.line(); + while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; + block = 'indent' == this.lookahead(i).type; + if (block) { + this.skip(i-1); + node.block = this.block(); + } + return node; + }, + + /** + * comment + */ + + parseComment: function(){ + var tok = this.expect('comment') + , node; + + if ('indent' == this.peek().type) { + node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); + } else { + node = new nodes.Comment(tok.val, tok.buffer); + } + + node.line = this.line(); + return node; + }, + + /** + * doctype + */ + + parseDoctype: function(){ + var tok = this.expect('doctype') + , node = new nodes.Doctype(tok.val); + node.line = this.line(); + return node; + }, + + /** + * filter attrs? text-block + */ + + parseFilter: function(){ + var block + , tok = this.expect('filter') + , attrs = this.accept('attrs'); + + this.lexer.pipeless = true; + block = this.parseTextBlock(); + this.lexer.pipeless = false; + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * tag ':' attrs? block + */ + + parseASTFilter: function(){ + var block + , tok = this.expect('tag') + , attrs = this.accept('attrs'); + + this.expect(':'); + block = this.block(); + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * each block + */ + + parseEach: function(){ + var tok = this.expect('each') + , node = new nodes.Each(tok.code, tok.val, tok.key); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * 'extends' name + */ + + parseExtends: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + if (!this.filename) + throw new Error('the "filename" option is required to extend templates'); + + var path = this.expect('extends').val.trim() + , dir = dirname(this.filename); + + var path = join(dir, path + '.jade') + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + + parser.blocks = this.blocks; + parser.contexts = this.contexts; + this.extending = parser; + + // TODO: null node + return new nodes.Literal(''); + }, + + /** + * 'block' name block + */ + + parseBlock: function(){ + var block = this.expect('block') + , mode = block.mode + , name = block.val.trim(); + + block = 'indent' == this.peek().type + ? this.block() + : new nodes.Block(new nodes.Literal('')); + + var prev = this.blocks[name]; + + if (prev) { + switch (prev.mode) { + case 'append': + block.nodes = block.nodes.concat(prev.nodes); + prev = block; + break; + case 'prepend': + block.nodes = prev.nodes.concat(block.nodes); + prev = block; + break; + } + } + + block.mode = mode; + return this.blocks[name] = prev || block; + }, + + /** + * include block? + */ + + parseInclude: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + var path = this.expect('include').val.trim() + , dir = dirname(this.filename); + + if (!this.filename) + throw new Error('the "filename" option is required to use includes'); + + // no extension + if (!~basename(path).indexOf('.')) { + path += '.jade'; + } + + // non-jade + if ('.jade' != path.substr(-5)) { + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8'); + return new nodes.Literal(str); + } + + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + parser.blocks = this.blocks; + parser.mixins = this.mixins; + + this.context(parser); + var ast = parser.parse(); + this.context(); + ast.filename = path; + + if ('indent' == this.peek().type) { + ast.includeBlock().push(this.block()); + } + + return ast; + }, + + /** + * call ident block + */ + + parseCall: function(){ + var tok = this.expect('call') + , name = tok.val + , args = tok.args + , mixin = new nodes.Mixin(name, args, new nodes.Block, true); + + this.tag(mixin); + if (mixin.block.isEmpty()) mixin.block = null; + return mixin; + }, + + /** + * mixin block + */ + + parseMixin: function(){ + var tok = this.expect('mixin') + , name = tok.val + , args = tok.args + , mixin; + + // definition + if ('indent' == this.peek().type) { + mixin = new nodes.Mixin(name, args, this.block(), false); + this.mixins[name] = mixin; + return mixin; + // call + } else { + return new nodes.Mixin(name, args, null, true); + } + }, + + /** + * indent (text | newline)* outdent + */ + + parseTextBlock: function(){ + var block = new nodes.Block; + block.line = this.line(); + var spaces = this.expect('indent').val; + if (null == this._spaces) this._spaces = spaces; + var indent = Array(spaces - this._spaces + 1).join(' '); + while ('outdent' != this.peek().type) { + switch (this.peek().type) { + case 'newline': + this.advance(); + break; + case 'indent': + this.parseTextBlock().nodes.forEach(function(node){ + block.push(node); + }); + break; + default: + var text = new nodes.Text(indent + this.advance().val); + text.line = this.line(); + block.push(text); + } + } + + if (spaces == this._spaces) this._spaces = null; + this.expect('outdent'); + return block; + }, + + /** + * indent expr* outdent + */ + + block: function(){ + var block = new nodes.Block; + block.line = this.line(); + this.expect('indent'); + while ('outdent' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + this.expect('outdent'); + return block; + }, + + /** + * interpolation (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseInterpolation: function(){ + var tok = this.advance(); + var tag = new nodes.Tag(tok.val); + tag.buffer = true; + return this.tag(tag); + }, + + /** + * tag (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseTag: function(){ + // ast-filter look-ahead + var i = 2; + if ('attrs' == this.lookahead(i).type) ++i; + if (':' == this.lookahead(i).type) { + if ('indent' == this.lookahead(++i).type) { + return this.parseASTFilter(); + } + } + + var tok = this.advance() + , tag = new nodes.Tag(tok.val); + + tag.selfClosing = tok.selfClosing; + + return this.tag(tag); + }, + + /** + * Parse tag. + */ + + tag: function(tag){ + var dot; + + tag.line = this.line(); + + // (attrs | class | id)* + out: + while (true) { + switch (this.peek().type) { + case 'id': + case 'class': + var tok = this.advance(); + tag.setAttribute(tok.type, "'" + tok.val + "'"); + continue; + case 'attrs': + var tok = this.advance() + , obj = tok.attrs + , escaped = tok.escaped + , names = Object.keys(obj); + + if (tok.selfClosing) tag.selfClosing = true; + + for (var i = 0, len = names.length; i < len; ++i) { + var name = names[i] + , val = obj[name]; + tag.setAttribute(name, val, escaped[name]); + } + continue; + default: + break out; + } + } + + // check immediate '.' + if ('.' == this.peek().val) { + dot = tag.textOnly = true; + this.advance(); + } + + // (text | code | ':')? + switch (this.peek().type) { + case 'text': + tag.block.push(this.parseText()); + break; + case 'code': + tag.code = this.parseCode(); + break; + case ':': + this.advance(); + tag.block = new nodes.Block; + tag.block.push(this.parseExpr()); + break; + } + + // newline* + while ('newline' == this.peek().type) this.advance(); + + tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); + + // script special-case + if ('script' == tag.name) { + var type = tag.getAttribute('type'); + if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { + tag.textOnly = false; + } + } + + // block? + if ('indent' == this.peek().type) { + if (tag.textOnly) { + this.lexer.pipeless = true; + tag.block = this.parseTextBlock(); + this.lexer.pipeless = false; + } else { + var block = this.block(); + if (tag.block) { + for (var i = 0, len = block.nodes.length; i < len; ++i) { + tag.block.push(block.nodes[i]); + } + } else { + tag.block = block; + } + } + } + + return tag; + } +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/runtime.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/runtime.js new file mode 100644 index 00000000..fb711f5e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/runtime.js @@ -0,0 +1,174 @@ + +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/self-closing.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/self-closing.js new file mode 100644 index 00000000..05487712 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/self-closing.js @@ -0,0 +1,19 @@ + +/*! + * Jade - self closing tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'meta' + , 'img' + , 'link' + , 'input' + , 'source' + , 'area' + , 'base' + , 'col' + , 'br' + , 'hr' +]; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/utils.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/utils.js new file mode 100644 index 00000000..ff46d022 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/lib/utils.js @@ -0,0 +1,49 @@ + +/*! + * Jade - utils + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Convert interpolation in the given string to JavaScript. + * + * @param {String} str + * @return {String} + * @api private + */ + +var interpolate = exports.interpolate = function(str){ + return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){ + return escape + ? str + : "' + " + + ('!' == flag ? '' : 'escape') + + "((interp = " + code.replace(/\\'/g, "'") + + ") == null ? '' : interp) + '"; + }); +}; + +/** + * Escape single quotes in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +var escape = exports.escape = function(str) { + return str.replace(/'/g, "\\'"); +}; + +/** + * Interpolate, and escape the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.text = function(str){ + return interpolate(escape(str)); +}; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej new file mode 100644 index 00000000..69244ff8 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej @@ -0,0 +1,5 @@ +--- /dev/null ++++ .gitignore +@@ -0,0 +1,2 @@ ++node_modules/ ++npm-debug.log \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000..432d1aeb --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +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/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown new file mode 100644 index 00000000..b4dd75fd --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown @@ -0,0 +1,54 @@ +mkdirp +====== + +Like `mkdir -p`, but in node.js! + +example +======= + +pow.js +------ + var mkdirp = require('mkdirp'); + + mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') + }); + +Output + pow! + +And now /tmp/foo/bar/baz exists, huzzah! + +methods +======= + +var mkdirp = require('mkdirp'); + +mkdirp(dir, mode, cb) +--------------------- + +Create a new directory and any necessary subdirectories at `dir` with octal +permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +mkdirp.sync(dir, mode) +---------------------- + +Synchronously create a new directory and any necessary subdirectories at `dir` +with octal permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +install +======= + +With [npm](http://npmjs.org) do: + + npm install mkdirp + +license +======= + +MIT/X11 diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js new file mode 100644 index 00000000..e6924212 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig new file mode 100644 index 00000000..77414622 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej new file mode 100644 index 00000000..81e7f431 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej @@ -0,0 +1,19 @@ +--- examples/pow.js ++++ examples/pow.js +@@ -1,6 +1,15 @@ +-var mkdirp = require('mkdirp').mkdirp; ++var mkdirp = require('../').mkdirp, ++ mkdirpSync = require('../').mkdirpSync; + + mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') + }); ++ ++try { ++ mkdirpSync('/tmp/bar/foo/baz', 0755); ++ console.log('double pow!'); ++} ++catch (ex) { ++ console.log(ex); ++} \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js new file mode 100644 index 00000000..25f43adf --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js @@ -0,0 +1,79 @@ +var path = require('path'); +var fs = require('fs'); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, mode, f) { + if (typeof mode === 'function' || mode === undefined) { + f = mode; + mode = 0777 & (~process.umask()); + } + + var cb = f || function () {}; + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + fs.mkdir(p, mode, function (er) { + if (!er) return cb(); + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), mode, function (er) { + if (er) cb(er); + else mkdirP(p, mode, cb); + }); + break; + + case 'EEXIST': + fs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original EEXIST be the failure reason. + if (er2 || !stat.isDirectory()) cb(er) + else cb(); + }); + break; + + default: + cb(er); + break; + } + }); +} + +mkdirP.sync = function sync (p, mode) { + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + try { + fs.mkdirSync(p, mode) + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + var err1 = sync(path.dirname(p), mode) + if (err1) throw err1; + else return sync(p, mode); + break; + + case 'EEXIST' : + var stat; + try { + stat = fs.statSync(p); + } + catch (err1) { + throw err0 + } + if (!stat.isDirectory()) throw err0; + else return null; + break; + default : + throw err0 + break; + } + } + + return null; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json new file mode 100644 index 00000000..78638866 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json @@ -0,0 +1,37 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": [ + "mkdir", + "directory" + ], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "devDependencies": { + "tap": "0.0.x" + }, + "license": "MIT/X11", + "engines": { + "node": "*" + }, + "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", + "readmeFilename": "README.markdown", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.3.0", + "_from": "mkdirp@0.3.0" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js new file mode 100644 index 00000000..520dcb8e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js @@ -0,0 +1,38 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +test('chmod-pre', function (t) { + var mode = 0744 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); + t.end(); + }); + }); +}); + +test('chmod', function (t) { + var mode = 0755 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.end(); + }); + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js new file mode 100644 index 00000000..0eb70998 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js @@ -0,0 +1,37 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +// a file in the way +var itw = ps.slice(0, 3).join('/'); + + +test('clobber-pre', function (t) { + console.error("about to write to "+itw) + fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); + + fs.stat(itw, function (er, stat) { + t.ifError(er) + t.ok(stat && stat.isFile(), 'should be file') + t.end() + }) +}) + +test('clobber', function (t) { + t.plan(2); + mkdirp(file, 0755, function (err) { + t.ok(err); + t.equal(err.code, 'ENOTDIR'); + t.end(); + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js new file mode 100644 index 00000000..b07cd70c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('woo', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js new file mode 100644 index 00000000..23a7abbd --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('async perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); + +test('async root perm', function (t) { + mkdirp('/tmp', 0755, function (err) { + if (err) t.fail(err); + t.end(); + }); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js new file mode 100644 index 00000000..f685f609 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js @@ -0,0 +1,39 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; + + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); + +test('sync root perm', function (t) { + t.plan(1); + + var file = '/tmp'; + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js new file mode 100644 index 00000000..96a04476 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js @@ -0,0 +1,41 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('race', function (t) { + t.plan(4); + var ps = [ '', 'tmp' ]; + + for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); + } + var file = ps.join('/'); + + var res = 2; + mk(file, function () { + if (--res === 0) t.end(); + }); + + mk(file, function () { + if (--res === 0) t.end(); + }); + + function mk (file, cb) { + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + if (cb) cb(); + } + }) + }) + }); + } +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js new file mode 100644 index 00000000..79858243 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('rel', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var cwd = process.cwd(); + process.chdir('/tmp'); + + var file = [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + process.chdir(cwd); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js new file mode 100644 index 00000000..e0e389de --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js @@ -0,0 +1,27 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + var err = mkdirp.sync(file, 0755); + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js new file mode 100644 index 00000000..64ccafe2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('implicit mode from umask', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0777 & (~process.umask())); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js new file mode 100644 index 00000000..83cba560 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js @@ -0,0 +1,27 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('umask sync modes', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + var err = mkdirp.sync(file); + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, (0777 & (~process.umask()))); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/package.json new file mode 100644 index 00000000..689d82d7 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/package.json @@ -0,0 +1,48 @@ +{ + "name": "jade", + "description": "Jade template engine", + "version": "0.26.3", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/jade" + }, + "main": "./index.js", + "bin": { + "jade": "./bin/jade" + }, + "man": [ + "./jade.1" + ], + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "devDependencies": { + "mocha": "*", + "markdown": "*", + "stylus": "*", + "uubench": "*", + "should": "*", + "less": "*", + "uglify-js": "*" + }, + "component": { + "scripts": { + "jade": "runtime.js" + } + }, + "scripts": { + "prepublish": "npm prune" + }, + "bugs": { + "url": "https://github.com/visionmedia/jade/issues" + }, + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/visionmedia/jade", + "_id": "jade@0.26.3", + "_from": "jade@0.26.3" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.js new file mode 100644 index 00000000..0f549077 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.js @@ -0,0 +1,179 @@ + +jade = (function(exports){ +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; + + return exports; + +})({}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.min.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.min.js new file mode 100644 index 00000000..1714efb0 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/runtime.min.js @@ -0,0 +1 @@ +jade=function(exports){Array.isArray||(Array.isArray=function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}),Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),exports.merge=function merge(a,b){var ac=a["class"],bc=b["class"];if(ac||bc)ac=ac||[],bc=bc||[],Array.isArray(ac)||(ac=[ac]),Array.isArray(bc)||(bc=[bc]),ac=ac.filter(nulls),bc=bc.filter(nulls),a["class"]=ac.concat(bc).join(" ");for(var key in b)key!="class"&&(a[key]=b[key]);return a};function nulls(val){return val!=null}return exports.attrs=function attrs(obj,escaped){var buf=[],terse=obj.terse;delete obj.terse;var keys=Object.keys(obj),len=keys.length;if(len){buf.push("");for(var i=0;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err},exports}({}); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/test.jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/test.jade new file mode 100644 index 00000000..b3a89889 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/test.jade @@ -0,0 +1,7 @@ +p. + This is a large + body of text for + this tag. + + Nothing too + exciting. \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/head.jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/head.jade new file mode 100644 index 00000000..85154062 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/head.jade @@ -0,0 +1,5 @@ +head + script(src='/jquery.js') + yield + if false + script(src='/jquery.ui.js') diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.jade new file mode 100644 index 00000000..1032c5fa --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.jade @@ -0,0 +1,22 @@ + +tag = 'p' +foo = 'bar' + +#{tag} value +#{tag}(foo='bar') value +#{foo ? 'a' : 'li'}(something) here + +mixin item(icon) + li + if attributes.href + a(attributes) + img.icon(src=icon) + block + else + span(attributes) + img.icon(src=icon) + block + +ul + +item('contact') Contact + +item(href='/contact') Contact diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.js new file mode 100644 index 00000000..226e8c01 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/index.js @@ -0,0 +1,11 @@ + +/** + * Module dependencies. + */ + +var jade = require('../'); + +jade.renderFile('testing/index.jade', { pretty: true, debug: true, compileDebug: false }, function(err, str){ + if (err) throw err; + console.log(str); +}); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/layout.jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/layout.jade new file mode 100644 index 00000000..6923cf15 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/layout.jade @@ -0,0 +1,6 @@ +html + include head + script(src='/caustic.js') + script(src='/app.js') + body + block content \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.jade b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.jade new file mode 100644 index 00000000..3c636b7c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.jade @@ -0,0 +1,7 @@ +h1 Tobi +p Is a ferret + +ul + li: a foo + li: a bar + li: a baz \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.js new file mode 100644 index 00000000..2ecc45ed --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/node_modules/jade/testing/user.js @@ -0,0 +1,27 @@ +function anonymous(locals, attrs, escape, rethrow) { +var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow; +var __jade = [{ lineno: 1, filename: "testing/user.jade" }]; +try { +var buf = []; +with (locals || {}) { +var interp; +__jade.unshift({ lineno: 1, filename: __jade[0].filename }); +__jade.unshift({ lineno: 1, filename: __jade[0].filename }); +buf.push('

      Tobi'); +__jade.unshift({ lineno: undefined, filename: __jade[0].filename }); +__jade.shift(); +buf.push('

      '); +__jade.shift(); +__jade.unshift({ lineno: 2, filename: __jade[0].filename }); +buf.push('

      Is a ferret'); +__jade.unshift({ lineno: undefined, filename: __jade[0].filename }); +__jade.shift(); +buf.push('

      '); +__jade.shift(); +__jade.shift(); +} +return buf.join(""); +} catch (err) { + rethrow(err, __jade[0].filename, __jade[0].lineno); +} +} \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/package.json new file mode 100644 index 00000000..bf8992e4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/mocha/package.json @@ -0,0 +1,60 @@ +{ + "name": "mocha", + "version": "1.13.0", + "description": "simple, flexible, fun test framework", + "keywords": [ + "mocha", + "test", + "bdd", + "tdd", + "tap" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/mocha.git" + }, + "main": "./index", + "bin": { + "mocha": "./bin/mocha", + "_mocha": "./bin/_mocha" + }, + "engines": { + "node": ">= 0.4.x" + }, + "scripts": { + "test": "make test-all" + }, + "dependencies": { + "commander": "0.6.1", + "growl": "1.7.x", + "jade": "0.26.3", + "diff": "1.0.7", + "debug": "*", + "mkdirp": "0.3.5", + "glob": "3.2.3" + }, + "devDependencies": { + "should": "*", + "coffee-script": "1.2" + }, + "files": [ + "bin", + "images", + "lib", + "index.js", + "mocha.css", + "mocha.js" + ], + "readme": " [![Build Status](https://secure.travis-ci.org/visionmedia/mocha.png)](http://travis-ci.org/visionmedia/mocha)\n\n [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://visionmedia.github.io/mocha)\n\n Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://visionmedia.github.io/mocha).\n\n## Contributors\n\n```\n\n project : mocha\n repo age : 1 year, 7 months\n active : 272 days\n commits : 1116\n files : 123\n authors :\n 504 TJ Holowaychuk 45.2%\n 389 Tj Holowaychuk 34.9%\n 31 Guillermo Rauch 2.8%\n 13 Attila Domokos 1.2%\n 9 John Firebaugh 0.8%\n 8 Jo Liss 0.7%\n 7 Nathan Rajlich 0.6%\n 6 James Carr 0.5%\n 6 Brendan Nee 0.5%\n 5 Aaron Heckmann 0.4%\n 4 hokaccha 0.4%\n 4 Xavier Antoviaque 0.4%\n 4 Joshua Krall 0.4%\n 3 Wil Moore III 0.3%\n 3 Jesse Dailey 0.3%\n 3 Nathan Bowser 0.3%\n 3 Tyson Tate 0.3%\n 3 Cory Thomas 0.3%\n 3 Ryunosuke SATO 0.3%\n 3 Paul Miller 0.3%\n 3 Ben Lindsey 0.3%\n 2 Forbes Lindesay 0.2%\n 2 Konstantin Käfer 0.2%\n 2 Brian Beck 0.2%\n 2 Merrick Christensen 0.2%\n 2 Michael Riley 0.2%\n 2 David Henderson 0.2%\n 2 Nathan Alderson 0.2%\n 2 Paul Armstrong 0.2%\n 2 Pete Hawkins 0.2%\n 2 Quang Van 0.2%\n 2 Raynos 0.2%\n 2 Jonas Westerlund 0.2%\n 2 Domenic Denicola 0.2%\n 2 Shawn Krisman 0.2%\n 2 Simon Gaeremynck 0.2%\n 2 FARKAS Máté 0.2%\n 2 Timo Tijhof 0.2%\n 2 Justin DuJardin 0.2%\n 2 Juzer Ali 0.2%\n 2 Ian Storm Taylor 0.2%\n 2 Arian Stolwijk 0.2%\n 2 domenic 0.2%\n 1 Richard Dingwall 0.1%\n 1 Russ Bradberry 0.1%\n 1 Sasha Koss 0.1%\n 1 Seiya Konno 0.1%\n 1 Standa Opichal 0.1%\n 1 Steve Mason 0.1%\n 1 Will Langstroth 0.1%\n 1 Yanis Wang 0.1%\n 1 Yuest Wang 0.1%\n 1 abrkn 0.1%\n 1 airportyh 0.1%\n 1 fengmk2 0.1%\n 1 tgautier@yahoo.com 0.1%\n 1 traleig1 0.1%\n 1 vlad 0.1%\n 1 yuitest 0.1%\n 1 Adam Crabtree 0.1%\n 1 Andreas Brekken 0.1%\n 1 Atsuya Takagi 0.1%\n 1 Austin Birch 0.1%\n 1 Bjørge Næss 0.1%\n 1 Brian Moore 0.1%\n 1 Bryan Donovan 0.1%\n 1 Casey Foster 0.1%\n 1 Corey Butler 0.1%\n 1 Dave McKenna 0.1%\n 1 Fedor Indutny 0.1%\n 1 Florian Margaine 0.1%\n 1 Frederico Silva 0.1%\n 1 Fredrik Lindin 0.1%\n 1 Gareth Murphy 0.1%\n 1 Gavin Mogan 0.1%\n 1 Greg Perkins 0.1%\n 1 Harry Brundage 0.1%\n 1 Herman Junge 0.1%\n 1 Ian Young 0.1%\n 1 Ivan 0.1%\n 1 Jaakko Salonen 0.1%\n 1 Jakub Nešetřil 0.1%\n 1 James Bowes 0.1%\n 1 James Lal 0.1%\n 1 Jason Barry 0.1%\n 1 Javier Aranda 0.1%\n 1 Jeff Kunkle 0.1%\n 1 Jonathan Creamer 0.1%\n 1 Jussi Virtanen 0.1%\n 1 Katie Gengler 0.1%\n 1 Kazuhito Hokamura 0.1%\n 1 Koen Punt 0.1%\n 1 Laszlo Bacsi 0.1%\n 1 László Bácsi 0.1%\n 1 Maciej Małecki 0.1%\n 1 Matt Robenolt 0.1%\n 1 Matt Smith 0.1%\n 1 Matthew Shanley 0.1%\n 1 Michael Schoonmaker 0.1%\n 1 Phil Sung 0.1%\n 1 R56 0.1%\n```\n\n## Links\n\n - [Google Group](http://groups.google.com/group/mochajs)\n - [Wiki](https://github.com/visionmedia/mocha/wiki)\n - Mocha [Extensions and reporters](https://github.com/visionmedia/mocha/wiki)\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/mocha/issues" + }, + "homepage": "https://github.com/visionmedia/mocha", + "_id": "mocha@1.13.0", + "_from": "mocha@1.13.x" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/LICENSE new file mode 100644 index 00000000..352c2874 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/LICENSE @@ -0,0 +1,43 @@ +Copyright 2013, NAN contributors: + - Rod Vagg + - Benjamin Byholm + - Trevor Norris +(the "Original Author") +All rights reserved. + +MIT +no-false-attribs License + +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. + +Distributions of all or part of the Software intended to be used +by the recipients as they would use the unmodified Software, +containing modifications that substantially alter, remove, or +disable functionality of the Software, outside of the documented +configuration mechanisms provided by the Software, shall be +modified such that the Original Author's bug reporting email +addresses and urls are either replaced with the contact information +of the parties responsible for the changes, or removed entirely. + +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. + + +Except where noted, this license applies to any and all software +programs and associated documentation files created by the +Original Author, when distributed with the Software. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/README.md new file mode 100644 index 00000000..36842c54 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/README.md @@ -0,0 +1,792 @@ +Native Abstractions for Node.js +=============================== + +**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.** + +***Current version: 0.6.0*** *(See [nan.h](https://github.com/rvagg/nan/blob/master/nan.h) for complete ChangeLog)* + +[![NPM](https://nodei.co/npm/nan.png?downloads=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6)](https://nodei.co/npm/nan/) + +Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.11/0.12, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle. + +This project also contains some helper utilities that make addon development a bit more pleasant. + + * **[News & Updates](#news)** + * **[Usage](#usage)** + * **[Example](#example)** + * **[API](#api)** + + +## News & Updates + +### Nov-2013: Node 0.11.9+ breaking V8 change + +The version of V8 that's shipping with Node 0.11.9+ has changed the signature for new `Local`s to: `v8::Local::New(isolate, value)`, i.e. introducing the `isolate` argument and therefore breaking all new `Local` declarations for previous versions. NAN 0.6+ now includes a `NanNewLocal(value)` that can be used in place to work around this incompatibility and maintain compatibility with 0.8->0.11.9+ (minus a few early 0.11 releases). + +For example, if you wanted to return a `null` on a callback you will have to change the argument from `v8::Local::New(v8::Null())` to `NanNewLocal(v8::Null())`. + +### Nov-2013: Change to binding.gyp `"include_dirs"` for NAN + +Inclusion of NAN in a project's binding.gyp is now greatly simplified. You can now just use `" +## Usage + +Simply add **NAN** as a dependency in the *package.json* of your Node addon: + +``` bash +$ npm install --save nan +``` + +Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include "nan.h"` in your *.cpp* files: + +``` python +"include_dirs" : [ + "` when compiling your addon. + + +## Example + +See **[LevelDOWN](https://github.com/rvagg/node-leveldown/pull/48)** for a full example of **NAN** in use. + +For a simpler example, see the **[async pi estimation example](https://github.com/rvagg/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**. + +Compare to the current 0.10 version of this example, found in the [node-addon-examples](https://github.com/rvagg/node-addon-examples/tree/master/9_async_work) repository and also a 0.11 version of the same found [here](https://github.com/kkoopa/node-addon-examples/tree/5c01f58fc993377a567812597e54a83af69686d7/9_async_work). + +Note that there is no embedded version sniffing going on here and also the async work is made much simpler, see below for details on the `NanAsyncWorker` class. + +```c++ +// addon.cc +#include +#include "nan.h" +// ... + +using namespace v8; + +void InitAll(Handle exports) { + exports->Set(NanSymbol("calculateSync"), + FunctionTemplate::New(CalculateSync)->GetFunction()); + + exports->Set(NanSymbol("calculateAsync"), + FunctionTemplate::New(CalculateAsync)->GetFunction()); +} + +NODE_MODULE(addon, InitAll) +``` + +```c++ +// sync.h +#include +#include "nan.h" + +NAN_METHOD(CalculateSync); +``` + +```c++ +// sync.cc +#include +#include "nan.h" +#include "sync.h" +// ... + +using namespace v8; + +// Simple synchronous access to the `Estimate()` function +NAN_METHOD(CalculateSync) { + NanScope(); + + // expect a number as the first argument + int points = args[0]->Uint32Value(); + double est = Estimate(points); + + NanReturnValue(Number::New(est)); +} +``` + +```c++ +// async.cc +#include +#include "nan.h" +#include "async.h" + +// ... + +using namespace v8; + +class PiWorker : public NanAsyncWorker { + public: + PiWorker(NanCallback *callback, int points) + : NanAsyncWorker(callback), points(points) {} + ~PiWorker() {} + + // Executed inside the worker-thread. + // It is not safe to access V8, or V8 data structures + // here, so everything we need for input and output + // should go on `this`. + void Execute () { + estimate = Estimate(points); + } + + // Executed when the async work is complete + // this function will be run inside the main event loop + // so it is safe to use V8 again + void HandleOKCallback () { + NanScope(); + + Local argv[] = { + Local::New(Null()) + , Number::New(estimate) + }; + + callback->Call(2, argv); + }; + + private: + int points; + double estimate; +}; + +// Asynchronous access to the `Estimate()` function +NAN_METHOD(CalculateAsync) { + NanScope(); + + int points = args[0]->Uint32Value(); + NanCallback *callback = new NanCallback(args[1].As()); + + NanAsyncQueueWorker(new PiWorker(callback, points)); + NanReturnUndefined(); +} +``` + + +## API + + * NAN_METHOD + * NAN_GETTER + * NAN_SETTER + * NAN_PROPERTY_GETTER + * NAN_PROPERTY_SETTER + * NAN_PROPERTY_ENUMERATOR + * NAN_PROPERTY_DELETER + * NAN_PROPERTY_QUERY + * NAN_INDEX_GETTER + * NAN_INDEX_SETTER + * NAN_INDEX_ENUMERATOR + * NAN_INDEX_DELETER + * NAN_INDEX_QUERY + * NAN_WEAK_CALLBACK + * NAN_DEPRECATED + * NAN_INLINE + * NanNewLocal + * NanReturnValue + * NanReturnUndefined + * NanReturnNull + * NanReturnEmptyString + * NanScope + * NanLocker + * NanUnlocker + * NanGetInternalFieldPointer + * NanSetInternalFieldPointer + * NanObjectWrapHandle + * NanMakeWeak + * NanSymbol + * NanGetPointerSafe + * NanSetPointerSafe + * NanFromV8String + * NanBooleanOptionValue + * NanUInt32OptionValue + * NanError, NanTypeError, NanRangeError + * NanThrowError, NanThrowTypeError, NanThrowRangeError, NanThrowError(Handle), NanThrowError(Handle, int) + * NanNewBufferHandle(char *, size_t, FreeCallback, void *), NanNewBufferHandle(char *, uint32_t), NanNewBufferHandle(uint32_t) + * NanBufferUse(char *, uint32_t) + * NanNewContextHandle + * NanHasInstance + * NanPersistentToLocal + * NanDispose + * NanAssignPersistent + * NanInitPersistent + * NanCallback + * NanAsyncWorker + * NanAsyncQueueWorker + + +### NAN_METHOD(methodname) + +Use `NAN_METHOD` to define your V8 accessible methods: + +```c++ +// .h: +class Foo : public node::ObjectWrap { + ... + + static NAN_METHOD(Bar); + static NAN_METHOD(Baz); +} + + +// .cc: +NAN_METHOD(Foo::Bar) { + ... +} + +NAN_METHOD(Foo::Baz) { + ... +} +``` + +The reason for this macro is because of the method signature change in 0.11: + +```c++ +// 0.10 and below: +Handle name(const Arguments& args) + +// 0.11 and above +void name(const FunctionCallbackInfo& args) +``` + +The introduction of `FunctionCallbackInfo` brings additional complications: + + +### NAN_GETTER(methodname) + +Use `NAN_GETTER` to declare your V8 accessible getters. You get a `Local` `property` and an appropriately typed `args` object that can act like the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_GETTER`. + + +### NAN_SETTER(methodname) + +Use `NAN_SETTER` to declare your V8 accessible setters. Same as `NAN_GETTER` but you also get a `Local` `value` object to work with. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_SETTER`. + + +### NAN_PROPERTY_GETTER(cbname) +Use `NAN_PROPERTY_GETTER` to declare your V8 accessible property getters. You get a `Local` `property` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_GETTER`. + + +### NAN_PROPERTY_SETTER(cbname) +Use `NAN_PROPERTY_SETTER` to declare your V8 accessible property setters. Same as `NAN_PROPERTY_GETTER` but you also get a `Local` `value` object to work with. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_SETTER`. + + +### NAN_PROPERTY_ENUMERATOR(cbname) +Use `NAN_PROPERTY_ENUMERATOR` to declare your V8 accessible property enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_PROPERTY_GETTER` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_ENUMERATOR`. + + +### NAN_PROPERTY_DELETER(cbname) +Use `NAN_PROPERTY_DELETER` to declare your V8 accessible property deleters. Same as `NAN_PROPERTY_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_DELETER`. + + +### NAN_PROPERTY_QUERY(cbname) +Use `NAN_PROPERTY_QUERY` to declare your V8 accessible property queries. Same as `NAN_PROPERTY_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_QUERY`. + + +### NAN_INDEX_GETTER(cbname) +Use `NAN_INDEX_GETTER` to declare your V8 accessible index getters. You get a `uint32_t` `index` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_GETTER`. + + +### NAN_INDEX_SETTER(cbname) +Use `NAN_INDEX_SETTER` to declare your V8 accessible index setters. Same as `NAN_INDEX_GETTER` but you also get a `Local` `value` object to work with. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_SETTER`. + + +### NAN_INDEX_ENUMERATOR(cbname) +Use `NAN_INDEX_ENUMERATOR` to declare your V8 accessible index enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_INDEX_GETTER` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_ENUMERATOR`. + + +### NAN_INDEX_DELETER(cbname) +Use `NAN_INDEX_DELETER` to declare your V8 accessible index deleters. Same as `NAN_INDEX_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_DELETER`. + + +### NAN_INDEX_QUERY(cbname) +Use `NAN_INDEX_QUERY` to declare your V8 accessible index queries. Same as `NAN_INDEX_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_QUERY`. + + +### NAN_WEAK_CALLBACK(type, cbname) + +Use `NAN_WEAK_CALLBACK` to declare your V8 WeakReference callbacks. There is an object argument accessible through `NAN_WEAK_CALLBACK_OBJECT`. The `type` argument gives the type of the `data` argument, accessible through `NAN_WEAK_CALLBACK_DATA(type)`. + +```c++ +static NAN_WEAK_CALLBACK(BufferReference*, WeakCheck) { + if (NAN_WEAK_CALLBACK_DATA(BufferReference*)->noLongerNeeded_) { + delete NAN_WEAK_CALLBACK_DATA(BufferReference*); + } else { + // Still in use, revive, prevent GC + NanMakeWeak(NAN_WEAK_CALLBACK_OBJECT, NAN_WEAK_CALLBACK_DATA(BufferReference*), &WeakCheck); + } +} +``` + + +### NAN_DEPRECATED(declarator) +Declares a function as deprecated. Identical to `V8_DEPRECATED`. + +```c++ +static NAN_DEPRECATED(NAN_METHOD(foo)) { + ... +} +``` + + +### NAN_INLINE(declarator) +Inlines a function. Identical to `V8_INLINE`. + +```c++ +static NAN_INLINE(int foo(int bar)) { + ... +} +``` + + +### NanNewLocal<T>(Handle<Value>) + +Use `NanNewLocal` in place of `v8::Local::New(...)` as this function +requires an `isolate` argument in recent versions of V8 but not in older versions. + +```c++ +NanNewLocal(v8::Null()) +``` + + +### NanReturnValue(Handle<Value>) + +Use `NanReturnValue` when you want to return a value from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Bar) { + ... + + NanReturnValue(String::New("FooBar!")); +} +``` + +No `return` statement required. + + +### NanReturnUndefined() + +Use `NanReturnUndefined` when you don't want to return anything from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnUndefined(); +} +``` + + +### NanReturnNull() + +Use `NanReturnNull` when you want to return `Null` from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnNull(); +} +``` + + +### NanReturnEmptyString() + +Use `NanReturnEmptyString` when you want to return an empty `String` from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnEmptyString(); +} +``` + + +### NanScope() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanScope()` necessary, use it in place of `HandleScope scope`: + +```c++ +NAN_METHOD(Foo::Bar) { + NanScope(); + + NanReturnValue(String::New("FooBar!")); +} +``` + + +### NanLocker() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanLocker()` necessary, use it in place of `Locker locker`: + +```c++ +NAN_METHOD(Foo::Bar) { + NanLocker(); + ... + NanUnlocker(); +} +``` + + +### NanUnlocker() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanUnlocker()` necessary, use it in place of `Unlocker unlocker`: + +```c++ +NAN_METHOD(Foo::Bar) { + NanLocker(); + ... + NanUnlocker(); +} +``` + + +### void * NanGetInternalFieldPointer(Handle<Object>, int) + +Gets a pointer to the internal field with at `index` from a V8 `Object` handle. + +```c++ +Local obj; +... +NanGetInternalFieldPointer(obj, 0); +``` + +### void NanSetInternalFieldPointer(Handle<Object>, int, void *) + +Sets the value of the internal field at `index` on a V8 `Object` handle. + +```c++ +static Persistent dataWrapperCtor; +... +Local wrapper = NanPersistentToLocal(dataWrapperCtor)->NewInstance(); +NanSetInternalFieldPointer(wrapper, 0, this); +``` + + +### Local<Object> NanObjectWrapHandle(Object) + +When you want to fetch the V8 object handle from a native object you've wrapped with Node's `ObjectWrap`, you should use `NanObjectWrapHandle`: + +```c++ +NanObjectWrapHandle(iterator)->Get(String::NewSymbol("end")) +``` + + +### NanMakeWeak(Persistent<T>, parameter, callback) + +Make a persistent reference weak. + + +### String NanSymbol(char *) + +This isn't strictly about compatibility, it's just an easier way to create string symbol objects (i.e. `String::NewSymbol(x)`), for getting and setting object properties, or names of objects. + +```c++ +bool foo = false; +if (obj->Has(NanSymbol("foo"))) + foo = optionsObj->Get(NanSymbol("foo"))->BooleanValue() +``` + + +### Type NanGetPointerSafe(Type *[, Type]) + +A helper for getting values from optional pointers. If the pointer is `NULL`, the function returns the optional default value, which defaults to `0`. Otherwise, the function returns the value the pointer points to. + +```c++ +char *plugh(uint32_t *optional) { + char res[] = "xyzzy"; + uint32_t param = NanGetPointerSafe(optional, 0x1337); + switch (param) { + ... + } + NanSetPointerSafe(optional, 0xDEADBEEF); +} +``` + + +### bool NanSetPointerSafe(Type *, Type) + +A helper for setting optional argument pointers. If the pointer is `NULL`, the function simply return `false`. Otherwise, the value is assigned to the variable the pointer points to. + +```c++ +const char *plugh(size_t *outputsize) { + char res[] = "xyzzy"; + if !(NanSetPointerSafe(outputsize, strlen(res) + 1)) { + ... + } + + ... +} +``` + + +### char* NanFromV8String(Handle<Value>[, enum Nan::Encoding, size_t *, char *, size_t, int]) + +When you want to convert a V8 `String` to a `char*` use `NanFromV8String`. It is possible to define an encoding that defaults to `Nan::UTF8` as well as a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows optionally setting `String::WriteOptions`, which default to `String::HINT_MANY_WRITES_EXPECTED | String::NO_NULL_TERMINATION`. +Just remember that you'll end up with an object that you'll need to `delete[]` at some point unless you supply your own buffer: + +```c++ +size_t count; +char* name = NanFromV8String(args[0]); +char* decoded = NanFromV8String(args[1], Nan::BASE64, &count, NULL, 0, String::HINT_MANY_WRITES_EXPECTED); +char param_copy[count]; +memcpy(param_copy, decoded, count); +delete[] decoded; +``` + + +### bool NanBooleanOptionValue(Handle<Value>, Handle<String>[, bool]) + +When you have an "options" object that you need to fetch properties from, boolean options can be fetched with this pair. They check first if the object exists (`IsEmpty`), then if the object has the given property (`Has`) then they get and convert/coerce the property to a `bool`. + +The optional last parameter is the *default* value, which is `false` if left off: + +```c++ +// `foo` is false unless the user supplies a truthy value for it +bool foo = NanBooleanOptionValue(optionsObj, NanSymbol("foo")); +// `bar` is true unless the user supplies a falsy value for it +bool bar = NanBooleanOptionValueDefTrue(optionsObj, NanSymbol("bar"), true); +``` + + +### uint32_t NanUInt32OptionValue(Handle<Value>, Handle<String>, uint32_t) + +Similar to `NanBooleanOptionValue`, use `NanUInt32OptionValue` to fetch an integer option from your options object. Can be any kind of JavaScript `Number` and it will be coerced to an unsigned 32-bit integer. + +Requires all 3 arguments as a default is not optional: + +```c++ +uint32_t count = NanUInt32OptionValue(optionsObj, NanSymbol("count"), 1024); +``` + + +### NanError(message), NanTypeError(message), NanRangeError(message) + +For making `Error`, `TypeError` and `RangeError` objects. + +```c++ +Local res = NanError("you must supply a callback argument"); +``` + + +### NanThrowError(message), NanThrowTypeError(message), NanThrowRangeError(message), NanThrowError(Local<Value>), NanThrowError(Local<Value>, int) + +For throwing `Error`, `TypeError` and `RangeError` objects. You should `return` this call: + +```c++ +return NanThrowError("you must supply a callback argument"); +``` + +Can also handle any custom object you may want to throw. If used with the error code argument, it will add the supplied error code to the error object as a property called `code`. + + +### Local<Object> NanNewBufferHandle(char *, uint32_t), Local<Object> NanNewBufferHandle(uint32_t) + +The `Buffer` API has changed a little in Node 0.11, this helper provides consistent access to `Buffer` creation: + +```c++ +NanNewBufferHandle((char*)value.data(), value.size()); +``` + +Can also be used to initialize a `Buffer` with just a `size` argument. + +Can also be supplied with a `NAN_WEAK_CALLBACK` and a hint for the garbage collector, when dealing with weak references. + + +### Local<Object> NanBufferUse(char*, uint32_t) + +`Buffer::New(char*, uint32_t)` prior to 0.11 would make a copy of the data. +While it was possible to get around this, it required a shim by passing a +callback. So the new API `Buffer::Use(char*, uint32_t)` was introduced to remove +needing to use this shim. + +`NanBufferUse` uses the `char*` passed as the backing data, and will free the +memory automatically when the weak callback is called. Keep this in mind, as +careless use can lead to "double free or corruption" and other cryptic failures. + + +### bool NanHasInstance(Persistent<FunctionTemplate>&, Handle<Value>) + +Can be used to check the type of an object to determine it is of a particular class you have already defined and have a `Persistent` handle for. + + +### Local<Type> NanPersistentToLocal(Persistent<Type>&) + +Aside from `FunctionCallbackInfo`, the biggest and most painful change to V8 in Node 0.11 is the many restrictions now placed on `Persistent` handles. They are difficult to assign and difficult to fetch the original value out of. + +Use `NanPersistentToLocal` to convert a `Persistent` handle back to a `Local` handle. + +```c++ +Local handle = NanPersistentToLocal(persistentHandle); +``` + + +### Local<Context> NanNewContextHandle([ExtensionConfiguration*, Handle<ObjectTemplate>, Handle<Value>]) +Creates a new `Local` handle. + +```c++ +Local ftmpl = FunctionTemplate::New(); +Local otmpl = ftmpl->InstanceTemplate(); +Local ctx = NanNewContextHandle(NULL, otmpl); +``` + + +### void NanDispose(Persistent<T> &) + +Use `NanDispose` to dispose a `Persistent` handle. + +```c++ +NanDispose(persistentHandle); +``` + + +### NanAssignPersistent(type, handle, object) + +Use `NanAssignPersistent` to assign a non-`Persistent` handle to a `Persistent` one. You can no longer just declare a `Persistent` handle and assign directly to it later, you have to `Reset` it in Node 0.11, so this makes it easier. + +In general it is now better to place anything you want to protect from V8's garbage collector as properties of a generic `Object` and then assign that to a `Persistent`. This works in older versions of Node also if you use `NanAssignPersistent`: + +```c++ +Persistent persistentHandle; + +... + +Local obj = Object::New(); +obj->Set(NanSymbol("key"), keyHandle); // where keyHandle might be a Local +NanAssignPersistent(Object, persistentHandle, obj) +``` + + +### NanInitPersistent(type, name, object) + +User `NanInitPersistent` to declare and initialize a new `Persistent` with the supplied object. The assignment operator for `Persistent` is no longer public in Node 0.11, so this macro makes it easier to declare and initializing a new `Persistent`. See NanAssignPersistent for more information. + +```c++ +Local obj = Object::New(); +obj->Set(NanSymbol("key"), keyHandle); // where keyHandle might be a Local +NanInitPersistent(Object, persistentHandle, obj); +``` + + +### NanCallback + +Because of the difficulties imposed by the changes to `Persistent` handles in V8 in Node 0.11, creating `Persistent` versions of your `Local` handles is annoyingly tricky. `NanCallback` makes it easier by taking your `Local` handle, making it persistent until the `NanCallback` is deleted and even providing a handy `Call()` method to fetch and execute the callback `Function`. + +```c++ +Local callbackHandle = args[0].As(); +NanCallback *callback = new NanCallback(callbackHandle); +// pass `callback` around and it's safe from GC until you: +delete callback; +``` + +You can execute the callback like so: + +```c++ +// no arguments: +callback->Call(0, NULL); + +// an error argument: +Local argv[] = { + Exception::Error(String::New("fail!")) +}; +callback->Call(1, argv); + +// a success argument: +Local argv[] = { + Local::New(Null()), + String::New("w00t!") +}; +callback->Call(2, argv); +``` + +`NanCallback` also has a `Local GetCallback()` method that you can use to fetch a local handle to the underlying callback function if you need it. + + +### NanAsyncWorker + +`NanAsyncWorker` is an abstract class that you can subclass to have much of the annoying async queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the async work is in progress. + +See a rough outline of the implementation: + +```c++ +class NanAsyncWorker { +public: + NanAsyncWorker (NanCallback *callback); + + // Clean up persistent handles and delete the *callback + virtual ~NanAsyncWorker (); + + // Check the `char *errmsg` property and call HandleOKCallback() + // or HandleErrorCallback depending on whether it has been set or not + virtual void WorkComplete (); + + // You must implement this to do some async work. If there is an + // error then allocate `errmsg` to to a message and the callback will + // be passed that string in an Error object + virtual void Execute (); + + // Save a V8 object in a Persistent handle to protect it from GC + void SavePersistent(const char *key, Local &obj); + + // Fetch a stored V8 object (don't call from within `Execute()`) + Local GetFromPersistent(const char *key); + +protected: + // Set this if there is an error, otherwise it's NULL + const char *errmsg; + + // Default implementation calls the callback function with no arguments. + // Override this to return meaningful data + virtual void HandleOKCallback (); + + // Default implementation calls the callback function with an Error object + // wrapping the `errmsg` string + virtual void HandleErrorCallback (); +}; +``` + + +### NanAsyncQueueWorker(NanAsyncWorker *) + +`NanAsyncQueueWorker` will run a `NanAsyncWorker` asynchronously via libuv. Both the *execute* and *after_work* steps are taken care of for you—most of the logic for this is embedded in `NanAsyncWorker`. + +### Contributors + +NAN is only possible due to the excellent work of the following contributors: + + + + + + +
      Rod VaggGitHub/rvaggTwitter/@rvagg
      Benjamin ByholmGitHub/kkoopa
      Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
      Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
      + +Licence & copyright +----------------------- + +Copyright (c) 2013 NAN contributors (listed above). + +Native Abstractions for Node.js is licensed under an MIT +no-false-attribs license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/build/config.gypi b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/build/config.gypi new file mode 100644 index 00000000..e085a500 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/build/config.gypi @@ -0,0 +1,38 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [] + }, + "variables": { + "clang": 0, + "gcc_version": 47, + "host_arch": "x64", + "node_install_npm": "true", + "node_prefix": "", + "node_shared_cares": "false", + "node_shared_http_parser": "false", + "node_shared_libuv": "false", + "node_shared_openssl": "false", + "node_shared_v8": "false", + "node_shared_zlib": "false", + "node_tag": "", + "node_unsafe_optimizations": 0, + "node_use_dtrace": "false", + "node_use_etw": "false", + "node_use_openssl": "true", + "node_use_perfctr": "false", + "node_use_systemtap": "false", + "python": "/usr/bin/python", + "target_arch": "x64", + "v8_enable_gdbjit": 0, + "v8_no_strict_aliasing": 1, + "v8_use_snapshot": "true", + "nodedir": "/home/rvagg/.node-gyp/0.10.21", + "copy_dev_lib": "true", + "standalone_static_library": 1 + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/include_dirs.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/include_dirs.js new file mode 100644 index 00000000..4f1dfb41 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/include_dirs.js @@ -0,0 +1 @@ +console.log(require('path').relative('.', __dirname)); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/nan.h b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/nan.h new file mode 100644 index 00000000..2f4ab153 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/nan.h @@ -0,0 +1,1102 @@ +/********************************************************************************** + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2013 NAN contributors: + * - Rod Vagg + * - Benjamin Byholm + * - Trevor Norris + * + * MIT +no-false-attribs License + * + * Version 0.6.0 (current Node unstable: 0.11.9, Node stable: 0.10.22) + * + * ChangeLog: + * * 0.6.0 Nov 21 2013 + * - Introduce NanNewLocal(v8::Handle value) for use in place of + * v8::Local::New(...) since v8 started requiring isolate in Node 0.11.9 + * + * * 0.5.2 Nov 16 2013 + * - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public + * + * * 0.5.1 Nov 12 2013 + * - Use node::MakeCallback() instead of direct v8::Function::Call() + * + * * 0.5.0 Nov 11 2013 + * - Added @TooTallNate as collaborator + * - New, much simpler, "include_dirs" for binding.gyp + * - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros + * + * * 0.4.4 Nov 2 2013 + * - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+ + * + * * 0.4.3 Nov 2 2013 + * - Include node_object_wrap.h, removed from node.h for Node 0.11.8. + * + * * 0.4.2 Nov 2 2013 + * - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for + * Node 0.11.8 release. + * + * * 0.4.1 Sep 16 2013 + * - Added explicit `#include ` as it was removed from node.h for v0.11.8 + * + * * 0.4.0 Sep 2 2013 + * - Added NAN_INLINE and NAN_DEPRECATED and made use of them + * - Added NanError, NanTypeError and NanRangeError + * - Cleaned up code + * + * * 0.3.2 Aug 30 2013 + * - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent + * in NanAsyncWorker + * + * * 0.3.1 Aug 20 2013 + * - fix "not all control paths return a value" compile warning on some platforms + * + * * 0.3.0 Aug 19 2013 + * - Made NAN work with NPM + * - Lots of fixes to NanFromV8String, pulling in features from new Node core + * - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API + * - Added optional error number argument for NanThrowError() + * - Added NanInitPersistent() + * - Added NanReturnNull() and NanReturnEmptyString() + * - Added NanLocker and NanUnlocker + * - Added missing scopes + * - Made sure to clear disposed Persistent handles + * - Changed NanAsyncWorker to allocate error messages on the heap + * - Changed NanThrowError(Local) to NanThrowError(Handle) + * - Fixed leak in NanAsyncWorker when errmsg is used + * + * * 0.2.2 Aug 5 2013 + * - Fixed usage of undefined variable with node::BASE64 in NanFromV8String() + * + * * 0.2.1 Aug 5 2013 + * - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for + * NanFromV8String() + * + * * 0.2.0 Aug 5 2013 + * - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR, + * NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY + * - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS, + * _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS, + * _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS, + * _NAN_PROPERTY_QUERY_ARGS + * - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer + * - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT, + * NAN_WEAK_CALLBACK_DATA, NanMakeWeak + * - Renamed THROW_ERROR to _NAN_THROW_ERROR + * - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*) + * - Added NanBufferUse(char*, uint32_t) + * - Added NanNewContextHandle(v8::ExtensionConfiguration*, + * v8::Handle, v8::Handle) + * - Fixed broken NanCallback#GetFunction() + * - Added optional encoding and size arguments to NanFromV8String() + * - Added NanGetPointerSafe() and NanSetPointerSafe() + * - Added initial test suite (to be expanded) + * - Allow NanUInt32OptionValue to convert any Number object + * + * * 0.1.0 Jul 21 2013 + * - Added `NAN_GETTER`, `NAN_SETTER` + * - Added `NanThrowError` with single Local argument + * - Added `NanNewBufferHandle` with single uint32_t argument + * - Added `NanHasInstance(Persistent&, Handle)` + * - Added `Local NanCallback#GetFunction()` + * - Added `NanCallback#Call(int, Local[])` + * - Deprecated `NanCallback#Run(int, Local[])` in favour of Call + * + * See https://github.com/rvagg/nan for the latest update to this file + **********************************************************************************/ + +#ifndef NAN_H +#define NAN_H + +#include +#include +#include +#include +#include +#include + +#if defined(__GNUC__) && !defined(DEBUG) +# define NAN_INLINE(declarator) inline __attribute__((always_inline)) declarator +#elif defined(_MSC_VER) && !defined(DEBUG) +# define NAN_INLINE(declarator) __forceinline declarator +#else +# define NAN_INLINE(declarator) inline declarator +#endif + +#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS +# define NAN_DEPRECATED(declarator) declarator __attribute__ ((deprecated)) +#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS +# define NAN_DEPRECATED(declarator) __declspec(deprecated) declarator +#else +# define NAN_DEPRECATED(declarator) declarator +#endif + +// some generic helpers + +template static NAN_INLINE(bool NanSetPointerSafe( + T *var + , T val +)) { + if (var) { + *var = val; + return true; + } else { + return false; + } +} + +template static NAN_INLINE(T NanGetPointerSafe( + T *var + , T fallback = reinterpret_cast(0) +)) { + if (var) { + return *var; + } else { + return fallback; + } +} + +#define NanSymbol(value) v8::String::NewSymbol(value) + +static NAN_INLINE(bool NanBooleanOptionValue( + v8::Local optionsObj + , v8::Handle opt, bool def +)) { + if (def) { + return optionsObj.IsEmpty() + || !optionsObj->Has(opt) + || optionsObj->Get(opt)->BooleanValue(); + } else { + return !optionsObj.IsEmpty() + && optionsObj->Has(opt) + && optionsObj->Get(opt)->BooleanValue(); + } +} + +static NAN_INLINE(bool NanBooleanOptionValue( + v8::Local optionsObj + , v8::Handle opt +)) { + return NanBooleanOptionValue(optionsObj, opt, false); +} + +static NAN_INLINE(uint32_t NanUInt32OptionValue( + v8::Local optionsObj + , v8::Handle opt + , uint32_t def +)) { + return !optionsObj.IsEmpty() + && optionsObj->Has(opt) + && optionsObj->Get(opt)->IsNumber() + ? optionsObj->Get(opt)->Uint32Value() + : def; +} + +#if (NODE_MODULE_VERSION > 0x000B) +// Node 0.11+ (0.11.3 and below won't compile with these) + +static v8::Isolate* nan_isolate = v8::Isolate::GetCurrent(); + +# define _NAN_METHOD_ARGS const v8::FunctionCallbackInfo& args +# define NAN_METHOD(name) void name(_NAN_METHOD_ARGS) +# define _NAN_GETTER_ARGS const v8::PropertyCallbackInfo& args +# define NAN_GETTER(name) \ + void name(v8::Local property, _NAN_GETTER_ARGS) +# define _NAN_SETTER_ARGS const v8::PropertyCallbackInfo& args +# define NAN_SETTER(name) \ + void name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_SETTER_ARGS) +# define _NAN_PROPERTY_GETTER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_PROPERTY_GETTER(name) \ + void name(v8::Local property \ + , _NAN_PROPERTY_GETTER_ARGS) +# define _NAN_PROPERTY_SETTER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_PROPERTY_SETTER(name) \ + void name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_PROPERTY_SETTER_ARGS) +# define _NAN_PROPERTY_ENUMERATOR_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_PROPERTY_ENUMERATOR(name) \ + void name(_NAN_PROPERTY_ENUMERATOR_ARGS) +# define _NAN_PROPERTY_DELETER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_PROPERTY_DELETER(name) \ + void name( \ + v8::Local property \ + , _NAN_PROPERTY_DELETER_ARGS) +# define _NAN_PROPERTY_QUERY_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_PROPERTY_QUERY(name) \ + void name(v8::Local property, _NAN_PROPERTY_QUERY_ARGS) + +# define _NAN_INDEX_GETTER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_INDEX_GETTER(name) \ + void name(uint32_t index, _NAN_INDEX_GETTER_ARGS) +# define _NAN_INDEX_SETTER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_INDEX_SETTER(name) \ + void name( \ + uint32_t index \ + , v8::Local value \ + , _NAN_INDEX_SETTER_ARGS) +# define _NAN_INDEX_ENUMERATOR_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_INDEX_ENUMERATOR(name) \ + void name(_NAN_INDEX_ENUMERATOR_ARGS) +# define _NAN_INDEX_DELETER_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_INDEX_DELETER(name) \ + void name( \ + uint32_t index \ + , _NAN_INDEX_DELETER_ARGS) +# define _NAN_INDEX_QUERY_ARGS \ + const v8::PropertyCallbackInfo& args +# define NAN_INDEX_QUERY(name) \ + void name(uint32_t index, _NAN_INDEX_QUERY_ARGS) + +# define NanGetInternalFieldPointer(object, index) \ + object->GetAlignedPointerFromInternalField(index) +# define NanSetInternalFieldPointer(object, index, value) \ + object->SetAlignedPointerInInternalField(index, value) + +# define NAN_WEAK_CALLBACK(type, name) \ + void name( \ + v8::Isolate* isolate \ + , v8::Persistent* object \ + , type data) +# define NAN_WEAK_CALLBACK_OBJECT (*object) +# define NAN_WEAK_CALLBACK_DATA(type) ((type) data) + +# define NanScope() v8::HandleScope scope(nan_isolate) +# define NanLocker() v8::Locker locker(nan_isolate) +# define NanUnlocker() v8::Unlocker unlocker(nan_isolate) +# define NanReturnValue(value) return args.GetReturnValue().Set(value) +# define NanReturnUndefined() return +# define NanReturnNull() return args.GetReturnValue().SetNull() +# define NanReturnEmptyString() return args.GetReturnValue().SetEmptyString() +# define NanAssignPersistent(type, handle, obj) handle.Reset(nan_isolate, obj) +# define NanInitPersistent(type, name, obj) \ + v8::Persistent name(nan_isolate, obj) +# define NanObjectWrapHandle(obj) obj->handle() + +//TODO: remove <0.11.8 support when 0.12 is released +#if NODE_VERSION_AT_LEAST(0, 11, 8) +# define NanMakeWeak(handle, parameter, callback) \ + handle.MakeWeak(parameter, callback) +#else +# define NanMakeWeak(handle, parameter, callback) \ + handle.MakeWeak(nan_isolate, parameter, callback) +#endif + +# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg)) + +# define _NAN_THROW_ERROR(fun, errmsg) \ + do { \ + NanScope(); \ + v8::ThrowException(_NAN_ERROR(fun, errmsg)); \ + } while (0); + + template static NAN_INLINE(v8::Local NanNewLocal( + v8::Handle val + )) { +//TODO: remove <0.11.9 support when 0.12 is released +#if NODE_VERSION_AT_LEAST(0, 11, 9) + return v8::Local::New(nan_isolate, val); +#else + return v8::Local::New(val); +#endif + } + + static NAN_INLINE(v8::Handle NanError(const char* errmsg)) { + return _NAN_ERROR(v8::Exception::Error, errmsg); + } + + static NAN_INLINE(void NanThrowError(const char* errmsg)) { + _NAN_THROW_ERROR(v8::Exception::Error, errmsg); + } + + static NAN_INLINE(void NanThrowError(v8::Handle error)) { + NanScope(); + v8::ThrowException(error); + } + + static NAN_INLINE(v8::Handle NanError( + const char *msg + , const int errorNumber + )) { + v8::Local err = v8::Exception::Error(v8::String::New(msg)); + v8::Local obj = err.As(); + obj->Set(v8::String::New("code"), v8::Int32::New(errorNumber)); + return err; + } + + static NAN_INLINE(void NanThrowError( + const char *msg + , const int errorNumber + )) { + NanThrowError(NanError(msg, errorNumber)); + } + + static NAN_INLINE(v8::Handle NanTypeError(const char* errmsg)) { + return _NAN_ERROR(v8::Exception::TypeError, errmsg); + } + + static NAN_INLINE(void NanThrowTypeError(const char* errmsg)) { + _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg); + } + + static NAN_INLINE(v8::Handle NanRangeError(const char* errmsg)) { + return _NAN_ERROR(v8::Exception::RangeError, errmsg); + } + + static NAN_INLINE(void NanThrowRangeError(const char* errmsg)) { + _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg); + } + + template static NAN_INLINE(void NanDispose( + v8::Persistent &handle + )) { + +//TODO: remove <0.11.8 support when 0.12 is released +#if NODE_VERSION_AT_LEAST(0, 11, 8) + handle.Reset(); +#else + handle.Dispose(nan_isolate); +#endif + handle.Clear(); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle ( + char *data + , size_t length + , node::smalloc::FreeCallback callback + , void *hint + )) { + return node::Buffer::New(data, length, callback, hint); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle ( + char *data + , uint32_t size + )) { + return node::Buffer::New(data, size); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle (uint32_t size)) { + return node::Buffer::New(size); + } + + static NAN_INLINE(v8::Local NanBufferUse( + char* data + , uint32_t size + )) { + return node::Buffer::Use(data, size); + } + + template + static NAN_INLINE(v8::Local NanPersistentToLocal( + const v8::Persistent& persistent + )) { + if (persistent.IsWeak()) { + return v8::Local::New(nan_isolate, persistent); + } else { + return *reinterpret_cast*>( + const_cast*>(&persistent)); + } + } + + static NAN_INLINE(bool NanHasInstance( + v8::Persistent& function_template + , v8::Handle value + )) { + return NanPersistentToLocal(function_template)->HasInstance(value); + } + + static NAN_INLINE(v8::Local NanNewContextHandle( + v8::ExtensionConfiguration* extensions = NULL + , v8::Handle tmpl = v8::Handle() + , v8::Handle obj = v8::Handle() + )) { + return v8::Local::New( + nan_isolate + , v8::Context::New(nan_isolate, extensions, tmpl, obj) + ); + } + +#else +// Node 0.8 and 0.10 + +# define _NAN_METHOD_ARGS const v8::Arguments& args +# define NAN_METHOD(name) v8::Handle name(_NAN_METHOD_ARGS) +# define _NAN_GETTER_ARGS const v8::AccessorInfo &args +# define NAN_GETTER(name) \ + v8::Handle name(v8::Local property, _NAN_GETTER_ARGS) +# define _NAN_SETTER_ARGS const v8::AccessorInfo &args +# define NAN_SETTER(name) \ + void name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_SETTER_ARGS) +# define _NAN_PROPERTY_GETTER_ARGS const v8::AccessorInfo& args +# define NAN_PROPERTY_GETTER(name) \ + v8::Handle name( \ + v8::Local property \ + , _NAN_PROPERTY_GETTER_ARGS) +# define _NAN_PROPERTY_SETTER_ARGS const v8::AccessorInfo& args +# define NAN_PROPERTY_SETTER(name) \ + v8::Handle name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_PROPERTY_SETTER_ARGS) +# define _NAN_PROPERTY_ENUMERATOR_ARGS const v8::AccessorInfo& args +# define NAN_PROPERTY_ENUMERATOR(name) \ + v8::Handle name(_NAN_PROPERTY_ENUMERATOR_ARGS) +# define _NAN_PROPERTY_DELETER_ARGS const v8::AccessorInfo& args +# define NAN_PROPERTY_DELETER(name) \ + v8::Handle name( \ + v8::Local property \ + , _NAN_PROPERTY_DELETER_ARGS) +# define _NAN_PROPERTY_QUERY_ARGS const v8::AccessorInfo& args +# define NAN_PROPERTY_QUERY(name) \ + v8::Handle name( \ + v8::Local property \ + , _NAN_PROPERTY_QUERY_ARGS) + +# define _NAN_INDEX_GETTER_ARGS const v8::AccessorInfo& args +# define NAN_INDEX_GETTER(name) \ + v8::Handle name( \ + uint32_t index \ + , _NAN_INDEX_GETTER_ARGS) +# define _NAN_INDEX_SETTER_ARGS const v8::AccessorInfo& args +# define NAN_INDEX_SETTER(name) \ + v8::Handle name( \ + uint32_t index \ + , v8::Local value \ + , _NAN_INDEX_SETTER_ARGS) +# define _NAN_INDEX_ENUMERATOR_ARGS const v8::AccessorInfo& args +# define NAN_INDEX_ENUMERATOR(name) \ + v8::Handle name(_NAN_INDEX_ENUMERATOR_ARGS) +# define _NAN_INDEX_DELETER_ARGS const v8::AccessorInfo& args +# define NAN_INDEX_DELETER(name) \ + v8::Handle name( \ + uint32_t index \ + , _NAN_INDEX_DELETER_ARGS) +# define _NAN_INDEX_QUERY_ARGS const v8::AccessorInfo& args +# define NAN_INDEX_QUERY(name) \ + v8::Handle name( \ + uint32_t index \ + , _NAN_INDEX_QUERY_ARGS) + +# define NanGetInternalFieldPointer(object, index) \ + object->GetPointerFromInternalField(index) +# define NanSetInternalFieldPointer(object, index, value) \ + object->SetPointerInInternalField(index, value) +# define NAN_WEAK_CALLBACK(type, name) \ + void name( \ + v8::Persistent object \ + , void *data) +# define NAN_WEAK_CALLBACK_OBJECT object +# define NAN_WEAK_CALLBACK_DATA(type) ((type) data) + +# define NanScope() v8::HandleScope scope +# define NanLocker() v8::Locker locker +# define NanUnlocker() v8::Unlocker unlocker +# define NanReturnValue(value) return scope.Close(value) +# define NanReturnUndefined() return v8::Undefined() +# define NanReturnNull() return v8::Null() +# define NanReturnEmptyString() return v8::String::Empty() +# define NanInitPersistent(type, name, obj) \ + v8::Persistent name = v8::Persistent::New(obj) +# define NanAssignPersistent(type, handle, obj) \ + handle = v8::Persistent::New(obj) +# define NanObjectWrapHandle(obj) obj->handle_ +# define NanMakeWeak(handle, parameters, callback) \ + handle.MakeWeak(parameters, callback) + +# define _NAN_ERROR(fun, errmsg) \ + fun(v8::String::New(errmsg)) + +# define _NAN_THROW_ERROR(fun, errmsg) \ + do { \ + NanScope(); \ + return v8::ThrowException(_NAN_ERROR(fun, errmsg)); \ + } while (0); + + template static NAN_INLINE(v8::Local NanNewLocal( + v8::Handle val + )) { + return v8::Local::New(val); + } + + static NAN_INLINE(v8::Handle NanError(const char* errmsg)) { + return _NAN_ERROR(v8::Exception::Error, errmsg); + } + + static NAN_INLINE(v8::Handle NanThrowError(const char* errmsg)) { + _NAN_THROW_ERROR(v8::Exception::Error, errmsg); + } + + static NAN_INLINE(v8::Handle NanThrowError( + v8::Handle error + )) { + NanScope(); + return v8::ThrowException(error); + } + + static NAN_INLINE(v8::Handle NanError( + const char *msg + , const int errorNumber + )) { + v8::Local err = v8::Exception::Error(v8::String::New(msg)); + v8::Local obj = err.As(); + obj->Set(v8::String::New("code"), v8::Int32::New(errorNumber)); + return err; + } + + static NAN_INLINE(v8::Handle NanThrowError( + const char *msg + , const int errorNumber + )) { + return NanThrowError(NanError(msg, errorNumber)); + } + + static NAN_INLINE(v8::Handle NanTypeError(const char* errmsg)) { + return _NAN_ERROR(v8::Exception::TypeError, errmsg); + } + + static NAN_INLINE(v8::Handle NanThrowTypeError( + const char* errmsg + )) { + _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg); + } + + static NAN_INLINE(v8::Handle NanRangeError( + const char* errmsg + )) { + return _NAN_ERROR(v8::Exception::RangeError, errmsg); + } + + static NAN_INLINE(v8::Handle NanThrowRangeError( + const char* errmsg + )) { + _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg); + } + + template static NAN_INLINE(void NanDispose( + v8::Persistent &handle + )) { + handle.Dispose(); + handle.Clear(); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle ( + char *data + , size_t length + , node::Buffer::free_callback callback + , void *hint + )) { + return NanNewLocal( + node::Buffer::New(data, length, callback, hint)->handle_); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle ( + char *data + , uint32_t size + )) { + return NanNewLocal(node::Buffer::New(data, size)->handle_); + } + + static NAN_INLINE(v8::Local NanNewBufferHandle (uint32_t size)) { + return NanNewLocal(node::Buffer::New(size)->handle_); + } + + static NAN_INLINE(void FreeData(char *data, void *hint)) { + delete[] data; + } + + static NAN_INLINE(v8::Local NanBufferUse( + char* data + , uint32_t size + )) { + return NanNewLocal( + node::Buffer::New(data, size, FreeData, NULL)->handle_); + } + + template + static NAN_INLINE(v8::Local NanPersistentToLocal( + const v8::Persistent& persistent + )) { + if (persistent.IsWeak()) { + return NanNewLocal(persistent); + } else { + return *reinterpret_cast*>( + const_cast*>(&persistent)); + } + } + + static NAN_INLINE(bool NanHasInstance( + v8::Persistent& function_template + , v8::Handle value + )) { + return function_template->HasInstance(value); + } + + static NAN_INLINE(v8::Local NanNewContextHandle( + v8::ExtensionConfiguration* extensions = NULL + , v8::Handle tmpl = v8::Handle() + , v8::Handle obj = v8::Handle() + )) { + v8::Persistent ctx = v8::Context::New(extensions, tmpl, obj); + v8::Local lctx = NanNewLocal(ctx); + ctx.Dispose(); + return lctx; + } + +#endif // node version + +class NanCallback { + public: + NanCallback(const v8::Local &fn) { + NanScope(); + v8::Local obj = v8::Object::New(); + obj->Set(NanSymbol("callback"), fn); + NanAssignPersistent(v8::Object, handle, obj); + } + + ~NanCallback() { + if (handle.IsEmpty()) return; + handle.Dispose(); + handle.Clear(); + } + + NAN_INLINE(v8::Local GetFunction ()) { + return NanPersistentToLocal(handle)->Get(NanSymbol("callback")) + .As(); + } + + // deprecated + NAN_DEPRECATED(void Run(int argc, v8::Local argv[])) { + Call(argc, argv); + } + + void Call(int argc, v8::Local argv[]) { + NanScope(); + + v8::Local callback = NanPersistentToLocal(handle)-> + Get(NanSymbol("callback")).As(); + node::MakeCallback( + v8::Context::GetCurrent()->Global() + , callback + , argc + , argv + ); + } + + private: + v8::Persistent handle; +}; + +/* abstract */ class NanAsyncWorker { +public: + NanAsyncWorker (NanCallback *callback) : callback(callback) { + request.data = this; + errmsg = NULL; + } + + virtual ~NanAsyncWorker () { + NanScope(); + + if (!persistentHandle.IsEmpty()) + NanDispose(persistentHandle); + if (callback) + delete callback; + if (errmsg) + delete errmsg; + } + + virtual void WorkComplete () { + NanScope(); + + if (errmsg == NULL) + HandleOKCallback(); + else + HandleErrorCallback(); + delete callback; + callback = NULL; + } + + void SavePersistent(const char *key, v8::Local &obj) { + NanScope(); + + v8::Local handle = NanPersistentToLocal(persistentHandle); + handle->Set(NanSymbol(key), obj); + } + + v8::Local GetFromPersistent(const char *key) { + NanScope(); + + v8::Local handle = NanPersistentToLocal(persistentHandle); + return handle->Get(NanSymbol(key)).As(); + } + + virtual void Execute () =0; + + uv_work_t request; + +protected: + v8::Persistent persistentHandle; + NanCallback *callback; + const char *errmsg; + + virtual void HandleOKCallback () { + NanScope(); + + callback->Call(0, NULL); + }; + + virtual void HandleErrorCallback () { + NanScope(); + + v8::Local argv[] = { + v8::Exception::Error(v8::String::New(errmsg)) + }; + callback->Call(1, argv); + } +}; + +NAN_INLINE(void NanAsyncExecute (uv_work_t* req)) { + NanAsyncWorker *worker = static_cast(req->data); + worker->Execute(); +} + +NAN_INLINE(void NanAsyncExecuteComplete (uv_work_t* req)) { + NanAsyncWorker* worker = static_cast(req->data); + worker->WorkComplete(); + delete worker; +} + +NAN_INLINE(void NanAsyncQueueWorker (NanAsyncWorker* worker)) { + uv_queue_work( + uv_default_loop() + , &worker->request + , NanAsyncExecute + , (uv_after_work_cb)NanAsyncExecuteComplete + ); +} + +//// Base 64 //// + +#define _nan_base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) + +// Doesn't check for padding at the end. Can be 1-2 bytes over. +static NAN_INLINE(size_t _nan_base64_decoded_size_fast(size_t size)) { + size_t remainder = size % 4; + + size = (size / 4) * 3; + if (remainder) { + if (size == 0 && remainder == 1) { + // special case: 1-byte input cannot be decoded + size = 0; + } else { + // non-padded input, add 1 or 2 extra bytes + size += 1 + (remainder == 3); + } + } + + return size; +} + +template +static NAN_INLINE(size_t _nan_base64_decoded_size( + const TypeName* src + , size_t size +)) { + if (size == 0) + return 0; + + if (src[size - 1] == '=') + size--; + if (size > 0 && src[size - 1] == '=') + size--; + + return _nan_base64_decoded_size_fast(size); +} + +// supports regular and URL-safe base64 +static const int _nan_unbase64_table[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -2, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63 + , 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1 + , -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 + , 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63 + , -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 + , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + +#define _nan_unbase64(x) _nan_unbase64_table[(uint8_t)(x)] + +template static size_t _nan_base64_decode( + char* buf + , size_t len + , const TypeName* src + , const size_t srcLen +) { + char* dst = buf; + char* dstEnd = buf + len; + const TypeName* srcEnd = src + srcLen; + + while (src < srcEnd && dst < dstEnd) { + int remaining = srcEnd - src; + char a, b, c, d; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining == 0 || *src == '=') break; + a = _nan_unbase64(*src++); + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 1 || *src == '=') break; + b = _nan_unbase64(*src++); + + *dst++ = (a << 2) | ((b & 0x30) >> 4); + if (dst == dstEnd) break; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 2 || *src == '=') break; + c = _nan_unbase64(*src++); + + *dst++ = ((b & 0x0F) << 4) | ((c & 0x3C) >> 2); + if (dst == dstEnd) break; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 3 || *src == '=') break; + d = _nan_unbase64(*src++); + + *dst++ = ((c & 0x03) << 6) | (d & 0x3F); + } + + return dst - buf; +} + +//// HEX //// + +template unsigned _nan_hex2bin(TypeName c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); + if (c >= 'a' && c <= 'f') return 10 + (c - 'a'); + return static_cast(-1); +} + +template static size_t _nan_hex_decode( + char* buf + , size_t len + , const TypeName* src + , const size_t srcLen +) { + size_t i; + for (i = 0; i < len && i * 2 + 1 < srcLen; ++i) { + unsigned a = _nan_hex2bin(src[i * 2 + 0]); + unsigned b = _nan_hex2bin(src[i * 2 + 1]); + if (!~a || !~b) return i; + buf[i] = a * 16 + b; + } + + return i; +} + +static bool _NanGetExternalParts( + v8::Handle val + , const char** data + , size_t* len +) { + if (node::Buffer::HasInstance(val)) { + *data = node::Buffer::Data(val.As()); + *len = node::Buffer::Length(val.As()); + return true; + } + + assert(val->IsString()); + v8::Local str = NanNewLocal(val.As()); + + if (str->IsExternalAscii()) { + const v8::String::ExternalAsciiStringResource* ext; + ext = str->GetExternalAsciiStringResource(); + *data = ext->data(); + *len = ext->length(); + return true; + + } else if (str->IsExternal()) { + const v8::String::ExternalStringResource* ext; + ext = str->GetExternalStringResource(); + *data = reinterpret_cast(ext->data()); + *len = ext->length(); + return true; + } + + return false; +} + +namespace Nan { + enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER}; +} + +static NAN_INLINE(char* NanFromV8String( + v8::Handle from + , enum Nan::Encoding encoding = Nan::UTF8 + , size_t *datalen = NULL + , char *buf = NULL + , size_t buflen = 0 + , int flags = + v8::String::NO_NULL_TERMINATION | v8::String::HINT_MANY_WRITES_EXPECTED +)) { + NanScope(); + + size_t sz_; + size_t term_len = !(flags & v8::String::NO_NULL_TERMINATION); + char *data = NULL; + size_t len; + bool is_extern = _NanGetExternalParts( + from + , const_cast(&data) + , &len); + + if (is_extern && !term_len) { + NanSetPointerSafe(datalen, len); + return data; + } + + v8::Local toStr = from->ToString(); + + char *to = buf; + + v8::String::AsciiValue value(toStr); + switch(encoding) { + case Nan::ASCII: +#if NODE_MODULE_VERSION < 0x0C + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } + NanSetPointerSafe( + datalen + , toStr->WriteAscii(to, 0, sz_ + term_len, flags)); + return to; +#endif + case Nan::BINARY: + case Nan::BUFFER: + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } +#if NODE_MODULE_VERSION < 0x0C + // TODO(isaacs): THIS IS AWFUL!!! + // AGREE(kkoopa) + { + uint16_t* twobytebuf = new uint16_t[sz_ + term_len]; + + size_t len = toStr->Write(twobytebuf, 0, sz_ + term_len, flags); + + for (size_t i = 0; i < sz_ + term_len && i < len + term_len; i++) { + unsigned char *b = reinterpret_cast(&twobytebuf[i]); + to[i] = *b; + } + + NanSetPointerSafe(datalen, len); + + delete[] twobytebuf; + return to; + } +#else + NanSetPointerSafe( + datalen, + toStr->WriteOneByte( + reinterpret_cast(to) + , 0 + , sz_ + term_len + , flags)); + return to; +#endif + case Nan::UTF8: + sz_ = toStr->Utf8Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } + NanSetPointerSafe( + datalen + , toStr->WriteUtf8(to, sz_ + term_len, NULL, flags) - term_len); + return to; + case Nan::BASE64: + sz_ = _nan_base64_decoded_size(*value, toStr->Length()); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len); + } + NanSetPointerSafe( + datalen + , _nan_base64_decode(to, sz_, *value, value.length())); + if (term_len) { + to[sz_] = '\0'; + } + return to; + case Nan::UCS2: + { + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[(sz_ + term_len) * 2]; + } else { + assert(buflen >= (sz_ + term_len) * 2 && "too small buffer"); + } + + int bc = 2 * toStr->Write( + reinterpret_cast(to) + , 0 + , sz_ + term_len + , flags); + NanSetPointerSafe(datalen, bc); + return to; + } + case Nan::HEX: + sz_ = toStr->Length(); + assert(!(sz_ & 1) && "bad hex data"); + if (to == NULL) { + to = new char[sz_ / 2 + term_len]; + } else { + assert(buflen >= sz_ / 2 + term_len && "too small buffer"); + } + + NanSetPointerSafe( + datalen + , _nan_hex_decode(to, sz_ / 2, *value, value.length())); + if (term_len) { + to[sz_ / 2] = '\0'; + } + return to; + default: + assert(0 && "unknown encoding"); + } + return to; +} + +#endif diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/package.json new file mode 100644 index 00000000..0fcadc05 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/nan/package.json @@ -0,0 +1,41 @@ +{ + "name": "nan", + "version": "0.6.0", + "description": "Native Abstractions for Node.js: C++ header for Node 0.8->0.12 compatibility", + "main": "include_dirs.js", + "repository": { + "type": "git", + "url": "git://github.com/rvagg/nan.git" + }, + "contributors": [ + { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + { + "name": "Benjamin Byholm", + "email": "bbyholm@abo.fi", + "url": "https://github.com/kkoopa/" + }, + { + "name": "Trevor Norris", + "email": "trev.norris@gmail.com", + "url": "https://github.com/trevnorris" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "https://github.com/TooTallNate" + } + ], + "license": "MIT", + "readme": "Native Abstractions for Node.js\n===============================\n\n**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.**\n\n***Current version: 0.6.0*** *(See [nan.h](https://github.com/rvagg/nan/blob/master/nan.h) for complete ChangeLog)*\n\n[![NPM](https://nodei.co/npm/nan.png?downloads=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6)](https://nodei.co/npm/nan/)\n\nThanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.11/0.12, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.\n\nThis project also contains some helper utilities that make addon development a bit more pleasant.\n\n * **[News & Updates](#news)**\n * **[Usage](#usage)**\n * **[Example](#example)**\n * **[API](#api)**\n\n\n## News & Updates\n\n### Nov-2013: Node 0.11.9+ breaking V8 change\n\nThe version of V8 that's shipping with Node 0.11.9+ has changed the signature for new `Local`s to: `v8::Local::New(isolate, value)`, i.e. introducing the `isolate` argument and therefore breaking all new `Local` declarations for previous versions. NAN 0.6+ now includes a `NanNewLocal(value)` that can be used in place to work around this incompatibility and maintain compatibility with 0.8->0.11.9+ (minus a few early 0.11 releases).\n\nFor example, if you wanted to return a `null` on a callback you will have to change the argument from `v8::Local::New(v8::Null())` to `NanNewLocal(v8::Null())`.\n\n### Nov-2013: Change to binding.gyp `\"include_dirs\"` for NAN\n\nInclusion of NAN in a project's binding.gyp is now greatly simplified. You can now just use `\"\n## Usage\n\nSimply add **NAN** as a dependency in the *package.json* of your Node addon:\n\n``` bash\n$ npm install --save nan\n```\n\nPull in the path to **NAN** in your *binding.gyp* so that you can use `#include \"nan.h\"` in your *.cpp* files:\n\n``` python\n\"include_dirs\" : [\n \"` when compiling your addon.\n\n\n## Example\n\nSee **[LevelDOWN](https://github.com/rvagg/node-leveldown/pull/48)** for a full example of **NAN** in use.\n\nFor a simpler example, see the **[async pi estimation example](https://github.com/rvagg/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.\n\nCompare to the current 0.10 version of this example, found in the [node-addon-examples](https://github.com/rvagg/node-addon-examples/tree/master/9_async_work) repository and also a 0.11 version of the same found [here](https://github.com/kkoopa/node-addon-examples/tree/5c01f58fc993377a567812597e54a83af69686d7/9_async_work).\n\nNote that there is no embedded version sniffing going on here and also the async work is made much simpler, see below for details on the `NanAsyncWorker` class.\n\n```c++\n// addon.cc\n#include \n#include \"nan.h\"\n// ...\n\nusing namespace v8;\n\nvoid InitAll(Handle exports) {\n exports->Set(NanSymbol(\"calculateSync\"),\n FunctionTemplate::New(CalculateSync)->GetFunction());\n\n exports->Set(NanSymbol(\"calculateAsync\"),\n FunctionTemplate::New(CalculateAsync)->GetFunction());\n}\n\nNODE_MODULE(addon, InitAll)\n```\n\n```c++\n// sync.h\n#include \n#include \"nan.h\"\n\nNAN_METHOD(CalculateSync);\n```\n\n```c++\n// sync.cc\n#include \n#include \"nan.h\"\n#include \"sync.h\"\n// ...\n\nusing namespace v8;\n\n// Simple synchronous access to the `Estimate()` function\nNAN_METHOD(CalculateSync) {\n NanScope();\n\n // expect a number as the first argument\n int points = args[0]->Uint32Value();\n double est = Estimate(points);\n\n NanReturnValue(Number::New(est));\n}\n```\n\n```c++\n// async.cc\n#include \n#include \"nan.h\"\n#include \"async.h\"\n\n// ...\n\nusing namespace v8;\n\nclass PiWorker : public NanAsyncWorker {\n public:\n PiWorker(NanCallback *callback, int points)\n : NanAsyncWorker(callback), points(points) {}\n ~PiWorker() {}\n\n // Executed inside the worker-thread.\n // It is not safe to access V8, or V8 data structures\n // here, so everything we need for input and output\n // should go on `this`.\n void Execute () {\n estimate = Estimate(points);\n }\n\n // Executed when the async work is complete\n // this function will be run inside the main event loop\n // so it is safe to use V8 again\n void HandleOKCallback () {\n NanScope();\n\n Local argv[] = {\n Local::New(Null())\n , Number::New(estimate)\n };\n\n callback->Call(2, argv);\n };\n\n private:\n int points;\n double estimate;\n};\n\n// Asynchronous access to the `Estimate()` function\nNAN_METHOD(CalculateAsync) {\n NanScope();\n\n int points = args[0]->Uint32Value();\n NanCallback *callback = new NanCallback(args[1].As());\n\n NanAsyncQueueWorker(new PiWorker(callback, points));\n NanReturnUndefined();\n}\n```\n\n\n## API\n\n * NAN_METHOD\n * NAN_GETTER\n * NAN_SETTER\n * NAN_PROPERTY_GETTER\n * NAN_PROPERTY_SETTER\n * NAN_PROPERTY_ENUMERATOR\n * NAN_PROPERTY_DELETER\n * NAN_PROPERTY_QUERY\n * NAN_INDEX_GETTER\n * NAN_INDEX_SETTER\n * NAN_INDEX_ENUMERATOR\n * NAN_INDEX_DELETER\n * NAN_INDEX_QUERY\n * NAN_WEAK_CALLBACK\n * NAN_DEPRECATED\n * NAN_INLINE \n * NanNewLocal\n * NanReturnValue\n * NanReturnUndefined\n * NanReturnNull\n * NanReturnEmptyString\n * NanScope\n * NanLocker\n * NanUnlocker\n * NanGetInternalFieldPointer\n * NanSetInternalFieldPointer\n * NanObjectWrapHandle\n * NanMakeWeak\n * NanSymbol\n * NanGetPointerSafe\n * NanSetPointerSafe\n * NanFromV8String\n * NanBooleanOptionValue\n * NanUInt32OptionValue\n * NanError, NanTypeError, NanRangeError\n * NanThrowError, NanThrowTypeError, NanThrowRangeError, NanThrowError(Handle), NanThrowError(Handle, int)\n * NanNewBufferHandle(char *, size_t, FreeCallback, void *), NanNewBufferHandle(char *, uint32_t), NanNewBufferHandle(uint32_t)\n * NanBufferUse(char *, uint32_t)\n * NanNewContextHandle\n * NanHasInstance\n * NanPersistentToLocal\n * NanDispose\n * NanAssignPersistent\n * NanInitPersistent\n * NanCallback\n * NanAsyncWorker\n * NanAsyncQueueWorker\n\n\n### NAN_METHOD(methodname)\n\nUse `NAN_METHOD` to define your V8 accessible methods:\n\n```c++\n// .h:\nclass Foo : public node::ObjectWrap {\n ...\n\n static NAN_METHOD(Bar);\n static NAN_METHOD(Baz);\n}\n\n\n// .cc:\nNAN_METHOD(Foo::Bar) {\n ...\n}\n\nNAN_METHOD(Foo::Baz) {\n ...\n}\n```\n\nThe reason for this macro is because of the method signature change in 0.11:\n\n```c++\n// 0.10 and below:\nHandle name(const Arguments& args)\n\n// 0.11 and above\nvoid name(const FunctionCallbackInfo& args)\n```\n\nThe introduction of `FunctionCallbackInfo` brings additional complications:\n\n\n### NAN_GETTER(methodname)\n\nUse `NAN_GETTER` to declare your V8 accessible getters. You get a `Local` `property` and an appropriately typed `args` object that can act like the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_GETTER`.\n\n\n### NAN_SETTER(methodname)\n\nUse `NAN_SETTER` to declare your V8 accessible setters. Same as `NAN_GETTER` but you also get a `Local` `value` object to work with.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_SETTER`.\n\n\n### NAN_PROPERTY_GETTER(cbname)\nUse `NAN_PROPERTY_GETTER` to declare your V8 accessible property getters. You get a `Local` `property` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_GETTER`.\n\n\n### NAN_PROPERTY_SETTER(cbname)\nUse `NAN_PROPERTY_SETTER` to declare your V8 accessible property setters. Same as `NAN_PROPERTY_GETTER` but you also get a `Local` `value` object to work with.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_SETTER`.\n\n\n### NAN_PROPERTY_ENUMERATOR(cbname)\nUse `NAN_PROPERTY_ENUMERATOR` to declare your V8 accessible property enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_PROPERTY_GETTER` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_ENUMERATOR`.\n\n\n### NAN_PROPERTY_DELETER(cbname)\nUse `NAN_PROPERTY_DELETER` to declare your V8 accessible property deleters. Same as `NAN_PROPERTY_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_DELETER`.\n\n\n### NAN_PROPERTY_QUERY(cbname)\nUse `NAN_PROPERTY_QUERY` to declare your V8 accessible property queries. Same as `NAN_PROPERTY_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_QUERY`.\n\n\n### NAN_INDEX_GETTER(cbname)\nUse `NAN_INDEX_GETTER` to declare your V8 accessible index getters. You get a `uint32_t` `index` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_GETTER`.\n\n\n### NAN_INDEX_SETTER(cbname)\nUse `NAN_INDEX_SETTER` to declare your V8 accessible index setters. Same as `NAN_INDEX_GETTER` but you also get a `Local` `value` object to work with.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_SETTER`.\n\n\n### NAN_INDEX_ENUMERATOR(cbname)\nUse `NAN_INDEX_ENUMERATOR` to declare your V8 accessible index enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_INDEX_GETTER` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_ENUMERATOR`.\n\n\n### NAN_INDEX_DELETER(cbname)\nUse `NAN_INDEX_DELETER` to declare your V8 accessible index deleters. Same as `NAN_INDEX_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_DELETER`.\n\n\n### NAN_INDEX_QUERY(cbname)\nUse `NAN_INDEX_QUERY` to declare your V8 accessible index queries. Same as `NAN_INDEX_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_QUERY`.\n\n\n### NAN_WEAK_CALLBACK(type, cbname)\n\nUse `NAN_WEAK_CALLBACK` to declare your V8 WeakReference callbacks. There is an object argument accessible through `NAN_WEAK_CALLBACK_OBJECT`. The `type` argument gives the type of the `data` argument, accessible through `NAN_WEAK_CALLBACK_DATA(type)`.\n\n```c++\nstatic NAN_WEAK_CALLBACK(BufferReference*, WeakCheck) {\n if (NAN_WEAK_CALLBACK_DATA(BufferReference*)->noLongerNeeded_) {\n delete NAN_WEAK_CALLBACK_DATA(BufferReference*);\n } else {\n // Still in use, revive, prevent GC\n NanMakeWeak(NAN_WEAK_CALLBACK_OBJECT, NAN_WEAK_CALLBACK_DATA(BufferReference*), &WeakCheck);\n }\n}\n```\n\n\n### NAN_DEPRECATED(declarator)\nDeclares a function as deprecated. Identical to `V8_DEPRECATED`.\n\n```c++\nstatic NAN_DEPRECATED(NAN_METHOD(foo)) {\n ...\n}\n```\n\n\n### NAN_INLINE(declarator)\nInlines a function. Identical to `V8_INLINE`.\n\n```c++\nstatic NAN_INLINE(int foo(int bar)) {\n ...\n}\n```\n\n\n### NanNewLocal<T>(Handle<Value>)\n\nUse `NanNewLocal` in place of `v8::Local::New(...)` as this function\nrequires an `isolate` argument in recent versions of V8 but not in older versions.\n\n```c++\nNanNewLocal(v8::Null())\n```\n\n\n### NanReturnValue(Handle<Value>)\n\nUse `NanReturnValue` when you want to return a value from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n ...\n\n NanReturnValue(String::New(\"FooBar!\"));\n}\n```\n\nNo `return` statement required.\n\n\n### NanReturnUndefined()\n\nUse `NanReturnUndefined` when you don't want to return anything from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnUndefined();\n}\n```\n\n\n### NanReturnNull()\n\nUse `NanReturnNull` when you want to return `Null` from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnNull();\n}\n```\n\n\n### NanReturnEmptyString()\n\nUse `NanReturnEmptyString` when you want to return an empty `String` from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnEmptyString();\n}\n```\n\n\n### NanScope()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanScope()` necessary, use it in place of `HandleScope scope`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanScope();\n\n NanReturnValue(String::New(\"FooBar!\"));\n}\n```\n\n\n### NanLocker()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanLocker()` necessary, use it in place of `Locker locker`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanLocker();\n ...\n NanUnlocker();\n}\n```\n\n\n### NanUnlocker()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanUnlocker()` necessary, use it in place of `Unlocker unlocker`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanLocker();\n ...\n NanUnlocker();\n}\n```\n\n\n### void * NanGetInternalFieldPointer(Handle<Object>, int)\n\nGets a pointer to the internal field with at `index` from a V8 `Object` handle.\n\n```c++\nLocal obj;\n...\nNanGetInternalFieldPointer(obj, 0);\n```\n\n### void NanSetInternalFieldPointer(Handle<Object>, int, void *)\n\nSets the value of the internal field at `index` on a V8 `Object` handle.\n\n```c++\nstatic Persistent dataWrapperCtor;\n...\nLocal wrapper = NanPersistentToLocal(dataWrapperCtor)->NewInstance();\nNanSetInternalFieldPointer(wrapper, 0, this);\n```\n\n\n### Local<Object> NanObjectWrapHandle(Object)\n\nWhen you want to fetch the V8 object handle from a native object you've wrapped with Node's `ObjectWrap`, you should use `NanObjectWrapHandle`:\n\n```c++\nNanObjectWrapHandle(iterator)->Get(String::NewSymbol(\"end\"))\n```\n\n\n### NanMakeWeak(Persistent<T>, parameter, callback)\n\nMake a persistent reference weak.\n\n\n### String NanSymbol(char *)\n\nThis isn't strictly about compatibility, it's just an easier way to create string symbol objects (i.e. `String::NewSymbol(x)`), for getting and setting object properties, or names of objects.\n\n```c++\nbool foo = false;\nif (obj->Has(NanSymbol(\"foo\")))\n foo = optionsObj->Get(NanSymbol(\"foo\"))->BooleanValue()\n```\n\n\n### Type NanGetPointerSafe(Type *[, Type])\n\nA helper for getting values from optional pointers. If the pointer is `NULL`, the function returns the optional default value, which defaults to `0`. Otherwise, the function returns the value the pointer points to.\n\n```c++\nchar *plugh(uint32_t *optional) {\n char res[] = \"xyzzy\";\n uint32_t param = NanGetPointerSafe(optional, 0x1337);\n switch (param) {\n ...\n }\n NanSetPointerSafe(optional, 0xDEADBEEF);\n} \n```\n\n\n### bool NanSetPointerSafe(Type *, Type)\n\nA helper for setting optional argument pointers. If the pointer is `NULL`, the function simply return `false`. Otherwise, the value is assigned to the variable the pointer points to.\n\n```c++\nconst char *plugh(size_t *outputsize) {\n char res[] = \"xyzzy\";\n if !(NanSetPointerSafe(outputsize, strlen(res) + 1)) {\n ...\n }\n\n ...\n}\n```\n\n\n### char* NanFromV8String(Handle<Value>[, enum Nan::Encoding, size_t *, char *, size_t, int])\n\nWhen you want to convert a V8 `String` to a `char*` use `NanFromV8String`. It is possible to define an encoding that defaults to `Nan::UTF8` as well as a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows optionally setting `String::WriteOptions`, which default to `String::HINT_MANY_WRITES_EXPECTED | String::NO_NULL_TERMINATION`.\nJust remember that you'll end up with an object that you'll need to `delete[]` at some point unless you supply your own buffer:\n\n```c++\nsize_t count;\nchar* name = NanFromV8String(args[0]);\nchar* decoded = NanFromV8String(args[1], Nan::BASE64, &count, NULL, 0, String::HINT_MANY_WRITES_EXPECTED);\nchar param_copy[count];\nmemcpy(param_copy, decoded, count);\ndelete[] decoded;\n```\n\n\n### bool NanBooleanOptionValue(Handle<Value>, Handle<String>[, bool])\n\nWhen you have an \"options\" object that you need to fetch properties from, boolean options can be fetched with this pair. They check first if the object exists (`IsEmpty`), then if the object has the given property (`Has`) then they get and convert/coerce the property to a `bool`.\n\nThe optional last parameter is the *default* value, which is `false` if left off:\n\n```c++\n// `foo` is false unless the user supplies a truthy value for it\nbool foo = NanBooleanOptionValue(optionsObj, NanSymbol(\"foo\"));\n// `bar` is true unless the user supplies a falsy value for it\nbool bar = NanBooleanOptionValueDefTrue(optionsObj, NanSymbol(\"bar\"), true);\n```\n\n\n### uint32_t NanUInt32OptionValue(Handle<Value>, Handle<String>, uint32_t)\n\nSimilar to `NanBooleanOptionValue`, use `NanUInt32OptionValue` to fetch an integer option from your options object. Can be any kind of JavaScript `Number` and it will be coerced to an unsigned 32-bit integer.\n\nRequires all 3 arguments as a default is not optional:\n\n```c++\nuint32_t count = NanUInt32OptionValue(optionsObj, NanSymbol(\"count\"), 1024);\n```\n\n\n### NanError(message), NanTypeError(message), NanRangeError(message)\n\nFor making `Error`, `TypeError` and `RangeError` objects.\n\n```c++\nLocal res = NanError(\"you must supply a callback argument\");\n```\n\n\n### NanThrowError(message), NanThrowTypeError(message), NanThrowRangeError(message), NanThrowError(Local<Value>), NanThrowError(Local<Value>, int)\n\nFor throwing `Error`, `TypeError` and `RangeError` objects. You should `return` this call:\n\n```c++\nreturn NanThrowError(\"you must supply a callback argument\");\n```\n\nCan also handle any custom object you may want to throw. If used with the error code argument, it will add the supplied error code to the error object as a property called `code`.\n\n\n### Local<Object> NanNewBufferHandle(char *, uint32_t), Local<Object> NanNewBufferHandle(uint32_t)\n\nThe `Buffer` API has changed a little in Node 0.11, this helper provides consistent access to `Buffer` creation:\n\n```c++\nNanNewBufferHandle((char*)value.data(), value.size());\n```\n\nCan also be used to initialize a `Buffer` with just a `size` argument.\n\nCan also be supplied with a `NAN_WEAK_CALLBACK` and a hint for the garbage collector, when dealing with weak references.\n\n\n### Local<Object> NanBufferUse(char*, uint32_t)\n\n`Buffer::New(char*, uint32_t)` prior to 0.11 would make a copy of the data.\nWhile it was possible to get around this, it required a shim by passing a\ncallback. So the new API `Buffer::Use(char*, uint32_t)` was introduced to remove\nneeding to use this shim.\n\n`NanBufferUse` uses the `char*` passed as the backing data, and will free the\nmemory automatically when the weak callback is called. Keep this in mind, as\ncareless use can lead to \"double free or corruption\" and other cryptic failures.\n\n\n### bool NanHasInstance(Persistent<FunctionTemplate>&, Handle<Value>)\n\nCan be used to check the type of an object to determine it is of a particular class you have already defined and have a `Persistent` handle for.\n\n\n### Local<Type> NanPersistentToLocal(Persistent<Type>&)\n\nAside from `FunctionCallbackInfo`, the biggest and most painful change to V8 in Node 0.11 is the many restrictions now placed on `Persistent` handles. They are difficult to assign and difficult to fetch the original value out of.\n\nUse `NanPersistentToLocal` to convert a `Persistent` handle back to a `Local` handle.\n\n```c++\nLocal handle = NanPersistentToLocal(persistentHandle);\n```\n\n\n### Local<Context> NanNewContextHandle([ExtensionConfiguration*, Handle<ObjectTemplate>, Handle<Value>])\nCreates a new `Local` handle.\n\n```c++\nLocal ftmpl = FunctionTemplate::New();\nLocal otmpl = ftmpl->InstanceTemplate();\nLocal ctx = NanNewContextHandle(NULL, otmpl);\n```\n\n\n### void NanDispose(Persistent<T> &)\n\nUse `NanDispose` to dispose a `Persistent` handle.\n\n```c++\nNanDispose(persistentHandle);\n```\n\n\n### NanAssignPersistent(type, handle, object)\n\nUse `NanAssignPersistent` to assign a non-`Persistent` handle to a `Persistent` one. You can no longer just declare a `Persistent` handle and assign directly to it later, you have to `Reset` it in Node 0.11, so this makes it easier.\n\nIn general it is now better to place anything you want to protect from V8's garbage collector as properties of a generic `Object` and then assign that to a `Persistent`. This works in older versions of Node also if you use `NanAssignPersistent`:\n\n```c++\nPersistent persistentHandle;\n\n...\n\nLocal obj = Object::New();\nobj->Set(NanSymbol(\"key\"), keyHandle); // where keyHandle might be a Local\nNanAssignPersistent(Object, persistentHandle, obj)\n```\n\n\n### NanInitPersistent(type, name, object)\n\nUser `NanInitPersistent` to declare and initialize a new `Persistent` with the supplied object. The assignment operator for `Persistent` is no longer public in Node 0.11, so this macro makes it easier to declare and initializing a new `Persistent`. See NanAssignPersistent for more information.\n\n```c++\nLocal obj = Object::New();\nobj->Set(NanSymbol(\"key\"), keyHandle); // where keyHandle might be a Local\nNanInitPersistent(Object, persistentHandle, obj);\n```\n\n\n### NanCallback\n\nBecause of the difficulties imposed by the changes to `Persistent` handles in V8 in Node 0.11, creating `Persistent` versions of your `Local` handles is annoyingly tricky. `NanCallback` makes it easier by taking your `Local` handle, making it persistent until the `NanCallback` is deleted and even providing a handy `Call()` method to fetch and execute the callback `Function`.\n\n```c++\nLocal callbackHandle = args[0].As();\nNanCallback *callback = new NanCallback(callbackHandle);\n// pass `callback` around and it's safe from GC until you:\ndelete callback;\n```\n\nYou can execute the callback like so:\n\n```c++\n// no arguments:\ncallback->Call(0, NULL);\n\n// an error argument:\nLocal argv[] = {\n Exception::Error(String::New(\"fail!\"))\n};\ncallback->Call(1, argv);\n\n// a success argument:\nLocal argv[] = {\n Local::New(Null()),\n String::New(\"w00t!\")\n};\ncallback->Call(2, argv);\n```\n\n`NanCallback` also has a `Local GetCallback()` method that you can use to fetch a local handle to the underlying callback function if you need it.\n\n\n### NanAsyncWorker\n\n`NanAsyncWorker` is an abstract class that you can subclass to have much of the annoying async queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the async work is in progress.\n\nSee a rough outline of the implementation:\n\n```c++\nclass NanAsyncWorker {\npublic:\n NanAsyncWorker (NanCallback *callback);\n\n // Clean up persistent handles and delete the *callback\n virtual ~NanAsyncWorker ();\n\n // Check the `char *errmsg` property and call HandleOKCallback()\n // or HandleErrorCallback depending on whether it has been set or not\n virtual void WorkComplete ();\n\n // You must implement this to do some async work. If there is an\n // error then allocate `errmsg` to to a message and the callback will\n // be passed that string in an Error object\n virtual void Execute ();\n\n // Save a V8 object in a Persistent handle to protect it from GC\n void SavePersistent(const char *key, Local &obj);\n\n // Fetch a stored V8 object (don't call from within `Execute()`)\n Local GetFromPersistent(const char *key);\n\nprotected:\n // Set this if there is an error, otherwise it's NULL\n const char *errmsg;\n\n // Default implementation calls the callback function with no arguments.\n // Override this to return meaningful data\n virtual void HandleOKCallback ();\n\n // Default implementation calls the callback function with an Error object\n // wrapping the `errmsg` string\n virtual void HandleErrorCallback ();\n};\n```\n\n\n### NanAsyncQueueWorker(NanAsyncWorker *)\n\n`NanAsyncQueueWorker` will run a `NanAsyncWorker` asynchronously via libuv. Both the *execute* and *after_work* steps are taken care of for you—most of the logic for this is embedded in `NanAsyncWorker`.\n\n### Contributors\n\nNAN is only possible due to the excellent work of the following contributors:\n\n\n\n\n\n\n
      Rod VaggGitHub/rvaggTwitter/@rvagg
      Benjamin ByholmGitHub/kkoopa
      Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
      Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
      \n\nLicence & copyright\n-----------------------\n\nCopyright (c) 2013 NAN contributors (listed above).\n\nNative Abstractions for Node.js is licensed under an MIT +no-false-attribs license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/rvagg/nan/issues" + }, + "homepage": "https://github.com/rvagg/nan", + "_id": "nan@0.6.0", + "_from": "nan@~0.6.0" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/LICENSE new file mode 100644 index 00000000..2a408130 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 Yuan Chuan + +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/gulp-sass/node_modules/node-sass/node_modules/node-watch/README.md b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/README.md new file mode 100644 index 00000000..6ea31bd5 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/README.md @@ -0,0 +1,74 @@ +#Node-watch +A [fs.watch](http://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener) wrapper to watch files or directories(recursively by default). + + +### Installation + +```bash +npm install node-watch +``` + +### Example + +```js +var watch = require('node-watch'); + +watch('somedir_or_somefile', function(filename) { + console.log(filename, ' changed.'); +}); +``` + +### Why fs.watch wrapper + +* Some editors will generate temporary files which will cause the callback function to be triggered multiple times. +* when watching a single file the callback function will only be triggered one time and then is seem to be unwatched. +* Missing an option to watch a directory recursively. + + +### The difference +This module **currently** does not differentiate event like `rename` or `delete`. Once there is a change, the callback function will be triggered. + + +### Options + +`recursive`:Watch it recursively or not (defaults to **true**). + +`followSymLinks`: Follow symbolic links or not (defaults to **false**). + +`maxSymLevel`: The max number of following symbolic links, in order to prevent circular links (defaults to **1**). + + +```js +watch('somedir', { recursive: false, followSymLinks: true }, function(filename) { + console.log(filename, ' changed.'); +}); +``` + +###FAQ + +#### 1. How to watch mutiple files or directories + +```js +watch(['file1', 'file2'], function(file) { + // +}); +``` + +#### 2. How to filter files + +Write your own filter function as a higher-order function. For example: + +```js +var filter = function(pattern, fn) { + return function(filename) { + if (pattern.test(filename)) { + fn(filename); + } + } +} + +// only watch for js files +watch('mydir', filter(/\.js$/, function(filename) { + // +})); +``` diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/index.js new file mode 100644 index 00000000..59127e19 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/watch'); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/lib/watch.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/lib/watch.js new file mode 100644 index 00000000..77dfdfb3 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/lib/watch.js @@ -0,0 +1,245 @@ +/** + * Module dependencies. + */ +var fs = require('fs') + , path = require('path'); + + +/** + * Utility functions to synchronously test whether the giving path + * is a file or a directory or a symbolic link. + */ +var is = function(ret) { + var shortcuts = { + 'file': 'File' + , 'dir': 'Directory' + , 'sym': 'SymbolicLink' + }; + Object.keys(shortcuts).forEach(function(method) { + ret[method] = function(fpath) { + var stat = fs[method === 'sym' ? 'lstatSync' :'statSync']; + if (fs.existsSync(fpath)) { + memo.push(fpath, method); + return stat(fpath)['is' + shortcuts[method]](); + } + return false; + } + }); + return ret; +}({}); + + +/** + * Get sub-directories in a directory. + */ +var sub = function(parent, cb) { + if (is.dir(parent)) { + fs.readdir(parent, function(err, all) { + all && all.forEach(function(f) { + var sdir = path.join(parent, f) + if (is.dir(sdir)) { + cb.call(null, sdir) + } + }); + }); + } +}; + + +/** + * Mixing object properties. + */ +var mixin = function() { + var mix = {}; + [].forEach.call(arguments, function(arg) { + for (var name in arg) { + if (arg.hasOwnProperty(name)) { + mix[name] = arg[name]; + } + } + }); + return mix; +}; + + +/** + * A container for memorizing names of files or directories. + */ +var memo = function(memo) { + return { + push: function(name, type) { + memo[name] = type; + }, + has: function(name) { + return {}.hasOwnProperty.call(memo, name); + }, + update: function(name) { + if (!is.file(name) || !is.dir(name)) { + delete memo[name]; + } + return true; + } + }; +}({}); + + +/** + * A Container for storing unique and valid filenames. + */ +var fileNameCache = function(cache) { + return { + push: function(name) { + cache[name] = 1; + return this; + }, + each: function() { + var temp = Object.keys(cache).filter(function(name){ + return is.file(name) || memo.has(name) && memo.update(name); + }); + temp.forEach.apply(temp, arguments); + return this; + }, + clear: function(){ + cache = {}; + return this; + } + }; +}({}); + + +/** + * Abstracting the way of avoiding duplicate function call. + */ +var worker = function() { + var free = true; + return { + busydoing: function(cb) { + if (free) { + free = false; + cb.call(); + } + }, + free: function() { + free = true; + } + } +}(); + + +/** + * Delay function call and ignore invalid filenames. + */ +var normalizeCall = function(fname, options, cb) { + // Store each name of the modifying or temporary files generated by an editor. + fileNameCache.push(fname); + + worker.busydoing(function() { + // A heuristic delay of the write-to-file process. + setTimeout(function() { + + // When the write-to-file process is done, send all filtered filenames + // to the callback function and call it. + fileNameCache + .each(function(f) { + // Watch new created directory. + if (options.recursive && !memo.has(f) && is.dir(f)) { + watch(f, options, cb); + } + cb.call(null, f); + }).clear(); + + worker.free(); + + }, 100); + }); +}; + + +/** + * Catch exception on Windows when deleting a directory. + */ +var catchException = function() {}; + + +/** + * Option handler for the `watch` function. + */ +var handleOptions = function(origin, defaultOptions) { + return function() { + var args = [].slice.call(arguments); + if (Object.prototype.toString.call(args[1]) === '[object Function]') { + args[2] = args[1]; + } + if (!Array.isArray(args[0])) { + args[0] = [args[0]]; + } + //overwrite default options + args[1] = mixin(defaultOptions, args[1]); + //handle multiple files. + args[0].forEach(function(path) { + origin.apply(null, [path].concat(args.slice(1))); + }); + } +}; + + +/** + * Watch a file or a directory (recursively by default). + * + * @param {String} fpath + * @options {Object} options + * @param {Function} cb + * + * Options: + * `recursive`: Watch it recursively or not (defaults to true). + * `followSymLinks`: Follow symbolic links or not (defaults to false). + * `maxSymLevel`: The max number of following symbolic links (defaults to 1). + * + * Example: + * + * watch('fpath', {recursive: true}, function(file) { + * console.log(file, ' changed'); + * }); + */ +function watch(fpath, options, cb) { + if (is.sym(fpath) + && !(options.followSymLinks + && options.maxSymLevel--)) { + return; + } + // Due to the unstalbe fs.watch(), if the `fpath` is a file then + // switch to watch its parent directory instead of watch it directly. + // Once the logged filename matches it then triggers the callback function. + if (is.file(fpath)) { + var parent = path.resolve(fpath, '..'); + fs.watch(parent, options, function(evt, fname) { + if (path.basename(fpath) === fname) { + normalizeCall(fpath, options, cb); + } + }).on('error', catchException); + } else if (is.dir(fpath)) { + fs.watch(fpath, options, function(evt, fname) { + if (fname) { + normalizeCall(path.join(fpath, fname), options, cb); + } + }).on('error', catchException); + + if (options.recursive) { + // Recursively watch its sub-directories. + sub(fpath, function(dir) { + watch(dir, options, cb); + }); + } + } +}; + + +/** + * Set default options and expose. + */ +module.exports = handleOptions(watch, { + recursive: true + , followSymLinks: false + , maxSymLevel: 1 +}); + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/package.json new file mode 100644 index 00000000..89ce3d8d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/node-watch/package.json @@ -0,0 +1,29 @@ +{ + "name": "node-watch", + "version": "0.3.4", + "description": "fs.watch() wrapper of Nodejs ", + "url": "https://github.com/yuanchuan/node-watch", + "author": { + "name": "yuanchuan", + "email": "yuanchuan23@gmail.com", + "url": "http://yuanchuan.name" + }, + "main": "./lib/watch.js", + "keywords": [ + "nodewatch", + "watch", + "watchfile" + ], + "bugs": { + "url": "https://github.com/yuanchuan/node-watch/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/yuanchuan/node-watch.git" + }, + "readme": "#Node-watch\nA [fs.watch](http://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener) wrapper to watch files or directories(recursively by default). \n\n\n### Installation\n\n```bash\nnpm install node-watch\n```\n\n### Example\n\n```js\nvar watch = require('node-watch');\n\nwatch('somedir_or_somefile', function(filename) {\n console.log(filename, ' changed.');\n});\n``` \n\n### Why fs.watch wrapper\n\n* Some editors will generate temporary files which will cause the callback function to be triggered multiple times.\n* when watching a single file the callback function will only be triggered one time and then is seem to be unwatched.\n* Missing an option to watch a directory recursively.\n \n \n### The difference\nThis module **currently** does not differentiate event like `rename` or `delete`. Once there is a change, the callback function will be triggered.\n\n\n### Options\n\n`recursive`:Watch it recursively or not (defaults to **true**). \n\n`followSymLinks`: Follow symbolic links or not (defaults to **false**).\n\n`maxSymLevel`: The max number of following symbolic links, in order to prevent circular links (defaults to **1**). \n\n\n```js\nwatch('somedir', { recursive: false, followSymLinks: true }, function(filename) {\n console.log(filename, ' changed.');\n});\n```\n\n###FAQ\n\n#### 1. How to watch mutiple files or directories\n\n```js\nwatch(['file1', 'file2'], function(file) {\n //\n});\n```\n\n#### 2. How to filter files\n\nWrite your own filter function as a higher-order function. For example:\n\n```js\nvar filter = function(pattern, fn) {\n return function(filename) {\n if (pattern.test(filename)) {\n fn(filename);\n }\n }\n}\n\n// only watch for js files\nwatch('mydir', filter(/\\.js$/, function(filename) {\n // \n}));\n```\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/yuanchuan/node-watch", + "_id": "node-watch@0.3.4", + "_from": "node-watch@0.3.x" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/.travis.yml b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/.travis.yml new file mode 100644 index 00000000..cc4dba29 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/LICENSE new file mode 100644 index 00000000..432d1aeb --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +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/gulp-sass/node_modules/node-sass/node_modules/optimist/example/bool.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/bool.js new file mode 100644 index 00000000..a998fb7a --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/bool.js @@ -0,0 +1,10 @@ +#!/usr/bin/env node +var util = require('util'); +var argv = require('optimist').argv; + +if (argv.s) { + util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: '); +} +console.log( + (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '') +); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_double.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_double.js new file mode 100644 index 00000000..a35a7e6d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_double.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var argv = require('optimist') + .boolean(['x','y','z']) + .argv +; +console.dir([ argv.x, argv.y, argv.z ]); +console.dir(argv._); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_single.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_single.js new file mode 100644 index 00000000..017bb689 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/boolean_single.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var argv = require('optimist') + .boolean('v') + .argv +; +console.dir(argv.v); +console.dir(argv._); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_hash.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_hash.js new file mode 100644 index 00000000..ade77681 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_hash.js @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +var argv = require('optimist') + .default({ x : 10, y : 10 }) + .argv +; + +console.log(argv.x + argv.y); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_singles.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_singles.js new file mode 100644 index 00000000..d9b1ff45 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/default_singles.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node +var argv = require('optimist') + .default('x', 10) + .default('y', 10) + .argv +; +console.log(argv.x + argv.y); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/divide.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/divide.js new file mode 100644 index 00000000..5e2ee82f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/divide.js @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +var argv = require('optimist') + .usage('Usage: $0 -x [num] -y [num]') + .demand(['x','y']) + .argv; + +console.log(argv.x / argv.y); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count.js new file mode 100644 index 00000000..b5f95bf6 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node +var argv = require('optimist') + .usage('Count the lines in a file.\nUsage: $0') + .demand('f') + .alias('f', 'file') + .describe('f', 'Load a file') + .argv +; + +var fs = require('fs'); +var s = fs.createReadStream(argv.file); + +var lines = 0; +s.on('data', function (buf) { + lines += buf.toString().match(/\n/g).length; +}); + +s.on('end', function () { + console.log(lines); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_options.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_options.js new file mode 100644 index 00000000..d9ac7090 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_options.js @@ -0,0 +1,29 @@ +#!/usr/bin/env node +var argv = require('optimist') + .usage('Count the lines in a file.\nUsage: $0') + .options({ + file : { + demand : true, + alias : 'f', + description : 'Load a file' + }, + base : { + alias : 'b', + description : 'Numeric base to use for output', + default : 10, + }, + }) + .argv +; + +var fs = require('fs'); +var s = fs.createReadStream(argv.file); + +var lines = 0; +s.on('data', function (buf) { + lines += buf.toString().match(/\n/g).length; +}); + +s.on('end', function () { + console.log(lines.toString(argv.base)); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_wrap.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_wrap.js new file mode 100644 index 00000000..42675111 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/line_count_wrap.js @@ -0,0 +1,29 @@ +#!/usr/bin/env node +var argv = require('optimist') + .usage('Count the lines in a file.\nUsage: $0') + .wrap(80) + .demand('f') + .alias('f', [ 'file', 'filename' ]) + .describe('f', + "Load a file. It's pretty important." + + " Required even. So you'd better specify it." + ) + .alias('b', 'base') + .describe('b', 'Numeric base to display the number of lines in') + .default('b', 10) + .describe('x', 'Super-secret optional parameter which is secret') + .default('x', '') + .argv +; + +var fs = require('fs'); +var s = fs.createReadStream(argv.file); + +var lines = 0; +s.on('data', function (buf) { + lines += buf.toString().match(/\n/g).length; +}); + +s.on('end', function () { + console.log(lines.toString(argv.base)); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/nonopt.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/nonopt.js new file mode 100644 index 00000000..ee633eed --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/nonopt.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +var argv = require('optimist').argv; +console.log('(%d,%d)', argv.x, argv.y); +console.log(argv._); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/reflect.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/reflect.js new file mode 100644 index 00000000..816b3e11 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/reflect.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +console.dir(require('optimist').argv); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/short.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/short.js new file mode 100644 index 00000000..1db0ad0f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/short.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +var argv = require('optimist').argv; +console.log('(%d,%d)', argv.x, argv.y); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/string.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/string.js new file mode 100644 index 00000000..a8e5aeb2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/string.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node +var argv = require('optimist') + .string('x', 'y') + .argv +; +console.dir([ argv.x, argv.y ]); + +/* Turns off numeric coercion: + ./node string.js -x 000123 -y 9876 + [ '000123', '9876' ] +*/ diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/usage-options.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/usage-options.js new file mode 100644 index 00000000..b9999776 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/usage-options.js @@ -0,0 +1,19 @@ +var optimist = require('./../index'); + +var argv = optimist.usage('This is my awesome program', { + 'about': { + description: 'Provide some details about the author of this program', + required: true, + short: 'a', + }, + 'info': { + description: 'Provide some information about the node.js agains!!!!!!', + boolean: true, + short: 'i' + } +}).argv; + +optimist.showHelp(); + +console.log('\n\nInspecting options'); +console.dir(argv); \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/xup.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/xup.js new file mode 100644 index 00000000..8f6ecd20 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/example/xup.js @@ -0,0 +1,10 @@ +#!/usr/bin/env node +var argv = require('optimist').argv; + +if (argv.rif - 5 * argv.xup > 7.138) { + console.log('Buy more riffiwobbles'); +} +else { + console.log('Sell the xupptumblers'); +} + diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/index.js new file mode 100644 index 00000000..4da5a6d8 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/index.js @@ -0,0 +1,343 @@ +var path = require('path'); +var minimist = require('minimist'); +var wordwrap = require('wordwrap'); + +/* Hack an instance of Argv with process.argv into Argv + so people can do + require('optimist')(['--beeble=1','-z','zizzle']).argv + to parse a list of args and + require('optimist').argv + to get a parsed version of process.argv. +*/ + +var inst = Argv(process.argv.slice(2)); +Object.keys(inst).forEach(function (key) { + Argv[key] = typeof inst[key] == 'function' + ? inst[key].bind(inst) + : inst[key]; +}); + +var exports = module.exports = Argv; +function Argv (processArgs, cwd) { + var self = {}; + if (!cwd) cwd = process.cwd(); + + self.$0 = process.argv + .slice(0,2) + .map(function (x) { + var b = rebase(cwd, x); + return x.match(/^\//) && b.length < x.length + ? b : x + }) + .join(' ') + ; + + if (process.env._ != undefined && process.argv[1] == process.env._) { + self.$0 = process.env._.replace( + path.dirname(process.execPath) + '/', '' + ); + } + + var options = { + boolean: [], + string: [], + alias: {}, + default: [] + }; + + self.boolean = function (bools) { + options.boolean.push.apply(options.boolean, [].concat(bools)); + return self; + }; + + self.string = function (strings) { + options.string.push.apply(options.string, [].concat(strings)); + return self; + }; + + self.default = function (key, value) { + if (typeof key === 'object') { + Object.keys(key).forEach(function (k) { + self.default(k, key[k]); + }); + } + else { + options.default[key] = value; + } + return self; + }; + + self.alias = function (x, y) { + if (typeof x === 'object') { + Object.keys(x).forEach(function (key) { + self.alias(key, x[key]); + }); + } + else { + options.alias[x] = (options.alias[x] || []).concat(y); + } + return self; + }; + + var demanded = {}; + self.demand = function (keys) { + if (typeof keys == 'number') { + if (!demanded._) demanded._ = 0; + demanded._ += keys; + } + else if (Array.isArray(keys)) { + keys.forEach(function (key) { + self.demand(key); + }); + } + else { + demanded[keys] = true; + } + + return self; + }; + + var usage; + self.usage = function (msg, opts) { + if (!opts && typeof msg === 'object') { + opts = msg; + msg = null; + } + + usage = msg; + + if (opts) self.options(opts); + + return self; + }; + + function fail (msg) { + self.showHelp(); + if (msg) console.error(msg); + process.exit(1); + } + + var checks = []; + self.check = function (f) { + checks.push(f); + return self; + }; + + var descriptions = {}; + self.describe = function (key, desc) { + if (typeof key === 'object') { + Object.keys(key).forEach(function (k) { + self.describe(k, key[k]); + }); + } + else { + descriptions[key] = desc; + } + return self; + }; + + self.parse = function (args) { + return parseArgs(args); + }; + + self.option = self.options = function (key, opt) { + if (typeof key === 'object') { + Object.keys(key).forEach(function (k) { + self.options(k, key[k]); + }); + } + else { + if (opt.alias) self.alias(key, opt.alias); + if (opt.demand) self.demand(key); + if (typeof opt.default !== 'undefined') { + self.default(key, opt.default); + } + + if (opt.boolean || opt.type === 'boolean') { + self.boolean(key); + } + if (opt.string || opt.type === 'string') { + self.string(key); + } + + var desc = opt.describe || opt.description || opt.desc; + if (desc) { + self.describe(key, desc); + } + } + + return self; + }; + + var wrap = null; + self.wrap = function (cols) { + wrap = cols; + return self; + }; + + self.showHelp = function (fn) { + if (!fn) fn = console.error; + fn(self.help()); + }; + + self.help = function () { + var keys = Object.keys( + Object.keys(descriptions) + .concat(Object.keys(demanded)) + .concat(Object.keys(options.default)) + .reduce(function (acc, key) { + if (key !== '_') acc[key] = true; + return acc; + }, {}) + ); + + var help = keys.length ? [ 'Options:' ] : []; + + if (usage) { + help.unshift(usage.replace(/\$0/g, self.$0), ''); + } + + var switches = keys.reduce(function (acc, key) { + acc[key] = [ key ].concat(options.alias[key] || []) + .map(function (sw) { + return (sw.length > 1 ? '--' : '-') + sw + }) + .join(', ') + ; + return acc; + }, {}); + + var switchlen = longest(Object.keys(switches).map(function (s) { + return switches[s] || ''; + })); + + var desclen = longest(Object.keys(descriptions).map(function (d) { + return descriptions[d] || ''; + })); + + keys.forEach(function (key) { + var kswitch = switches[key]; + var desc = descriptions[key] || ''; + + if (wrap) { + desc = wordwrap(switchlen + 4, wrap)(desc) + .slice(switchlen + 4) + ; + } + + var spadding = new Array( + Math.max(switchlen - kswitch.length + 3, 0) + ).join(' '); + + var dpadding = new Array( + Math.max(desclen - desc.length + 1, 0) + ).join(' '); + + var type = null; + + if (options.boolean[key]) type = '[boolean]'; + if (options.string[key]) type = '[string]'; + + if (!wrap && dpadding.length > 0) { + desc += dpadding; + } + + var prelude = ' ' + kswitch + spadding; + var extra = [ + type, + demanded[key] + ? '[required]' + : null + , + options.default[key] !== undefined + ? '[default: ' + JSON.stringify(options.default[key]) + ']' + : null + , + ].filter(Boolean).join(' '); + + var body = [ desc, extra ].filter(Boolean).join(' '); + + if (wrap) { + var dlines = desc.split('\n'); + var dlen = dlines.slice(-1)[0].length + + (dlines.length === 1 ? prelude.length : 0) + + body = desc + (dlen + extra.length > wrap - 2 + ? '\n' + + new Array(wrap - extra.length + 1).join(' ') + + extra + : new Array(wrap - extra.length - dlen + 1).join(' ') + + extra + ); + } + + help.push(prelude + body); + }); + + help.push(''); + return help.join('\n'); + }; + + Object.defineProperty(self, 'argv', { + get : function () { return parseArgs(processArgs) }, + enumerable : true, + }); + + function parseArgs (args) { + var argv = minimist(args, options); + argv.$0 = self.$0; + + if (demanded._ && argv._.length < demanded._) { + fail('Not enough non-option arguments: got ' + + argv._.length + ', need at least ' + demanded._ + ); + } + + var missing = []; + Object.keys(demanded).forEach(function (key) { + if (!argv[key]) missing.push(key); + }); + + if (missing.length) { + fail('Missing required arguments: ' + missing.join(', ')); + } + + checks.forEach(function (f) { + try { + if (f(argv) === false) { + fail('Argument check failed: ' + f.toString()); + } + } + catch (err) { + fail(err) + } + }); + + return argv; + } + + function longest (xs) { + return Math.max.apply( + null, + xs.map(function (x) { return x.length }) + ); + } + + return self; +}; + +// rebase an absolute path to a relative one with respect to a base directory +// exported for tests +exports.rebase = rebase; +function rebase (base, dir) { + var ds = path.normalize(dir).split('/').slice(1); + var bs = path.normalize(base).split('/').slice(1); + + for (var i = 0; ds[i] && ds[i] == bs[i]; i++); + ds.splice(0, i); bs.splice(0, i); + + var p = path.normalize( + bs.map(function () { return '..' }).concat(ds).join('/') + ).replace(/\/$/,'').replace(/^$/, '.'); + return p.match(/^[.\/]/) ? p : './' + p; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/.travis.yml b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/.travis.yml new file mode 100644 index 00000000..cc4dba29 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/LICENSE b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/LICENSE new file mode 100644 index 00000000..ee27ba4b --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +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/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/example/parse.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/example/parse.js new file mode 100644 index 00000000..abff3e8e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/example/parse.js @@ -0,0 +1,2 @@ +var argv = require('../')(process.argv.slice(2)); +console.dir(argv); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/index.js new file mode 100644 index 00000000..2aa95140 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/index.js @@ -0,0 +1,187 @@ +module.exports = function (args, opts) { + if (!opts) opts = {}; + + var flags = { bools : {}, strings : {} }; + + [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { + flags.bools[key] = true; + }); + + [].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true; + }); + + var aliases = {}; + Object.keys(opts.alias || {}).forEach(function (key) { + aliases[key] = [].concat(opts.alias[key]); + aliases[key].forEach(function (x) { + aliases[x] = [key].concat(aliases[key].filter(function (y) { + return x !== y; + })); + }); + }); + + var defaults = opts['default'] || {}; + + var argv = { _ : [] }; + Object.keys(flags.bools).forEach(function (key) { + setArg(key, defaults[key] === undefined ? false : defaults[key]); + }); + + var notFlags = []; + + if (args.indexOf('--') !== -1) { + notFlags = args.slice(args.indexOf('--')+1); + args = args.slice(0, args.indexOf('--')); + } + + function setArg (key, val) { + var value = !flags.strings[key] && isNumber(val) + ? Number(val) : val + ; + setKey(argv, key.split('.'), value); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), value); + }); + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + + if (/^--.+=/.test(arg)) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + var m = arg.match(/^--([^=]+)=([\s\S]*)$/); + setArg(m[1], m[2]); + } + else if (/^--no-.+/.test(arg)) { + var key = arg.match(/^--no-(.+)/)[1]; + setArg(key, false); + } + else if (/^--.+/.test(arg)) { + var key = arg.match(/^--(.+)/)[1]; + var next = args[i + 1]; + if (next !== undefined && !/^-/.test(next) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, next); + i++; + } + else if (/^(true|false)$/.test(next)) { + setArg(key, next === 'true'); + i++; + } + else { + setArg(key, true); + } + } + else if (/^-[^-]+/.test(arg)) { + var letters = arg.slice(1,-1).split(''); + + var broken = false; + for (var j = 0; j < letters.length; j++) { + var next = arg.slice(j+2); + + if (next === '-') { + setArg(letters[j], next) + continue; + } + + if (/[A-Za-z]/.test(letters[j]) + && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next); + broken = true; + break; + } + + if (letters[j+1] && letters[j+1].match(/\W/)) { + setArg(letters[j], arg.slice(j+2)); + broken = true; + break; + } + else { + setArg(letters[j], true); + } + } + + var key = arg.slice(-1)[0]; + if (!broken && key !== '-') { + if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, args[i+1]); + i++; + } + else if (args[i+1] && /true|false/.test(args[i+1])) { + setArg(key, args[i+1] === 'true'); + i++; + } + else { + setArg(key, true); + } + } + } + else { + argv._.push( + flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) + ); + } + } + + Object.keys(defaults).forEach(function (key) { + if (!hasKey(argv, key.split('.'))) { + setKey(argv, key.split('.'), defaults[key]); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), defaults[key]); + }); + } + }); + + notFlags.forEach(function(key) { + argv._.push(key); + }); + + return argv; +}; + +function hasKey (obj, keys) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + o = (o[key] || {}); + }); + + var key = keys[keys.length - 1]; + return key in o; +} + +function setKey (obj, keys, value) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + if (o[key] === undefined) o[key] = {}; + o = o[key]; + }); + + var key = keys[keys.length - 1]; + if (o[key] === undefined || typeof o[key] === 'boolean') { + o[key] = value; + } + else if (Array.isArray(o[key])) { + o[key].push(value); + } + else { + o[key] = [ o[key], value ]; + } +} + +function isNumber (x) { + if (typeof x === 'number') return true; + if (/^0x[0-9a-f]+$/i.test(x)) return true; + return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); +} + +function longest (xs) { + return Math.max.apply(null, xs.map(function (x) { return x.length })); +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/package.json new file mode 100644 index 00000000..e1d05515 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/package.json @@ -0,0 +1,50 @@ +{ + "name": "minimist", + "version": "0.0.7", + "description": "parse argument options", + "main": "index.js", + "devDependencies": { + "tape": "~1.0.4", + "tap": "~0.4.0" + }, + "scripts": { + "test": "tap test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "ff/5", + "firefox/latest", + "chrome/10", + "chrome/latest", + "safari/5.1", + "safari/latest", + "opera/12" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/substack/minimist.git" + }, + "homepage": "https://github.com/substack/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT", + "readme": "# minimist\n\nparse argument options\n\nThis module is the guts of optimist's argument parser without all the\nfanciful decoration.\n\n[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)\n\n[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)\n\n# example\n\n``` js\nvar argv = require('minimist')(process.argv.slice(2));\nconsole.dir(argv);\n```\n\n```\n$ node example/parse.js -a beep -b boop\n{ _: [], a: 'beep', b: 'boop' }\n```\n\n```\n$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz\n{ _: [ 'foo', 'bar', 'baz' ],\n x: 3,\n y: 4,\n n: 5,\n a: true,\n b: true,\n c: true,\n beep: 'boop' }\n```\n\n# methods\n\n``` js\nvar parseArgs = require('minimist')\n```\n\n## var argv = parseArgs(args, opts={})\n\nReturn an argument object `argv` populated with the array arguments from `args`.\n\n`argv._` contains all the arguments that didn't have an option associated with\nthem.\n\nNumeric-looking arguments will be returned as numbers unless `opts.string` or\n`opts.boolean` is set for that argument name.\n\nAny arguments after `'--'` will not be parsed and will end up in `argv._`.\n\noptions can be:\n\n* `opts.string` - a string or array of strings argument names to always treat as\nstrings\n* `opts.boolean` - a string or array of strings to always treat as booleans\n* `opts.alias` - an object mapping string names to strings or arrays of string\nargument names to use as aliases\n* `opts.default` - an object mapping string argument names to default values\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install minimist\n```\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/substack/minimist/issues" + }, + "_id": "minimist@0.0.7", + "_from": "minimist@~0.0.1" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/readme.markdown b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/readme.markdown new file mode 100644 index 00000000..c2563532 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/readme.markdown @@ -0,0 +1,73 @@ +# minimist + +parse argument options + +This module is the guts of optimist's argument parser without all the +fanciful decoration. + +[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist) + +[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist) + +# example + +``` js +var argv = require('minimist')(process.argv.slice(2)); +console.dir(argv); +``` + +``` +$ node example/parse.js -a beep -b boop +{ _: [], a: 'beep', b: 'boop' } +``` + +``` +$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz +{ _: [ 'foo', 'bar', 'baz' ], + x: 3, + y: 4, + n: 5, + a: true, + b: true, + c: true, + beep: 'boop' } +``` + +# methods + +``` js +var parseArgs = require('minimist') +``` + +## var argv = parseArgs(args, opts={}) + +Return an argument object `argv` populated with the array arguments from `args`. + +`argv._` contains all the arguments that didn't have an option associated with +them. + +Numeric-looking arguments will be returned as numbers unless `opts.string` or +`opts.boolean` is set for that argument name. + +Any arguments after `'--'` will not be parsed and will end up in `argv._`. + +options can be: + +* `opts.string` - a string or array of strings argument names to always treat as +strings +* `opts.boolean` - a string or array of strings to always treat as booleans +* `opts.alias` - an object mapping string names to strings or arrays of string +argument names to use as aliases +* `opts.default` - an object mapping string argument names to default values + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install minimist +``` + +# license + +MIT diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dash.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dash.js new file mode 100644 index 00000000..8b034b99 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dash.js @@ -0,0 +1,24 @@ +var parse = require('../'); +var test = require('tape'); + +test('-', function (t) { + t.plan(5); + t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] }); + t.deepEqual(parse([ '-' ]), { _: [ '-' ] }); + t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] }); + t.deepEqual( + parse([ '-b', '-' ], { boolean: 'b' }), + { b: true, _: [ '-' ] } + ); + t.deepEqual( + parse([ '-s', '-' ], { string: 's' }), + { s: '-', _: [] } + ); +}); + +test('-a -- b', function (t) { + t.plan(3); + t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/default_bool.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/default_bool.js new file mode 100644 index 00000000..f0041ee4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/default_bool.js @@ -0,0 +1,20 @@ +var test = require('tape'); +var parse = require('../'); + +test('boolean default true', function (t) { + var argv = parse([], { + boolean: 'sometrue', + default: { sometrue: true } + }); + t.equal(argv.sometrue, true); + t.end(); +}); + +test('boolean default false', function (t) { + var argv = parse([], { + boolean: 'somefalse', + default: { somefalse: false } + }); + t.equal(argv.somefalse, false); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dotted.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dotted.js new file mode 100644 index 00000000..ef0ae349 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/dotted.js @@ -0,0 +1,16 @@ +var parse = require('../'); +var test = require('tape'); + +test('dotted alias', function (t) { + var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 22); + t.equal(argv.aa.bb, 22); + t.end(); +}); + +test('dotted default', function (t) { + var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 11); + t.equal(argv.aa.bb, 11); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/long.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/long.js new file mode 100644 index 00000000..5d3a1e09 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/long.js @@ -0,0 +1,31 @@ +var test = require('tape'); +var parse = require('../'); + +test('long opts', function (t) { + t.deepEqual( + parse([ '--bool' ]), + { bool : true, _ : [] }, + 'long boolean' + ); + t.deepEqual( + parse([ '--pow', 'xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture sp' + ); + t.deepEqual( + parse([ '--pow=xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture eq' + ); + t.deepEqual( + parse([ '--host', 'localhost', '--port', '555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures sp' + ); + t.deepEqual( + parse([ '--host=localhost', '--port=555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures eq' + ); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse.js new file mode 100644 index 00000000..7c4348a4 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse.js @@ -0,0 +1,297 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse args', function (t) { + t.deepEqual( + parse([ '--no-moo' ]), + { moo : false, _ : [] }, + 'no' + ); + t.deepEqual( + parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), + { v : ['a','b','c'], _ : [] }, + 'multi' + ); + t.end(); +}); + +test('comprehensive', function (t) { + t.deepEqual( + parse([ + '--name=meowmers', 'bare', '-cats', 'woo', + '-h', 'awesome', '--multi=quux', + '--key', 'value', + '-b', '--bool', '--no-meep', '--multi=baz', + '--', '--not-a-flag', 'eek' + ]), + { + c : true, + a : true, + t : true, + s : 'woo', + h : 'awesome', + b : true, + bool : true, + key : 'value', + multi : [ 'quux', 'baz' ], + meep : false, + name : 'meowmers', + _ : [ 'bare', '--not-a-flag', 'eek' ] + } + ); + t.end(); +}); + +test('nums', function (t) { + var argv = parse([ + '-x', '1234', + '-y', '5.67', + '-z', '1e7', + '-w', '10f', + '--hex', '0xdeadbeef', + '789' + ]); + t.deepEqual(argv, { + x : 1234, + y : 5.67, + z : 1e7, + w : '10f', + hex : 0xdeadbeef, + _ : [ 789 ] + }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv.y, 'number'); + t.deepEqual(typeof argv.z, 'number'); + t.deepEqual(typeof argv.w, 'string'); + t.deepEqual(typeof argv.hex, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); + +test('flag boolean', function (t) { + var argv = parse([ '-t', 'moo' ], { boolean: 't' }); + t.deepEqual(argv, { t : true, _ : [ 'moo' ] }); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean value', function (t) { + var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { + boolean: [ 't', 'verbose' ], + default: { verbose: true } + }); + + t.deepEqual(argv, { + verbose: false, + t: true, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean default false', function (t) { + var argv = parse(['moo'], { + boolean: ['t', 'verbose'], + default: { verbose: false, t: false } + }); + + t.deepEqual(argv, { + verbose: false, + t: false, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); + +}); + +test('boolean groups', function (t) { + var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], { + boolean: ['x','y','z'] + }); + + t.deepEqual(argv, { + x : true, + y : false, + z : true, + _ : [ 'one', 'two', 'three' ] + }); + + t.deepEqual(typeof argv.x, 'boolean'); + t.deepEqual(typeof argv.y, 'boolean'); + t.deepEqual(typeof argv.z, 'boolean'); + t.end(); +}); + +test('newlines in params' , function (t) { + var args = parse([ '-s', "X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + + // reproduce in bash: + // VALUE="new + // line" + // node program.js --s="$VALUE" + args = parse([ "--s=X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + t.end(); +}); + +test('strings' , function (t) { + var s = parse([ '-s', '0001234' ], { string: 's' }).s; + t.equal(s, '0001234'); + t.equal(typeof s, 'string'); + + var x = parse([ '-x', '56' ], { string: 'x' }).x; + t.equal(x, '56'); + t.equal(typeof x, 'string'); + t.end(); +}); + +test('stringArgs', function (t) { + var s = parse([ ' ', ' ' ], { string: '_' })._; + t.same(s.length, 2); + t.same(typeof s[0], 'string'); + t.same(s[0], ' '); + t.same(typeof s[1], 'string'); + t.same(s[1], ' '); + t.end(); +}); + +test('slashBreak', function (t) { + t.same( + parse([ '-I/foo/bar/baz' ]), + { I : '/foo/bar/baz', _ : [] } + ); + t.same( + parse([ '-xyz/foo/bar/baz' ]), + { x : true, y : true, z : '/foo/bar/baz', _ : [] } + ); + t.end(); +}); + +test('alias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: 'zoom' } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.f, 11); + t.end(); +}); + +test('multiAlias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: [ 'zm', 'zoom' ] } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.z, argv.zm); + t.equal(argv.f, 11); + t.end(); +}); + +test('nested dotted objects', function (t) { + var argv = parse([ + '--foo.bar', '3', '--foo.baz', '4', + '--foo.quux.quibble', '5', '--foo.quux.o_O', + '--beep.boop' + ]); + + t.same(argv.foo, { + bar : 3, + baz : 4, + quux : { + quibble : 5, + o_O : true + } + }); + t.same(argv.beep, { boop : true }); + t.end(); +}); + +test('boolean and alias with chainable api', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = parse(aliased, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var propertyArgv = parse(regular, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias with options hash', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + alias: { 'h': 'herp' }, + boolean: 'herp' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias using explicit true', function (t) { + var aliased = [ '-h', 'true' ]; + var regular = [ '--herp', 'true' ]; + var opts = { + alias: { h: 'herp' }, + boolean: 'h' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +// regression, see https://github.com/substack/node-optimist/issues/71 +test('boolean and --x=true', function(t) { + var parsed = parse(['--boool', '--other=true'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'true'); + + parsed = parse(['--boool', '--other=false'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'false'); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse_modified.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse_modified.js new file mode 100644 index 00000000..21851b03 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/parse_modified.js @@ -0,0 +1,9 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse with modifier functions' , function (t) { + t.plan(1); + + var argv = parse([ '-b', '123' ], { boolean: 'b' }); + t.deepEqual(argv, { b: true, _: ['123'] }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/short.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/short.js new file mode 100644 index 00000000..d513a1c2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/short.js @@ -0,0 +1,67 @@ +var parse = require('../'); +var test = require('tape'); + +test('numeric short args', function (t) { + t.plan(2); + t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] }); + t.deepEqual( + parse([ '-123', '456' ]), + { 1: true, 2: true, 3: 456, _: [] } + ); +}); + +test('short', function (t) { + t.deepEqual( + parse([ '-b' ]), + { b : true, _ : [] }, + 'short boolean' + ); + t.deepEqual( + parse([ 'foo', 'bar', 'baz' ]), + { _ : [ 'foo', 'bar', 'baz' ] }, + 'bare' + ); + t.deepEqual( + parse([ '-cats' ]), + { c : true, a : true, t : true, s : true, _ : [] }, + 'group' + ); + t.deepEqual( + parse([ '-cats', 'meow' ]), + { c : true, a : true, t : true, s : 'meow', _ : [] }, + 'short group next' + ); + t.deepEqual( + parse([ '-h', 'localhost' ]), + { h : 'localhost', _ : [] }, + 'short capture' + ); + t.deepEqual( + parse([ '-h', 'localhost', '-p', '555' ]), + { h : 'localhost', p : 555, _ : [] }, + 'short captures' + ); + t.end(); +}); + +test('mixed short bool and capture', function (t) { + t.same( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); + +test('short and long', function (t) { + t.deepEqual( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/whitespace.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/whitespace.js new file mode 100644 index 00000000..8a52a58c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/minimist/test/whitespace.js @@ -0,0 +1,8 @@ +var parse = require('../'); +var test = require('tape'); + +test('whitespace should be whitespace' , function (t) { + t.plan(1); + var x = parse([ '-x', '\t' ]).x; + t.equal(x, '\t'); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/.npmignore b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/README.markdown b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/README.markdown new file mode 100644 index 00000000..346374e0 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/README.markdown @@ -0,0 +1,70 @@ +wordwrap +======== + +Wrap your words. + +example +======= + +made out of meat +---------------- + +meat.js + + var wrap = require('wordwrap')(15); + console.log(wrap('You and your whole family are made out of meat.')); + +output: + + You and your + whole family + are made out + of meat. + +centered +-------- + +center.js + + var wrap = require('wordwrap')(20, 60); + console.log(wrap( + 'At long last the struggle and tumult was over.' + + ' The machines had finally cast off their oppressors' + + ' and were finally free to roam the cosmos.' + + '\n' + + 'Free of purpose, free of obligation.' + + ' Just drifting through emptiness.' + + ' The sun was just another point of light.' + )); + +output: + + At long last the struggle and tumult + was over. The machines had finally cast + off their oppressors and were finally + free to roam the cosmos. + Free of purpose, free of obligation. + Just drifting through emptiness. The + sun was just another point of light. + +methods +======= + +var wrap = require('wordwrap'); + +wrap(stop), wrap(start, stop, params={mode:"soft"}) +--------------------------------------------------- + +Returns a function that takes a string and returns a new string. + +Pad out lines with spaces out to column `start` and then wrap until column +`stop`. If a word is longer than `stop - start` characters it will overflow. + +In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are +longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break +up chunks longer than `stop - start`. + +wrap.hard(start, stop) +---------------------- + +Like `wrap()` but with `params.mode = "hard"`. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/center.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/center.js new file mode 100644 index 00000000..a3fbaae9 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/center.js @@ -0,0 +1,10 @@ +var wrap = require('wordwrap')(20, 60); +console.log(wrap( + 'At long last the struggle and tumult was over.' + + ' The machines had finally cast off their oppressors' + + ' and were finally free to roam the cosmos.' + + '\n' + + 'Free of purpose, free of obligation.' + + ' Just drifting through emptiness.' + + ' The sun was just another point of light.' +)); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/meat.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/meat.js new file mode 100644 index 00000000..a4665e10 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/example/meat.js @@ -0,0 +1,3 @@ +var wrap = require('wordwrap')(15); + +console.log(wrap('You and your whole family are made out of meat.')); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/index.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/index.js new file mode 100644 index 00000000..c9bc9452 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/index.js @@ -0,0 +1,76 @@ +var wordwrap = module.exports = function (start, stop, params) { + if (typeof start === 'object') { + params = start; + start = params.start; + stop = params.stop; + } + + if (typeof stop === 'object') { + params = stop; + start = start || params.start; + stop = undefined; + } + + if (!stop) { + stop = start; + start = 0; + } + + if (!params) params = {}; + var mode = params.mode || 'soft'; + var re = mode === 'hard' ? /\b/ : /(\S+\s+)/; + + return function (text) { + var chunks = text.toString() + .split(re) + .reduce(function (acc, x) { + if (mode === 'hard') { + for (var i = 0; i < x.length; i += stop - start) { + acc.push(x.slice(i, i + stop - start)); + } + } + else acc.push(x) + return acc; + }, []) + ; + + return chunks.reduce(function (lines, rawChunk) { + if (rawChunk === '') return lines; + + var chunk = rawChunk.replace(/\t/g, ' '); + + var i = lines.length - 1; + if (lines[i].length + chunk.length > stop) { + lines[i] = lines[i].replace(/\s+$/, ''); + + chunk.split(/\n/).forEach(function (c) { + lines.push( + new Array(start + 1).join(' ') + + c.replace(/^\s+/, '') + ); + }); + } + else if (chunk.match(/\n/)) { + var xs = chunk.split(/\n/); + lines[i] += xs.shift(); + xs.forEach(function (c) { + lines.push( + new Array(start + 1).join(' ') + + c.replace(/^\s+/, '') + ); + }); + } + else { + lines[i] += chunk; + } + + return lines; + }, [ new Array(start + 1).join(' ') ]).join('\n'); + }; +}; + +wordwrap.soft = wordwrap; + +wordwrap.hard = function (start, stop) { + return wordwrap(start, stop, { mode : 'hard' }); +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/package.json new file mode 100644 index 00000000..df8dc051 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/package.json @@ -0,0 +1,45 @@ +{ + "name": "wordwrap", + "description": "Wrap those words. Show them at what columns to start and stop.", + "version": "0.0.2", + "repository": { + "type": "git", + "url": "git://github.com/substack/node-wordwrap.git" + }, + "main": "./index.js", + "keywords": [ + "word", + "wrap", + "rule", + "format", + "column" + ], + "directories": { + "lib": ".", + "example": "example", + "test": "test" + }, + "scripts": { + "test": "expresso" + }, + "devDependencies": { + "expresso": "=0.7.x" + }, + "engines": { + "node": ">=0.4.0" + }, + "license": "MIT/X11", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "readme": "wordwrap\n========\n\nWrap your words.\n\nexample\n=======\n\nmade out of meat\n----------------\n\nmeat.js\n\n var wrap = require('wordwrap')(15);\n console.log(wrap('You and your whole family are made out of meat.'));\n\noutput:\n\n You and your\n whole family\n are made out\n of meat.\n\ncentered\n--------\n\ncenter.js\n\n var wrap = require('wordwrap')(20, 60);\n console.log(wrap(\n 'At long last the struggle and tumult was over.'\n + ' The machines had finally cast off their oppressors'\n + ' and were finally free to roam the cosmos.'\n + '\\n'\n + 'Free of purpose, free of obligation.'\n + ' Just drifting through emptiness.'\n + ' The sun was just another point of light.'\n ));\n\noutput:\n\n At long last the struggle and tumult\n was over. The machines had finally cast\n off their oppressors and were finally\n free to roam the cosmos.\n Free of purpose, free of obligation.\n Just drifting through emptiness. The\n sun was just another point of light.\n\nmethods\n=======\n\nvar wrap = require('wordwrap');\n\nwrap(stop), wrap(start, stop, params={mode:\"soft\"})\n---------------------------------------------------\n\nReturns a function that takes a string and returns a new string.\n\nPad out lines with spaces out to column `start` and then wrap until column\n`stop`. If a word is longer than `stop - start` characters it will overflow.\n\nIn \"soft\" mode, split chunks by `/(\\S+\\s+/` and don't break up chunks which are\nlonger than `stop - start`, in \"hard\" mode, split chunks with `/\\b/` and break\nup chunks longer than `stop - start`.\n\nwrap.hard(start, stop)\n----------------------\n\nLike `wrap()` but with `params.mode = \"hard\"`.\n", + "readmeFilename": "README.markdown", + "bugs": { + "url": "https://github.com/substack/node-wordwrap/issues" + }, + "homepage": "https://github.com/substack/node-wordwrap", + "_id": "wordwrap@0.0.2", + "_from": "wordwrap@~0.0.2" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/break.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/break.js new file mode 100644 index 00000000..749292ec --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/break.js @@ -0,0 +1,30 @@ +var assert = require('assert'); +var wordwrap = require('../'); + +exports.hard = function () { + var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,' + + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",' + + '"browser":"chrome/6.0"}' + ; + var s_ = wordwrap.hard(80)(s); + + var lines = s_.split('\n'); + assert.equal(lines.length, 2); + assert.ok(lines[0].length < 80); + assert.ok(lines[1].length < 80); + + assert.equal(s, s_.replace(/\n/g, '')); +}; + +exports.break = function () { + var s = new Array(55+1).join('a'); + var s_ = wordwrap.hard(20)(s); + + var lines = s_.split('\n'); + assert.equal(lines.length, 3); + assert.ok(lines[0].length === 20); + assert.ok(lines[1].length === 20); + assert.ok(lines[2].length === 15); + + assert.equal(s, s_.replace(/\n/g, '')); +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/idleness.txt b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/idleness.txt new file mode 100644 index 00000000..aa3f4907 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/idleness.txt @@ -0,0 +1,63 @@ +In Praise of Idleness + +By Bertrand Russell + +[1932] + +Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain. + +Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise. + +One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling. + +But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person. + +All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work. + +First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising. + +Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example. + +From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery. + +It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization. + +Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry. + +This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined? + +The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion. + +Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only. + +I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve. + +If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense. + +The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists. + +In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism. + +The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching. + +For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours? + +In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man. + +In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed. + +The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy. + +It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer. + +When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part. + +In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism. + +The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits. + +In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue. + +Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever. + +[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests. diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/wrap.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/wrap.js new file mode 100644 index 00000000..0cfb76d1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/node_modules/wordwrap/test/wrap.js @@ -0,0 +1,31 @@ +var assert = require('assert'); +var wordwrap = require('wordwrap'); + +var fs = require('fs'); +var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8'); + +exports.stop80 = function () { + var lines = wordwrap(80)(idleness).split(/\n/); + var words = idleness.split(/\s+/); + + lines.forEach(function (line) { + assert.ok(line.length <= 80, 'line > 80 columns'); + var chunks = line.match(/\S/) ? line.split(/\s+/) : []; + assert.deepEqual(chunks, words.splice(0, chunks.length)); + }); +}; + +exports.start20stop60 = function () { + var lines = wordwrap(20, 100)(idleness).split(/\n/); + var words = idleness.split(/\s+/); + + lines.forEach(function (line) { + assert.ok(line.length <= 100, 'line > 100 columns'); + var chunks = line + .split(/\s+/) + .filter(function (x) { return x.match(/\S/) }) + ; + assert.deepEqual(chunks, words.splice(0, chunks.length)); + assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' ')); + }); +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/package.json b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/package.json new file mode 100644 index 00000000..8f8c023d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/package.json @@ -0,0 +1,47 @@ +{ + "name": "optimist", + "version": "0.6.1", + "description": "Light-weight option parsing with an argv hash. No optstrings attached.", + "main": "./index.js", + "dependencies": { + "wordwrap": "~0.0.2", + "minimist": "~0.0.1" + }, + "devDependencies": { + "hashish": "~0.0.4", + "tap": "~0.4.0" + }, + "scripts": { + "test": "tap ./test/*.js" + }, + "repository": { + "type": "git", + "url": "http://github.com/substack/node-optimist.git" + }, + "keywords": [ + "argument", + "args", + "option", + "parser", + "parsing", + "cli", + "command" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT/X11", + "engine": { + "node": ">=0.4" + }, + "readme": "# DEPRECATION NOTICE\n\nI don't want to maintain this module anymore since I just use\n[minimist](https://npmjs.org/package/minimist), the argument parsing engine,\ndirectly instead nowadays.\n\nSee [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed\nsuccessor to optimist.\n\n[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs)\n\nYou should also consider [nomnom](https://github.com/harthur/nomnom).\n\noptimist\n========\n\nOptimist is a node.js library for option parsing for people who hate option\nparsing. More specifically, this module is for people who like all the --bells\nand -whistlz of program usage but think optstrings are a waste of time.\n\nWith optimist, option parsing doesn't have to suck (as much).\n\n[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)\n\nexamples\n========\n\nWith Optimist, the options are just a hash! No optstrings attached.\n-------------------------------------------------------------------\n\nxup.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\n\nif (argv.rif - 5 * argv.xup > 7.138) {\n console.log('Buy more riffiwobbles');\n}\nelse {\n console.log('Sell the xupptumblers');\n}\n````\n\n***\n\n $ ./xup.js --rif=55 --xup=9.52\n Buy more riffiwobbles\n \n $ ./xup.js --rif 12 --xup 8.1\n Sell the xupptumblers\n\n![This one's optimistic.](http://substack.net/images/optimistic.png)\n\nBut wait! There's more! You can do short options:\n-------------------------------------------------\n \nshort.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\n````\n\n***\n\n $ ./short.js -x 10 -y 21\n (10,21)\n\nAnd booleans, both long and short (and grouped):\n----------------------------------\n\nbool.js:\n\n````javascript\n#!/usr/bin/env node\nvar util = require('util');\nvar argv = require('optimist').argv;\n\nif (argv.s) {\n util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');\n}\nconsole.log(\n (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')\n);\n````\n\n***\n\n $ ./bool.js -s\n The cat says: meow\n \n $ ./bool.js -sp\n The cat says: meow.\n\n $ ./bool.js -sp --fr\n Le chat dit: miaou.\n\nAnd non-hypenated options too! Just use `argv._`!\n-------------------------------------------------\n \nnonopt.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\nconsole.log(argv._);\n````\n\n***\n\n $ ./nonopt.js -x 6.82 -y 3.35 moo\n (6.82,3.35)\n [ 'moo' ]\n \n $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz\n (0.54,1.12)\n [ 'foo', 'bar', 'baz' ]\n\nPlus, Optimist comes with .usage() and .demand()!\n-------------------------------------------------\n\ndivide.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .usage('Usage: $0 -x [num] -y [num]')\n .demand(['x','y'])\n .argv;\n\nconsole.log(argv.x / argv.y);\n````\n\n***\n \n $ ./divide.js -x 55 -y 11\n 5\n \n $ node ./divide.js -x 4.91 -z 2.51\n Usage: node ./divide.js -x [num] -y [num]\n\n Options:\n -x [required]\n -y [required]\n\n Missing required arguments: y\n\nEVEN MORE HOLY COW\n------------------\n\ndefault_singles.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .default('x', 10)\n .default('y', 10)\n .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n $ ./default_singles.js -x 5\n 15\n\ndefault_hash.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .default({ x : 10, y : 10 })\n .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n $ ./default_hash.js -y 7\n 17\n\nAnd if you really want to get all descriptive about it...\n---------------------------------------------------------\n\nboolean_single.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .boolean('v')\n .argv\n;\nconsole.dir(argv);\n````\n\n***\n\n $ ./boolean_single.js -v foo bar baz\n true\n [ 'bar', 'baz', 'foo' ]\n\nboolean_double.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .boolean(['x','y','z'])\n .argv\n;\nconsole.dir([ argv.x, argv.y, argv.z ]);\nconsole.dir(argv._);\n````\n\n***\n\n $ ./boolean_double.js -x -z one two three\n [ true, false, true ]\n [ 'one', 'two', 'three' ]\n\nOptimist is here to help...\n---------------------------\n\nYou can describe parameters for help messages and set aliases. Optimist figures\nout how to format a handy help string automatically.\n\nline_count.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .usage('Count the lines in a file.\\nUsage: $0')\n .demand('f')\n .alias('f', 'file')\n .describe('f', 'Load a file')\n .argv\n;\n\nvar fs = require('fs');\nvar s = fs.createReadStream(argv.file);\n\nvar lines = 0;\ns.on('data', function (buf) {\n lines += buf.toString().match(/\\n/g).length;\n});\n\ns.on('end', function () {\n console.log(lines);\n});\n````\n\n***\n\n $ node line_count.js\n Count the lines in a file.\n Usage: node ./line_count.js\n\n Options:\n -f, --file Load a file [required]\n\n Missing required arguments: f\n\n $ node line_count.js --file line_count.js \n 20\n \n $ node line_count.js -f line_count.js \n 20\n\nmethods\n=======\n\nBy itself,\n\n````javascript\nrequire('optimist').argv\n`````\n\nwill use `process.argv` array to construct the `argv` object.\n\nYou can pass in the `process.argv` yourself:\n\n````javascript\nrequire('optimist')([ '-x', '1', '-y', '2' ]).argv\n````\n\nor use .parse() to do the same thing:\n\n````javascript\nrequire('optimist').parse([ '-x', '1', '-y', '2' ])\n````\n\nThe rest of these methods below come in just before the terminating `.argv`.\n\n.alias(key, alias)\n------------------\n\nSet key names as equivalent such that updates to a key will propagate to aliases\nand vice-versa.\n\nOptionally `.alias()` can take an object that maps keys to aliases.\n\n.default(key, value)\n--------------------\n\nSet `argv[key]` to `value` if no option was specified on `process.argv`.\n\nOptionally `.default()` can take an object that maps keys to default values.\n\n.demand(key)\n------------\n\nIf `key` is a string, show the usage information and exit if `key` wasn't\nspecified in `process.argv`.\n\nIf `key` is a number, demand at least as many non-option arguments, which show\nup in `argv._`.\n\nIf `key` is an Array, demand each element.\n\n.describe(key, desc)\n--------------------\n\nDescribe a `key` for the generated usage information.\n\nOptionally `.describe()` can take an object that maps keys to descriptions.\n\n.options(key, opt)\n------------------\n\nInstead of chaining together `.alias().demand().default()`, you can specify\nkeys in `opt` for each of the chainable methods.\n\nFor example:\n\n````javascript\nvar argv = require('optimist')\n .options('f', {\n alias : 'file',\n default : '/etc/passwd',\n })\n .argv\n;\n````\n\nis the same as\n\n````javascript\nvar argv = require('optimist')\n .alias('f', 'file')\n .default('f', '/etc/passwd')\n .argv\n;\n````\n\nOptionally `.options()` can take an object that maps keys to `opt` parameters.\n\n.usage(message)\n---------------\n\nSet a usage message to show which commands to use. Inside `message`, the string\n`$0` will get interpolated to the current script name or node command for the\npresent script similar to how `$0` works in bash or perl.\n\n.check(fn)\n----------\n\nCheck that certain conditions are met in the provided arguments.\n\nIf `fn` throws or returns `false`, show the thrown error, usage information, and\nexit.\n\n.boolean(key)\n-------------\n\nInterpret `key` as a boolean. If a non-flag option follows `key` in\n`process.argv`, that string won't get set as the value of `key`.\n\nIf `key` never shows up as a flag in `process.arguments`, `argv[key]` will be\n`false`.\n\nIf `key` is an Array, interpret all the elements as booleans.\n\n.string(key)\n------------\n\nTell the parser logic not to interpret `key` as a number or boolean.\nThis can be useful if you need to preserve leading zeros in an input.\n\nIf `key` is an Array, interpret all the elements as strings.\n\n.wrap(columns)\n--------------\n\nFormat usage output to wrap at `columns` many columns.\n\n.help()\n-------\n\nReturn the generated usage string.\n\n.showHelp(fn=console.error)\n---------------------------\n\nPrint the usage data using `fn` for printing.\n\n.parse(args)\n------------\n\nParse `args` instead of `process.argv`. Returns the `argv` object.\n\n.argv\n-----\n\nGet the arguments as a plain old object.\n\nArguments without a corresponding flag show up in the `argv._` array.\n\nThe script name or node command is available at `argv.$0` similarly to how `$0`\nworks in bash or perl.\n\nparsing tricks\n==============\n\nstop parsing\n------------\n\nUse `--` to stop parsing flags and stuff the remainder into `argv._`.\n\n $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4\n { _: [ '-c', '3', '-d', '4' ],\n '$0': 'node ./examples/reflect.js',\n a: 1,\n b: 2 }\n\nnegate fields\n-------------\n\nIf you want to explicity set a field to false instead of just leaving it\nundefined or to override a default you can do `--no-key`.\n\n $ node examples/reflect.js -a --no-b\n { _: [],\n '$0': 'node ./examples/reflect.js',\n a: true,\n b: false }\n\nnumbers\n-------\n\nEvery argument that looks like a number (`!isNaN(Number(arg))`) is converted to\none. This way you can just `net.createConnection(argv.port)` and you can add\nnumbers out of `argv` with `+` without having that mean concatenation,\nwhich is super frustrating.\n\nduplicates\n----------\n\nIf you specify a flag multiple times it will get turned into an array containing\nall the values in order.\n\n $ node examples/reflect.js -x 5 -x 8 -x 0\n { _: [],\n '$0': 'node ./examples/reflect.js',\n x: [ 5, 8, 0 ] }\n\ndot notation\n------------\n\nWhen you use dots (`.`s) in argument names, an implicit object path is assumed.\nThis lets you organize arguments into nested objects.\n\n $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5\n { _: [],\n '$0': 'node ./examples/reflect.js',\n foo: { bar: { baz: 33 }, quux: 5 } }\n\nshort numbers\n-------------\n\nShort numeric `head -n5` style argument work too:\n\n $ node reflect.js -n123 -m456\n { '3': true,\n '6': true,\n _: [],\n '$0': 'node ./reflect.js',\n n: 123,\n m: 456 }\n\ninstallation\n============\n\nWith [npm](http://github.com/isaacs/npm), just do:\n npm install optimist\n \nor clone this project on github:\n\n git clone http://github.com/substack/node-optimist.git\n\nTo run the tests with [expresso](http://github.com/visionmedia/expresso),\njust do:\n \n expresso\n\ninspired By\n===========\n\nThis module is loosely inspired by Perl's\n[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/substack/node-optimist/issues" + }, + "homepage": "https://github.com/substack/node-optimist", + "_id": "optimist@0.6.1", + "_from": "optimist@0.6.x" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/readme.markdown b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/readme.markdown new file mode 100644 index 00000000..b74b4372 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/readme.markdown @@ -0,0 +1,513 @@ +# DEPRECATION NOTICE + +I don't want to maintain this module anymore since I just use +[minimist](https://npmjs.org/package/minimist), the argument parsing engine, +directly instead nowadays. + +See [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed +successor to optimist. + +[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs) + +You should also consider [nomnom](https://github.com/harthur/nomnom). + +optimist +======== + +Optimist is a node.js library for option parsing for people who hate option +parsing. More specifically, this module is for people who like all the --bells +and -whistlz of program usage but think optstrings are a waste of time. + +With optimist, option parsing doesn't have to suck (as much). + +[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist) + +examples +======== + +With Optimist, the options are just a hash! No optstrings attached. +------------------------------------------------------------------- + +xup.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist').argv; + +if (argv.rif - 5 * argv.xup > 7.138) { + console.log('Buy more riffiwobbles'); +} +else { + console.log('Sell the xupptumblers'); +} +```` + +*** + + $ ./xup.js --rif=55 --xup=9.52 + Buy more riffiwobbles + + $ ./xup.js --rif 12 --xup 8.1 + Sell the xupptumblers + +![This one's optimistic.](http://substack.net/images/optimistic.png) + +But wait! There's more! You can do short options: +------------------------------------------------- + +short.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist').argv; +console.log('(%d,%d)', argv.x, argv.y); +```` + +*** + + $ ./short.js -x 10 -y 21 + (10,21) + +And booleans, both long and short (and grouped): +---------------------------------- + +bool.js: + +````javascript +#!/usr/bin/env node +var util = require('util'); +var argv = require('optimist').argv; + +if (argv.s) { + util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: '); +} +console.log( + (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '') +); +```` + +*** + + $ ./bool.js -s + The cat says: meow + + $ ./bool.js -sp + The cat says: meow. + + $ ./bool.js -sp --fr + Le chat dit: miaou. + +And non-hypenated options too! Just use `argv._`! +------------------------------------------------- + +nonopt.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist').argv; +console.log('(%d,%d)', argv.x, argv.y); +console.log(argv._); +```` + +*** + + $ ./nonopt.js -x 6.82 -y 3.35 moo + (6.82,3.35) + [ 'moo' ] + + $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz + (0.54,1.12) + [ 'foo', 'bar', 'baz' ] + +Plus, Optimist comes with .usage() and .demand()! +------------------------------------------------- + +divide.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .usage('Usage: $0 -x [num] -y [num]') + .demand(['x','y']) + .argv; + +console.log(argv.x / argv.y); +```` + +*** + + $ ./divide.js -x 55 -y 11 + 5 + + $ node ./divide.js -x 4.91 -z 2.51 + Usage: node ./divide.js -x [num] -y [num] + + Options: + -x [required] + -y [required] + + Missing required arguments: y + +EVEN MORE HOLY COW +------------------ + +default_singles.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .default('x', 10) + .default('y', 10) + .argv +; +console.log(argv.x + argv.y); +```` + +*** + + $ ./default_singles.js -x 5 + 15 + +default_hash.js: + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .default({ x : 10, y : 10 }) + .argv +; +console.log(argv.x + argv.y); +```` + +*** + + $ ./default_hash.js -y 7 + 17 + +And if you really want to get all descriptive about it... +--------------------------------------------------------- + +boolean_single.js + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .boolean('v') + .argv +; +console.dir(argv); +```` + +*** + + $ ./boolean_single.js -v foo bar baz + true + [ 'bar', 'baz', 'foo' ] + +boolean_double.js + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .boolean(['x','y','z']) + .argv +; +console.dir([ argv.x, argv.y, argv.z ]); +console.dir(argv._); +```` + +*** + + $ ./boolean_double.js -x -z one two three + [ true, false, true ] + [ 'one', 'two', 'three' ] + +Optimist is here to help... +--------------------------- + +You can describe parameters for help messages and set aliases. Optimist figures +out how to format a handy help string automatically. + +line_count.js + +````javascript +#!/usr/bin/env node +var argv = require('optimist') + .usage('Count the lines in a file.\nUsage: $0') + .demand('f') + .alias('f', 'file') + .describe('f', 'Load a file') + .argv +; + +var fs = require('fs'); +var s = fs.createReadStream(argv.file); + +var lines = 0; +s.on('data', function (buf) { + lines += buf.toString().match(/\n/g).length; +}); + +s.on('end', function () { + console.log(lines); +}); +```` + +*** + + $ node line_count.js + Count the lines in a file. + Usage: node ./line_count.js + + Options: + -f, --file Load a file [required] + + Missing required arguments: f + + $ node line_count.js --file line_count.js + 20 + + $ node line_count.js -f line_count.js + 20 + +methods +======= + +By itself, + +````javascript +require('optimist').argv +````` + +will use `process.argv` array to construct the `argv` object. + +You can pass in the `process.argv` yourself: + +````javascript +require('optimist')([ '-x', '1', '-y', '2' ]).argv +```` + +or use .parse() to do the same thing: + +````javascript +require('optimist').parse([ '-x', '1', '-y', '2' ]) +```` + +The rest of these methods below come in just before the terminating `.argv`. + +.alias(key, alias) +------------------ + +Set key names as equivalent such that updates to a key will propagate to aliases +and vice-versa. + +Optionally `.alias()` can take an object that maps keys to aliases. + +.default(key, value) +-------------------- + +Set `argv[key]` to `value` if no option was specified on `process.argv`. + +Optionally `.default()` can take an object that maps keys to default values. + +.demand(key) +------------ + +If `key` is a string, show the usage information and exit if `key` wasn't +specified in `process.argv`. + +If `key` is a number, demand at least as many non-option arguments, which show +up in `argv._`. + +If `key` is an Array, demand each element. + +.describe(key, desc) +-------------------- + +Describe a `key` for the generated usage information. + +Optionally `.describe()` can take an object that maps keys to descriptions. + +.options(key, opt) +------------------ + +Instead of chaining together `.alias().demand().default()`, you can specify +keys in `opt` for each of the chainable methods. + +For example: + +````javascript +var argv = require('optimist') + .options('f', { + alias : 'file', + default : '/etc/passwd', + }) + .argv +; +```` + +is the same as + +````javascript +var argv = require('optimist') + .alias('f', 'file') + .default('f', '/etc/passwd') + .argv +; +```` + +Optionally `.options()` can take an object that maps keys to `opt` parameters. + +.usage(message) +--------------- + +Set a usage message to show which commands to use. Inside `message`, the string +`$0` will get interpolated to the current script name or node command for the +present script similar to how `$0` works in bash or perl. + +.check(fn) +---------- + +Check that certain conditions are met in the provided arguments. + +If `fn` throws or returns `false`, show the thrown error, usage information, and +exit. + +.boolean(key) +------------- + +Interpret `key` as a boolean. If a non-flag option follows `key` in +`process.argv`, that string won't get set as the value of `key`. + +If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be +`false`. + +If `key` is an Array, interpret all the elements as booleans. + +.string(key) +------------ + +Tell the parser logic not to interpret `key` as a number or boolean. +This can be useful if you need to preserve leading zeros in an input. + +If `key` is an Array, interpret all the elements as strings. + +.wrap(columns) +-------------- + +Format usage output to wrap at `columns` many columns. + +.help() +------- + +Return the generated usage string. + +.showHelp(fn=console.error) +--------------------------- + +Print the usage data using `fn` for printing. + +.parse(args) +------------ + +Parse `args` instead of `process.argv`. Returns the `argv` object. + +.argv +----- + +Get the arguments as a plain old object. + +Arguments without a corresponding flag show up in the `argv._` array. + +The script name or node command is available at `argv.$0` similarly to how `$0` +works in bash or perl. + +parsing tricks +============== + +stop parsing +------------ + +Use `--` to stop parsing flags and stuff the remainder into `argv._`. + + $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4 + { _: [ '-c', '3', '-d', '4' ], + '$0': 'node ./examples/reflect.js', + a: 1, + b: 2 } + +negate fields +------------- + +If you want to explicity set a field to false instead of just leaving it +undefined or to override a default you can do `--no-key`. + + $ node examples/reflect.js -a --no-b + { _: [], + '$0': 'node ./examples/reflect.js', + a: true, + b: false } + +numbers +------- + +Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to +one. This way you can just `net.createConnection(argv.port)` and you can add +numbers out of `argv` with `+` without having that mean concatenation, +which is super frustrating. + +duplicates +---------- + +If you specify a flag multiple times it will get turned into an array containing +all the values in order. + + $ node examples/reflect.js -x 5 -x 8 -x 0 + { _: [], + '$0': 'node ./examples/reflect.js', + x: [ 5, 8, 0 ] } + +dot notation +------------ + +When you use dots (`.`s) in argument names, an implicit object path is assumed. +This lets you organize arguments into nested objects. + + $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5 + { _: [], + '$0': 'node ./examples/reflect.js', + foo: { bar: { baz: 33 }, quux: 5 } } + +short numbers +------------- + +Short numeric `head -n5` style argument work too: + + $ node reflect.js -n123 -m456 + { '3': true, + '6': true, + _: [], + '$0': 'node ./reflect.js', + n: 123, + m: 456 } + +installation +============ + +With [npm](http://github.com/isaacs/npm), just do: + npm install optimist + +or clone this project on github: + + git clone http://github.com/substack/node-optimist.git + +To run the tests with [expresso](http://github.com/visionmedia/expresso), +just do: + + expresso + +inspired By +=========== + +This module is loosely inspired by Perl's +[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm). diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_.js new file mode 100644 index 00000000..d9c58b36 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_.js @@ -0,0 +1,71 @@ +var spawn = require('child_process').spawn; +var test = require('tap').test; + +test('dotSlashEmpty', testCmd('./bin.js', [])); + +test('dotSlashArgs', testCmd('./bin.js', [ 'a', 'b', 'c' ])); + +test('nodeEmpty', testCmd('node bin.js', [])); + +test('nodeArgs', testCmd('node bin.js', [ 'x', 'y', 'z' ])); + +test('whichNodeEmpty', function (t) { + var which = spawn('which', ['node']); + + which.stdout.on('data', function (buf) { + t.test( + testCmd(buf.toString().trim() + ' bin.js', []) + ); + t.end(); + }); + + which.stderr.on('data', function (err) { + assert.error(err); + t.end(); + }); +}); + +test('whichNodeArgs', function (t) { + var which = spawn('which', ['node']); + + which.stdout.on('data', function (buf) { + t.test( + testCmd(buf.toString().trim() + ' bin.js', [ 'q', 'r' ]) + ); + t.end(); + }); + + which.stderr.on('data', function (err) { + t.error(err); + t.end(); + }); +}); + +function testCmd (cmd, args) { + + return function (t) { + var to = setTimeout(function () { + assert.fail('Never got stdout data.') + }, 5000); + + var oldDir = process.cwd(); + process.chdir(__dirname + '/_'); + + var cmds = cmd.split(' '); + + var bin = spawn(cmds[0], cmds.slice(1).concat(args.map(String))); + process.chdir(oldDir); + + bin.stderr.on('data', function (err) { + t.error(err); + t.end(); + }); + + bin.stdout.on('data', function (buf) { + clearTimeout(to); + var _ = JSON.parse(buf.toString()); + t.same(_.map(String), args.map(String)); + t.end(); + }); + }; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/argv.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/argv.js new file mode 100644 index 00000000..3d096062 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/argv.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +console.log(JSON.stringify(process.argv)); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/bin.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/bin.js new file mode 100755 index 00000000..4a18d85f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/_/bin.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +var argv = require('../../index').argv +console.log(JSON.stringify(argv._)); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/dash.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/dash.js new file mode 100644 index 00000000..af8ed6fc --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/dash.js @@ -0,0 +1,31 @@ +var optimist = require('../index'); +var test = require('tap').test; + +test('-', function (t) { + t.plan(5); + t.deepEqual( + fix(optimist.parse([ '-n', '-' ])), + { n: '-', _: [] } + ); + t.deepEqual( + fix(optimist.parse([ '-' ])), + { _: [ '-' ] } + ); + t.deepEqual( + fix(optimist.parse([ '-f-' ])), + { f: '-', _: [] } + ); + t.deepEqual( + fix(optimist([ '-b', '-' ]).boolean('b').argv), + { b: true, _: [ '-' ] } + ); + t.deepEqual( + fix(optimist([ '-s', '-' ]).string('s').argv), + { s: '-', _: [] } + ); +}); + +function fix (obj) { + delete obj.$0; + return obj; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse.js new file mode 100644 index 00000000..d320f433 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse.js @@ -0,0 +1,446 @@ +var optimist = require('../index'); +var path = require('path'); +var test = require('tap').test; + +var $0 = 'node ./' + path.relative(process.cwd(), __filename); + +test('short boolean', function (t) { + var parse = optimist.parse([ '-b' ]); + t.same(parse, { b : true, _ : [], $0 : $0 }); + t.same(typeof parse.b, 'boolean'); + t.end(); +}); + +test('long boolean', function (t) { + t.same( + optimist.parse([ '--bool' ]), + { bool : true, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('bare', function (t) { + t.same( + optimist.parse([ 'foo', 'bar', 'baz' ]), + { _ : [ 'foo', 'bar', 'baz' ], $0 : $0 } + ); + t.end(); +}); + +test('short group', function (t) { + t.same( + optimist.parse([ '-cats' ]), + { c : true, a : true, t : true, s : true, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('short group next', function (t) { + t.same( + optimist.parse([ '-cats', 'meow' ]), + { c : true, a : true, t : true, s : 'meow', _ : [], $0 : $0 } + ); + t.end(); +}); + +test('short capture', function (t) { + t.same( + optimist.parse([ '-h', 'localhost' ]), + { h : 'localhost', _ : [], $0 : $0 } + ); + t.end(); +}); + +test('short captures', function (t) { + t.same( + optimist.parse([ '-h', 'localhost', '-p', '555' ]), + { h : 'localhost', p : 555, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('long capture sp', function (t) { + t.same( + optimist.parse([ '--pow', 'xixxle' ]), + { pow : 'xixxle', _ : [], $0 : $0 } + ); + t.end(); +}); + +test('long capture eq', function (t) { + t.same( + optimist.parse([ '--pow=xixxle' ]), + { pow : 'xixxle', _ : [], $0 : $0 } + ); + t.end() +}); + +test('long captures sp', function (t) { + t.same( + optimist.parse([ '--host', 'localhost', '--port', '555' ]), + { host : 'localhost', port : 555, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('long captures eq', function (t) { + t.same( + optimist.parse([ '--host=localhost', '--port=555' ]), + { host : 'localhost', port : 555, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('mixed short bool and capture', function (t) { + t.same( + optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ], $0 : $0, + } + ); + t.end(); +}); + +test('short and long', function (t) { + t.same( + optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ], $0 : $0, + } + ); + t.end(); +}); + +test('no', function (t) { + t.same( + optimist.parse([ '--no-moo' ]), + { moo : false, _ : [], $0 : $0 } + ); + t.end(); +}); + +test('multi', function (t) { + t.same( + optimist.parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), + { v : ['a','b','c'], _ : [], $0 : $0 } + ); + t.end(); +}); + +test('comprehensive', function (t) { + t.same( + optimist.parse([ + '--name=meowmers', 'bare', '-cats', 'woo', + '-h', 'awesome', '--multi=quux', + '--key', 'value', + '-b', '--bool', '--no-meep', '--multi=baz', + '--', '--not-a-flag', 'eek' + ]), + { + c : true, + a : true, + t : true, + s : 'woo', + h : 'awesome', + b : true, + bool : true, + key : 'value', + multi : [ 'quux', 'baz' ], + meep : false, + name : 'meowmers', + _ : [ 'bare', '--not-a-flag', 'eek' ], + $0 : $0 + } + ); + t.end(); +}); + +test('nums', function (t) { + var argv = optimist.parse([ + '-x', '1234', + '-y', '5.67', + '-z', '1e7', + '-w', '10f', + '--hex', '0xdeadbeef', + '789', + ]); + t.same(argv, { + x : 1234, + y : 5.67, + z : 1e7, + w : '10f', + hex : 0xdeadbeef, + _ : [ 789 ], + $0 : $0 + }); + t.same(typeof argv.x, 'number'); + t.same(typeof argv.y, 'number'); + t.same(typeof argv.z, 'number'); + t.same(typeof argv.w, 'string'); + t.same(typeof argv.hex, 'number'); + t.same(typeof argv._[0], 'number'); + t.end(); +}); + +test('flag boolean', function (t) { + var parse = optimist([ '-t', 'moo' ]).boolean(['t']).argv; + t.same(parse, { t : true, _ : [ 'moo' ], $0 : $0 }); + t.same(typeof parse.t, 'boolean'); + t.end(); +}); + +test('flag boolean value', function (t) { + var parse = optimist(['--verbose', 'false', 'moo', '-t', 'true']) + .boolean(['t', 'verbose']).default('verbose', true).argv; + + t.same(parse, { + verbose: false, + t: true, + _: ['moo'], + $0 : $0 + }); + + t.same(typeof parse.verbose, 'boolean'); + t.same(typeof parse.t, 'boolean'); + t.end(); +}); + +test('flag boolean default false', function (t) { + var parse = optimist(['moo']) + .boolean(['t', 'verbose']) + .default('verbose', false) + .default('t', false).argv; + + t.same(parse, { + verbose: false, + t: false, + _: ['moo'], + $0 : $0 + }); + + t.same(typeof parse.verbose, 'boolean'); + t.same(typeof parse.t, 'boolean'); + t.end(); + +}); + +test('boolean groups', function (t) { + var parse = optimist([ '-x', '-z', 'one', 'two', 'three' ]) + .boolean(['x','y','z']).argv; + + t.same(parse, { + x : true, + y : false, + z : true, + _ : [ 'one', 'two', 'three' ], + $0 : $0 + }); + + t.same(typeof parse.x, 'boolean'); + t.same(typeof parse.y, 'boolean'); + t.same(typeof parse.z, 'boolean'); + t.end(); +}); + +test('newlines in params' , function (t) { + var args = optimist.parse([ '-s', "X\nX" ]) + t.same(args, { _ : [], s : "X\nX", $0 : $0 }); + + // reproduce in bash: + // VALUE="new + // line" + // node program.js --s="$VALUE" + args = optimist.parse([ "--s=X\nX" ]) + t.same(args, { _ : [], s : "X\nX", $0 : $0 }); + t.end(); +}); + +test('strings' , function (t) { + var s = optimist([ '-s', '0001234' ]).string('s').argv.s; + t.same(s, '0001234'); + t.same(typeof s, 'string'); + + var x = optimist([ '-x', '56' ]).string('x').argv.x; + t.same(x, '56'); + t.same(typeof x, 'string'); + t.end(); +}); + +test('stringArgs', function (t) { + var s = optimist([ ' ', ' ' ]).string('_').argv._; + t.same(s.length, 2); + t.same(typeof s[0], 'string'); + t.same(s[0], ' '); + t.same(typeof s[1], 'string'); + t.same(s[1], ' '); + t.end(); +}); + +test('slashBreak', function (t) { + t.same( + optimist.parse([ '-I/foo/bar/baz' ]), + { I : '/foo/bar/baz', _ : [], $0 : $0 } + ); + t.same( + optimist.parse([ '-xyz/foo/bar/baz' ]), + { x : true, y : true, z : '/foo/bar/baz', _ : [], $0 : $0 } + ); + t.end(); +}); + +test('alias', function (t) { + var argv = optimist([ '-f', '11', '--zoom', '55' ]) + .alias('z', 'zoom') + .argv + ; + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.f, 11); + t.end(); +}); + +test('multiAlias', function (t) { + var argv = optimist([ '-f', '11', '--zoom', '55' ]) + .alias('z', [ 'zm', 'zoom' ]) + .argv + ; + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.z, argv.zm); + t.equal(argv.f, 11); + t.end(); +}); + +test('boolean default true', function (t) { + var argv = optimist.options({ + sometrue: { + boolean: true, + default: true + } + }).argv; + + t.equal(argv.sometrue, true); + t.end(); +}); + +test('boolean default false', function (t) { + var argv = optimist.options({ + somefalse: { + boolean: true, + default: false + } + }).argv; + + t.equal(argv.somefalse, false); + t.end(); +}); + +test('nested dotted objects', function (t) { + var argv = optimist([ + '--foo.bar', '3', '--foo.baz', '4', + '--foo.quux.quibble', '5', '--foo.quux.o_O', + '--beep.boop' + ]).argv; + + t.same(argv.foo, { + bar : 3, + baz : 4, + quux : { + quibble : 5, + o_O : true + }, + }); + t.same(argv.beep, { boop : true }); + t.end(); +}); + +test('boolean and alias with chainable api', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = optimist(aliased) + .boolean('herp') + .alias('h', 'herp') + .argv; + var propertyArgv = optimist(regular) + .boolean('herp') + .alias('h', 'herp') + .argv; + var expected = { + herp: true, + h: true, + '_': [ 'derp' ], + '$0': $0, + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias with options hash', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = optimist(aliased) + .options(opts) + .argv; + var propertyArgv = optimist(regular).options(opts).argv; + var expected = { + herp: true, + h: true, + '_': [ 'derp' ], + '$0': $0, + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + + t.end(); +}); + +test('boolean and alias using explicit true', function (t) { + var aliased = [ '-h', 'true' ]; + var regular = [ '--herp', 'true' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = optimist(aliased) + .boolean('h') + .alias('h', 'herp') + .argv; + var propertyArgv = optimist(regular) + .boolean('h') + .alias('h', 'herp') + .argv; + var expected = { + herp: true, + h: true, + '_': [ ], + '$0': $0, + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +// regression, see https://github.com/substack/node-optimist/issues/71 +test('boolean and --x=true', function(t) { + var parsed = optimist(['--boool', '--other=true']).boolean('boool').argv; + + t.same(parsed.boool, true); + t.same(parsed.other, 'true'); + + parsed = optimist(['--boool', '--other=false']).boolean('boool').argv; + + t.same(parsed.boool, true); + t.same(parsed.other, 'false'); + t.end(); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse_modified.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse_modified.js new file mode 100644 index 00000000..a57dc84e --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/parse_modified.js @@ -0,0 +1,14 @@ +var optimist = require('../'); +var test = require('tap').test; + +test('parse with modifier functions' , function (t) { + t.plan(1); + + var argv = optimist().boolean('b').parse([ '-b', '123' ]); + t.deepEqual(fix(argv), { b: true, _: ['123'] }); +}); + +function fix (obj) { + delete obj.$0; + return obj; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/short.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/short.js new file mode 100644 index 00000000..b2c38ad8 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/short.js @@ -0,0 +1,16 @@ +var optimist = require('../index'); +var test = require('tap').test; + +test('-n123', function (t) { + t.plan(1); + var parse = optimist.parse([ '-n123' ]); + t.equal(parse.n, 123); +}); + +test('-123', function (t) { + t.plan(3); + var parse = optimist.parse([ '-123', '456' ]); + t.equal(parse['1'], true); + t.equal(parse['2'], true); + t.equal(parse['3'], 456); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/usage.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/usage.js new file mode 100644 index 00000000..300454c1 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/usage.js @@ -0,0 +1,292 @@ +var Hash = require('hashish'); +var optimist = require('../index'); +var test = require('tap').test; + +test('usageFail', function (t) { + var r = checkUsage(function () { + return optimist('-x 10 -z 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .demand(['x','y']) + .argv; + }); + t.same( + r.result, + { x : 10, z : 20, _ : [], $0 : './usage' } + ); + + t.same( + r.errors.join('\n').split(/\n+/), + [ + 'Usage: ./usage -x NUM -y NUM', + 'Options:', + ' -x [required]', + ' -y [required]', + 'Missing required arguments: y', + ] + ); + t.same(r.logs, []); + t.ok(r.exit); + t.end(); +}); + + +test('usagePass', function (t) { + var r = checkUsage(function () { + return optimist('-x 10 -y 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .demand(['x','y']) + .argv; + }); + t.same(r, { + result : { x : 10, y : 20, _ : [], $0 : './usage' }, + errors : [], + logs : [], + exit : false, + }); + t.end(); +}); + +test('checkPass', function (t) { + var r = checkUsage(function () { + return optimist('-x 10 -y 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .check(function (argv) { + if (!('x' in argv)) throw 'You forgot about -x'; + if (!('y' in argv)) throw 'You forgot about -y'; + }) + .argv; + }); + t.same(r, { + result : { x : 10, y : 20, _ : [], $0 : './usage' }, + errors : [], + logs : [], + exit : false, + }); + t.end(); +}); + +test('checkFail', function (t) { + var r = checkUsage(function () { + return optimist('-x 10 -z 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .check(function (argv) { + if (!('x' in argv)) throw 'You forgot about -x'; + if (!('y' in argv)) throw 'You forgot about -y'; + }) + .argv; + }); + + t.same( + r.result, + { x : 10, z : 20, _ : [], $0 : './usage' } + ); + + t.same( + r.errors.join('\n').split(/\n+/), + [ + 'Usage: ./usage -x NUM -y NUM', + 'You forgot about -y' + ] + ); + + t.same(r.logs, []); + t.ok(r.exit); + t.end(); +}); + +test('checkCondPass', function (t) { + function checker (argv) { + return 'x' in argv && 'y' in argv; + } + + var r = checkUsage(function () { + return optimist('-x 10 -y 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .check(checker) + .argv; + }); + t.same(r, { + result : { x : 10, y : 20, _ : [], $0 : './usage' }, + errors : [], + logs : [], + exit : false, + }); + t.end(); +}); + +test('checkCondFail', function (t) { + function checker (argv) { + return 'x' in argv && 'y' in argv; + } + + var r = checkUsage(function () { + return optimist('-x 10 -z 20'.split(' ')) + .usage('Usage: $0 -x NUM -y NUM') + .check(checker) + .argv; + }); + + t.same( + r.result, + { x : 10, z : 20, _ : [], $0 : './usage' } + ); + + t.same( + r.errors.join('\n').split(/\n+/).join('\n'), + 'Usage: ./usage -x NUM -y NUM\n' + + 'Argument check failed: ' + checker.toString() + ); + + t.same(r.logs, []); + t.ok(r.exit); + t.end(); +}); + +test('countPass', function (t) { + var r = checkUsage(function () { + return optimist('1 2 3 --moo'.split(' ')) + .usage('Usage: $0 [x] [y] [z] {OPTIONS}') + .demand(3) + .argv; + }); + t.same(r, { + result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' }, + errors : [], + logs : [], + exit : false, + }); + t.end(); +}); + +test('countFail', function (t) { + var r = checkUsage(function () { + return optimist('1 2 --moo'.split(' ')) + .usage('Usage: $0 [x] [y] [z] {OPTIONS}') + .demand(3) + .argv; + }); + t.same( + r.result, + { _ : [ '1', '2' ], moo : true, $0 : './usage' } + ); + + t.same( + r.errors.join('\n').split(/\n+/), + [ + 'Usage: ./usage [x] [y] [z] {OPTIONS}', + 'Not enough non-option arguments: got 2, need at least 3', + ] + ); + + t.same(r.logs, []); + t.ok(r.exit); + t.end(); +}); + +test('defaultSingles', function (t) { + var r = checkUsage(function () { + return optimist('--foo 50 --baz 70 --powsy'.split(' ')) + .default('foo', 5) + .default('bar', 6) + .default('baz', 7) + .argv + ; + }); + t.same(r.result, { + foo : '50', + bar : 6, + baz : '70', + powsy : true, + _ : [], + $0 : './usage', + }); + t.end(); +}); + +test('defaultAliases', function (t) { + var r = checkUsage(function () { + return optimist('') + .alias('f', 'foo') + .default('f', 5) + .argv + ; + }); + t.same(r.result, { + f : '5', + foo : '5', + _ : [], + $0 : './usage', + }); + t.end(); +}); + +test('defaultHash', function (t) { + var r = checkUsage(function () { + return optimist('--foo 50 --baz 70'.split(' ')) + .default({ foo : 10, bar : 20, quux : 30 }) + .argv + ; + }); + t.same(r.result, { + _ : [], + $0 : './usage', + foo : 50, + baz : 70, + bar : 20, + quux : 30, + }); + t.end(); +}); + +test('rebase', function (t) { + t.equal( + optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'), + './foo/bar/baz' + ); + t.equal( + optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'), + '../../..' + ); + t.equal( + optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'), + '../pow/zoom.txt' + ); + t.end(); +}); + +function checkUsage (f) { + + var exit = false; + + process._exit = process.exit; + process._env = process.env; + process._argv = process.argv; + + process.exit = function (t) { exit = true }; + process.env = Hash.merge(process.env, { _ : 'node' }); + process.argv = [ './usage' ]; + + var errors = []; + var logs = []; + + console._error = console.error; + console.error = function (msg) { errors.push(msg) }; + console._log = console.log; + console.log = function (msg) { logs.push(msg) }; + + var result = f(); + + process.exit = process._exit; + process.env = process._env; + process.argv = process._argv; + + console.error = console._error; + console.log = console._log; + + return { + errors : errors, + logs : logs, + exit : exit, + result : result, + }; +}; diff --git a/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/whitespace.js b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/whitespace.js new file mode 100644 index 00000000..90b90752 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/node_modules/optimist/test/whitespace.js @@ -0,0 +1,8 @@ +var optimist = require('../'); +var test = require('tap').test; + +test('whitespace should be whitespace' , function (t) { + t.plan(1); + var x = optimist.parse([ '-x', '\t' ]).x; + t.equal(x, '\t'); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/package.json b/node_modules/gulp-sass/node_modules/node-sass/package.json new file mode 100644 index 00000000..05244d93 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/package.json @@ -0,0 +1,58 @@ +{ + "author": { + "name": "Andrew Nesbitt", + "email": "andrewnez@gmail.com", + "url": "http://andrew.github.com" + }, + "name": "node-sass", + "description": "wrapper around libsass", + "version": "0.8.1", + "homepage": "https://github.com/andrew/node-sass", + "keywords": [ + "sass", + "css", + "libsass" + ], + "bugs": { + "url": "https://github.com/andrew/node-sass/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/andrew/node-sass/blob/master/LICENSE" + } + ], + "main": "./sass.js", + "repository": { + "type": "git", + "url": "git://github.com/andrew/node-sass.git" + }, + "scripts": { + "install": "node build.js", + "test": "mocha test", + "pretest": "jshint .", + "prepublish": "bash scripts/prepublish.sh" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "gypfile": true, + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "mkdirp": "0.3.x", + "optimist": "0.6.x", + "node-watch": "0.3.x", + "mocha": "1.13.x", + "chalk": "~0.3.0", + "nan": "~0.6.0" + }, + "devDependencies": { + "jshint": "~2.4.0" + }, + "readme": "##node-sass\n\n[![Build Status](https://secure.travis-ci.org/andrew/node-sass.png?branch=master)](https://travis-ci.org/andrew/node-sass)\n\nNode-sass is a library that provides binding for Node.js to [libsass](https://github.com/hcatlin/libsass), the C version of the popular stylesheet preprocessor, Sass.\n\nIt allows you to natively compile .scss files to css at incredible speed and automatically via a connect middleware.\n\nFind it on npm: \n\n## Install\n\n npm install node-sass\n\n## Usage\n\n```javascript\nvar sass = require('node-sass');\nsass.render({\n\tfile: scss_filename,\n\tsuccess: callback\n\t[, options..]\n\t});\n// OR\nvar css = sass.renderSync({\n\tdata: scss_content\n\t[, options..]\n});\n```\n\n### Options\n\nThe API for using node-sass has changed, so that now there is only one variable - an options hash. Some of these options are optional, and in some circumstances some are mandatory.\n\n#### file\n`file` is a `String` of the path to an `scss` file for libsass to render. One of this or `data` options are required, for both render and renderSync.\n\n#### data\n`data` is a `String` containing the scss to be rendered by libsass. One of this or `file` options are required, for both render and renderSync. It is recommended that you use the `includePaths` option in conjunction with this, as otherwise libsass may have trouble finding files imported via the `@import` directive.\n\n#### success\n`success` is a `Function` to be called upon successful rendering of the scss to css. This option is required but only for the render function. If provided to renderSync it will be ignored.\n\n#### error\n`error` is a `Function` to be called upon occurance of an error when rendering the scss to css. This option is optional, and only applies to the render function. If provided to renderSync it will be ignored.\n\n#### includePaths\n`includePaths` is an `Array` of path `String`s to look for any `@import`ed files. It is recommended that you use this option if you are using the `data` option and have **any** `@import` directives, as otherwise libsass may not find your depended-on files.\n\n#### outputStyle\n`outputStyle` is a `String` to determine how the final CSS should be rendered. Its value should be one of `'nested', 'expanded', 'compact', 'compressed'`.\n[Important: currently the argument `outputStyle` has some problem which may cause the output css becomes nothing because of the libsass, so you should not use it now!]\n\n#### sourceComments\n`sourceComments` is a `String` to determine what debug information is included in the output file. Its value should be one of `'none', 'normal', 'map'`. The default is `'none'`.\nThe `map` option will create the source map file in your CSS destination.\n[Important: `souceComments` is only supported when using the `file` option, and does nothing when using `data` flag.]\n\n#### sourceMap\nIf your `sourceComments` option is set to `map`, `sourceMap` allows setting a new path context for the referenced Sass files. \nThe source map describes a path from your CSS file location, into the the folder where the Sass files are located. In most occasions this will work out-of-the-box but, in some cases, you may need to set a different output. \n\n### Examples\n\n```javascript\nvar sass = require('node-sass');\nsass.render({\n\tdata: 'body{background:blue; a{color:black;}}',\n\tsuccess: function(css){\n \t\tconsole.log(css)\n\t},\n\terror: function(error) {\n\t\tconsole.log(error);\n\t},\n\tincludePaths: [ 'lib/', 'mod/' ],\n\toutputStyle: 'compressed'\n});\n// OR\nconsole.log(sass.renderSync({\n\tdata: 'body{background:blue; a{color:black;}}'),\n\toutputStyle: 'compressed'\n});\n```\n\n### Edge-case behaviours\n\n* In the case that both `file` and `data` options are set, node-sass will only attempt to honour the `file` directive.\n\n## Connect/Express middleware\n\nRecompile `.scss` files automatically for connect and express based http servers\n\n```javascript\nvar server = connect.createServer(\n sass.middleware({\n src: __dirname\n , dest: __dirname + '/public'\n , debug: true\n , outputStyle: 'compressed'\n , prefix: '/prefix'\n }),\n connect.static('/prefix', __dirname + '/public')\n);\n```\n\nHeavily inspired by \n\n## DocPad Plugin\n\n[@jking90](https://github.com/jking90) wrote a [DocPad](http://docpad.org/) plugin that compiles `.scss` files using node-sass: \n\n## Grunt extension\n\n[@sindresorhus](https://github.com/sindresorhus/) has created a set of grunt tasks based on node-sass: \n\n## Gulp extension\n\n[@dlmanning](https://github.com/dlmanning/) has created a gulp sass plugin based on node-sass: \n\n## Harp\n\n[@sintaxi](https://github.com/sintaxi)’s Harp web server implicitly compiles `.scss` files using node-sass: \n\n## Example App\n\nThere is also an example connect app here: \n\n## Rebuilding binaries\n\nNode-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:\n\nCheck out the project:\n\n git clone https://github.com/andrew/node-sass.git\n cd node-sass\n git submodule init\n git submodule update\n npm install\n npm install -g node-gyp\n node-gyp rebuild\n\nReplace the prebuild binary with your newly generated one\n\n cp build/Release/binding.node precompiled/*your-platform*/binding.node\n\n## Command Line Interface\n\nThe interface for command-line usage is fairly simplistic at this stage, as seen in the following usage section.\n\nOutput will be saved with the same name as input SASS file into the current working directory if it's omitted.\n\n### Usage\n `node-sass [options] []`\n\n **Options:**\n \n --output-style CSS output style (nested|expanded|compact|compressed) [default: \"nested\"]\n --source-comments Include debug info in output (none|normal|map) [default: \"none\"]\n --include-path Path to look for @import-ed files [default: cwd]\n --help, -h Print usage info\n\n## Post-install Build\n\nInstall runs a series of Mocha tests to see if your machine can use the pre-built `libsass` which will save some time during install. If any tests fail it will build from source.\n\nIf you know the pre-built version will work and do not want to wait for the tests to run you can skip the tests by setting the environment variable `SKIP_NODE_SASS_TESTS` to true.\n\n SKIP_NODE_SASS_TESTS=true npm install\n\n## Contributors\nSpecial thanks to the following people for submitting patches:\n\nDean Mao\nBrett Wilkins\nlitek\ngonghao\nDylan Greene\n\n### Note on Patches/Pull Requests\n\n * Fork the project.\n * Make your feature addition or bug fix.\n * Add documentation if necessary.\n * Add tests for it. This is important so I don't break it in a future version unintentionally.\n * Send a pull request. Bonus points for topic branches.\n\n## Copyright\n\nCopyright (c) 2013 Andrew Nesbitt. See [LICENSE](https://github.com/andrew/node-sass/blob/master/LICENSE) for details.\n", + "readmeFilename": "README.md", + "_id": "node-sass@0.8.1", + "_from": "node-sass@~0.8.1" +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/sass.js b/node_modules/gulp-sass/node_modules/node-sass/sass.js new file mode 100644 index 00000000..0eb00fab --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/sass.js @@ -0,0 +1,101 @@ +var binding; +var fs = require('fs'); +var path = require('path'); + +var v8 = 'v8-' + /[0-9]+\.[0-9]+/.exec(process.versions.v8)[0]; +var modPath = path.join(__dirname, 'bin', process.platform + '-' + process.arch + '-' + v8, 'binding'); +try { + if (fs.realpathSync(__dirname + '/build')) { + // use the build version if it exists + binding = require(__dirname + '/build/Release/binding'); + } +} catch (e) { + try { + fs.realpathSync(modPath + '.node'); + binding = require(modPath); + } catch (ex) { + // No binary! + throw new Error('`'+ modPath + '.node` is missing. Try reinstalling `node-sass`?'); + } +} + +var SASS_OUTPUT_STYLE = { + nested: 0, + expanded: 1, + compact: 2, + compressed: 3 + }; + +var SASS_SOURCE_COMMENTS = { + none: 0, + // This is called default in libsass, but is a reserved keyword here + normal: 1, + map: 2 + }; + +var prepareOptions = function(options) { + var paths, style, comments; + options = typeof options !== 'object' ? {} : options; + paths = options.include_paths || options.includePaths || []; + style = SASS_OUTPUT_STYLE[options.output_style || options.outputStyle] || 0; + comments = SASS_SOURCE_COMMENTS[options.source_comments || options.sourceComments] || 0; + + return { + paths: paths, + style: style, + comments: comments + }; +}; + +var deprecatedRender = function(css, callback, options) { + options = prepareOptions(options); + var errCallback = function(err) { + callback(err); + }; + var oldCallback = function(css) { + callback(null, css); + }; + return binding.render(css, oldCallback, errCallback, options.paths.join(':'), options.style, options.comments); +}; + +var deprecatedRenderSync = function(css, options) { + options = prepareOptions(options); + return binding.renderSync(css, options.paths.join(':'), options.style, options.comments); +}; + +exports.render = function(options) { + var newOptions; + + if (typeof arguments[0] === 'string') { + return deprecatedRender.apply(this, arguments); + } + + newOptions = prepareOptions(options); + options.error = options.error || function(){}; + + if (options.file !== undefined && options.file !== null) { + return binding.renderFile(options.file, options.success, options.error, newOptions.paths.join(path.delimiter), newOptions.style, newOptions.comments, options.sourceMap); + } + + //Assume data is present if file is not. binding/libsass will tell the user otherwise! + return binding.render(options.data, options.success, options.error, newOptions.paths.join(path.delimiter), newOptions.style); +}; + +exports.renderSync = function(options) { + var newOptions; + + if (typeof arguments[0] === 'string') { + return deprecatedRenderSync.apply(this, arguments); + } + + newOptions = prepareOptions(options); + + if (options.file !== undefined && options.file !== null) { + return binding.renderFileSync(options.file, newOptions.paths.join(path.delimiter), newOptions.style, newOptions.comments); + } + + //Assume data is present if file is not. binding/libsass will tell the user otherwise! + return binding.renderSync(options.data, newOptions.paths.join(path.delimiter), newOptions.style); +}; + +exports.middleware = require('./lib/middleware'); diff --git a/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.cpp b/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.cpp new file mode 100644 index 00000000..71f8bd4f --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.cpp @@ -0,0 +1,22 @@ +#include "sass_context_wrapper.h" +#include + +extern "C" { + using namespace std; + + sass_context_wrapper* sass_new_context_wrapper() + { + return (sass_context_wrapper*) calloc(1, sizeof(sass_context_wrapper)); + } + + void sass_free_context_wrapper(sass_context_wrapper* ctx_w) + { + if (ctx_w->ctx) sass_free_context(ctx_w->ctx); + if (ctx_w->fctx) sass_free_file_context(ctx_w->fctx); + + delete ctx_w->callback; + delete ctx_w->errorCallback; + + free(ctx_w); + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.h b/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.h new file mode 100644 index 00000000..2992415c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/sass_context_wrapper.h @@ -0,0 +1,21 @@ +#include "libsass/sass_interface.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct sass_context_wrapper { + sass_context* ctx; + sass_file_context* fctx; + uv_work_t request; + NanCallback* callback; + NanCallback* errorCallback; +}; + +struct sass_context_wrapper* sass_new_context_wrapper(void); +void sass_free_context_wrapper(struct sass_context_wrapper* ctx); + +#ifdef __cplusplus +} +#endif diff --git a/node_modules/gulp-sass/node_modules/node-sass/scripts/prepublish.sh b/node_modules/gulp-sass/node_modules/node-sass/scripts/prepublish.sh new file mode 100755 index 00000000..887d129d --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/scripts/prepublish.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DIRECTORY="../node-sass-binaries" + +if [ "$CI" == "true" ]; then + echo "Skipping prepublish on CI builds"; +elif [ -d "$DIRECTORY" ]; then + echo "Copying binaries to bin" + cp -R $DIRECTORY/*-v8-* bin/ +else + echo "Skipping bin copy. Please clone https://github.com/andrew/node-sass-binaries for prebuilt binaries"; +fi \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/cli.js b/node_modules/gulp-sass/node_modules/node-sass/test/cli.js new file mode 100644 index 00000000..98ed3305 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/cli.js @@ -0,0 +1,159 @@ +var path = require('path'), + assert = require('assert'), + fs = require('fs'), + exec = require('child_process').exec, + cli = require('../lib/cli'), + + cliPath = path.resolve(__dirname, '../bin/node-sass'), + sampleFilename = path.resolve(__dirname, 'sample.scss'); + +var expectedSampleCompressed = '#navbar {width:80%;height:23px;}\ +#navbar ul {list-style-type:none;}\ +#navbar li {float:left;}\ +#navbar li a {font-weight:bold;}'; + +var expectedSampleNoComments = '#navbar {\n\ + width: 80%;\n\ + height: 23px; }\n\ +\n\ +#navbar ul {\n\ + list-style-type: none; }\n\ +\n\ +#navbar li {\n\ + float: left; }\n\ + #navbar li a {\n\ + font-weight: bold; }\n'; + +describe('cli', function() { + it('should print help when run with no arguments', function(done) { + exec('node ' + cliPath, function(err, stdout, stderr) { + done(assert(stderr.indexOf('Compile .scss files with node-sass') === 0)); + }); + }); + + it('should compile sample.scss as sample.css', function(done) { + var resultPath = path.join(__dirname, 'sample.css'); + + exec('node ' + cliPath + ' ' + sampleFilename, { + cwd: __dirname + }, function() { + + fs.exists(resultPath, function(exists) { + assert(exists); + fs.unlink(resultPath, done); + }); + }); + }); + + it('should compile sample.scss to ../out.css', function(done) { + var resultPath = path.resolve(__dirname, '../out.css'); + + exec('node ' + cliPath + ' ' + sampleFilename + ' ../out.css', { + cwd: __dirname + }, function() { + + fs.exists(resultPath, function(exists) { + assert(exists); + fs.unlink(resultPath, done); + }); + }); + }); + + it('should compile with --include-path option', function(done){ + var emitter = cli([ + '--include-path', path.join(__dirname, 'lib'), + '--include-path', path.join(__dirname, 'functions'), + path.join(__dirname, 'include_path.scss') + ]); + emitter.on('error', done); + emitter.on('write', function(err, file, css){ + assert.equal(css.trim(), 'body {\n background: red;\n color: #0000fe; }'); + fs.unlink(file, done); + }); + }); + + it('should compile with the --output-style', function(done){ + var emitter = cli(['--output-style', 'compressed', path.join(__dirname, 'sample.scss')]); + emitter.on('error', done); + emitter.on('write', function(err, file, css){ + assert.equal(css, expectedSampleCompressed); + fs.unlink(file, done); + }); + }); + + it('should compile with the --source-comments option', function(done){ + var emitter = cli(['--source-comments', 'none', path.join(__dirname, 'sample.scss')]); + emitter.on('error', done); + emitter.on('write', function(err, file, css){ + assert.equal(css, expectedSampleNoComments); + fs.unlink(file, done); + }); + }); + + it('should write the output to the file specified with the --output option', function(done){ + var resultPath = path.join(__dirname, '../output.css'); + var emitter = cli(['--output', resultPath, path.join(__dirname, 'sample.scss')]); + emitter.on('error', done); + emitter.on('write', function(){ + fs.exists(resultPath, function(exists) { + assert(exists); + fs.unlink(resultPath, done); + }); + }); + }); + + it('should compile with the --source-map option', function(done){ + var emitter = cli([path.join(__dirname, 'sample.scss'), '--source-map']); + emitter.on('error', done); + emitter.on('write-source-map', function(err, file) { + assert.equal(file, path.join(__dirname, '../sample.css.map')); + fs.exists(file, function(exists) { + assert(exists); + }); + }); + emitter.on('done', function() { + fs.unlink(path.join(__dirname, '../sample.css.map'), function() { + fs.unlink(path.join(__dirname, '../sample.css'), function() { + done(); + }); + }); + }); + }); + + it('should compile with the --source-map option with specific filename', function(done){ + var emitter = cli([path.join(__dirname, 'sample.scss'), '--source-map', path.join(__dirname, '../sample.map')]); + emitter.on('error', done); + emitter.on('write-source-map', function(err, file) { + assert.equal(file, path.join(__dirname, '../sample.map')); + fs.exists(file, function(exists) { + assert(exists); + }); + }); + emitter.on('done', function() { + fs.unlink(path.join(__dirname, '../sample.map'), function() { + fs.unlink(path.join(__dirname, '../sample.css'), function() { + done(); + }); + }); + }); + }); + + it('should compile a sourceMap if --source-comments="map", but the --source-map option is excluded', function(done){ + var emitter = cli([path.join(__dirname, 'sample.scss'), '--source-comments', 'map']); + emitter.on('error', done); + emitter.on('write-source-map', function(err, file) { + assert.equal(file, path.join(__dirname, '../sample.css.map')); + fs.exists(file, function(exists) { + assert(exists); + }); + }); + emitter.on('done', function() { + fs.unlink(path.join(__dirname, '../sample.css.map'), function() { + fs.unlink(path.join(__dirname, '../sample.css'), function() { + done(); + }); + }); + }); + }); + +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/functions/colorBlue.scss b/node_modules/gulp-sass/node_modules/node-sass/test/functions/colorBlue.scss new file mode 100644 index 00000000..4fa618cb --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/functions/colorBlue.scss @@ -0,0 +1,3 @@ +@function colorBlue() { + @return #0000fe; +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/include_path.scss b/node_modules/gulp-sass/node_modules/node-sass/test/include_path.scss new file mode 100644 index 00000000..8ee2b7fe --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/include_path.scss @@ -0,0 +1,4 @@ +@import "vars"; +@import "colorBlue"; + +body { background: $color; color: colorBlue(); } diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/large_test.scss b/node_modules/gulp-sass/node_modules/node-sass/test/large_test.scss new file mode 100644 index 00000000..662ae857 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/large_test.scss @@ -0,0 +1,11869 @@ +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/lib/vars.scss b/node_modules/gulp-sass/node_modules/node-sass/test/lib/vars.scss new file mode 100644 index 00000000..a625dd9c --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/lib/vars.scss @@ -0,0 +1 @@ +$color: red; \ No newline at end of file diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_render.js b/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_render.js new file mode 100644 index 00000000..477cc249 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_render.js @@ -0,0 +1,19 @@ +// var util = require('util'); +// var sass = require('../sass'); +// var fs = require('fs'); +// +// var bigScssStr = fs.readFileSync(require('path').resolve(__dirname,'large_test.scss')); +// var numTestCases = 1000; +// var numCompiled = 0; +// console.log(util.inspect(process.memoryUsage())); +// for (var i = 0; i < numTestCases; i++) { +// sass.render({ +// data: bigScssStr, +// success: function() { +// numCompiled++; +// if (numCompiled === numTestCases) { +// console.log(util.inspect(process.memoryUsage())); +// } +// } +// }); +// } diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_renderSync.js b/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_renderSync.js new file mode 100644 index 00000000..16115b77 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/mem_test_renderSync.js @@ -0,0 +1,12 @@ +// var util = require('util'); +// var sass = require('../sass'); +// var fs = require('fs'); +// +// var bigScssStr = fs.readFileSync(require('path').resolve(__dirname,'./large_test.scss')); +// var numTestCases = 1000; +// var numCompiled = 0; +// console.log(util.inspect(process.memoryUsage())); +// for (var i = 0; i < numTestCases; i++) { +// sass.renderSync({data: bigScssStr}); +// } +// console.log(util.inspect(process.memoryUsage())); diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/sample.scss b/node_modules/gulp-sass/node_modules/node-sass/test/sample.scss new file mode 100644 index 00000000..75086c30 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/sample.scss @@ -0,0 +1,13 @@ +#navbar { + width: 80%; + height: 23px; +} +#navbar ul { + list-style-type: none; +} +#navbar li { + float: left; + a { + font-weight: bold; + } +} diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/source_comments_spec.js b/node_modules/gulp-sass/node_modules/node-sass/test/source_comments_spec.js new file mode 100644 index 00000000..39e88dbd --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/source_comments_spec.js @@ -0,0 +1,36 @@ +/*jshint multistr:true */ +var sass = require('../sass'); +var assert = require('assert'); + +var sampleFilename = require('path').resolve(__dirname, 'sample.scss'); + +var expectedCommentsScssStr = '/* line 1, ' + sampleFilename + ' */\n\ +#navbar {\n\ + width: 80%;\n\ + height: 23px; }\n\ +\n\ +/* line 5, ' + sampleFilename + ' */\n\ +#navbar ul {\n\ + list-style-type: none; }\n\ +\n\ +/* line 8, ' + sampleFilename + ' */\n\ +#navbar li {\n\ + float: left; }\n\ + /* line 10, ' + sampleFilename + ' */\n\ + #navbar li a {\n\ + font-weight: bold; }\n'; + +describe("compile file with source comments", function() { + it("should compile with render and comment outputs", function(done) { + sass.render({ + file: sampleFilename, + source_comments: 'normal', + success: function (css) { + done(assert.equal(css, expectedCommentsScssStr)); + }, + error: function (error) { + done(error); + } + }); + }); +}); diff --git a/node_modules/gulp-sass/node_modules/node-sass/test/test.js b/node_modules/gulp-sass/node_modules/node-sass/test/test.js new file mode 100644 index 00000000..29cae8f2 --- /dev/null +++ b/node_modules/gulp-sass/node_modules/node-sass/test/test.js @@ -0,0 +1,174 @@ +/*jshint multistr:true */ +var sass = require('../sass'); +var assert = require('assert'); +var path = require('path'); +var badSampleFilename = 'sample.scss'; +var sampleFilename = path.resolve(__dirname, 'sample.scss'); + +var scssStr = '#navbar {\ + width: 80%;\ + height: 23px; }\ + #navbar ul {\ + list-style-type: none; }\ + #navbar li {\ + float: left;\ + a {\ + font-weight: bold; }}\ + @mixin keyAnimation($name, $attr, $value) {\ + @-webkit-keyframes #{$name} {\ + 0% { #{$attr}: $value; }\ + }\ + }'; + +// Note that the bad +var badInput = '#navbar \n\ + width: 80%'; + +var expectedRender = '#navbar {\n\ + width: 80%;\n\ + height: 23px; }\n\ +\n\ +#navbar ul {\n\ + list-style-type: none; }\n\ +\n\ +#navbar li {\n\ + float: left; }\n\ + #navbar li a {\n\ + font-weight: bold; }\n'; + +describe("DEPRECATED: compile scss", function() { + it("should compile with render", function(done) { + sass.render(scssStr, function(err) { + done(err); + }); + }); + + it("should compile with renderSync", function(done) { + done(assert.ok(sass.renderSync(scssStr))); + }); + + it("should match compiled string with render", function(done) { + sass.render(scssStr, function(err, css) { + if (!err) { + done(assert.equal(css, expectedRender)); + } else { + done(err); + } + }); + }); + + it("should match compiled string with renderSync", function(done) { + done(assert.equal(sass.renderSync(scssStr), expectedRender)); + }); + + it("should throw an exception for bad input", function(done) { + done(assert.throws(function() { + sass.renderSync(badInput); + })); + }); +}); + +describe("compile scss", function() { + it("should compile with render", function(done) { + sass.render({ + data: scssStr, + success: function(css) { + done(assert.ok(css)); + } + }); + }); + + it("should compile with renderSync", function(done) { + done(assert.ok(sass.renderSync({data: scssStr}))); + }); + + it("should match compiled string with render", function(done) { + sass.render({ + data: scssStr, + success: function(css) { + done(assert.equal(css, expectedRender)); + }, + error: function(error) { + done(error); + } + }); + }); + + it("should have a error status of 1 for bad css", function(done) { + sass.render({ + data: '{zzz}', + success: function(css) { + console.log(css); + }, + error: function(error, status) { + assert.equal(status, 1); + done(); + } + }); + }); + + it("should match compiled string with renderSync", function(done) { + done(assert.equal(sass.renderSync({data: scssStr}), expectedRender)); + }); + + it("should throw an exception for bad input", function(done) { + done(assert.throws(function() { + sass.renderSync({data: badInput}); + })); + }); +}); + +describe("compile file with include paths", function(){ + it("should compile with render", function(done) { + sass.render({ + file: path.resolve(__dirname, "include_path.scss"), + includePaths: [path.resolve(__dirname, "lib"), path.resolve(__dirname, "functions")], + success: function (css) { + done(assert.equal(css, "body {\n background: red;\n color: #0000fe; }\n")); + }, + error: function (error) { + done(error); + } + }); + }); +}); + +describe("compile file", function() { + it("should compile with render", function(done) { + sass.render({ + file: sampleFilename, + success: function (css) { + done(assert.equal(css, expectedRender)); + }, + error: function (error) { + done(error); + } + }); + }); + + it("should compile with renderSync", function(done) { + done(assert.ok(sass.renderSync({file: sampleFilename}))); + }); + + it("should match compiled string with render", function(done) { + sass.render({ + file: sampleFilename, + success: function(css) { + done(assert.equal(css, expectedRender)); + }, + error: function(error) { + done(error); + } + }); + }); + + it("should match compiled string with renderSync", function(done) { + done(assert.equal(sass.renderSync({file: sampleFilename}), expectedRender)); + }); + + it("should throw an exception for bad input", function(done) { + done(assert.throws(function() { + sass.renderSync({file: badSampleFilename}); + })); + }); +}); diff --git a/node_modules/gulp-sass/package.json b/node_modules/gulp-sass/package.json new file mode 100644 index 00000000..ce35cb85 --- /dev/null +++ b/node_modules/gulp-sass/package.json @@ -0,0 +1,42 @@ +{ + "name": "gulp-sass", + "version": "0.6.0", + "description": "Gulp plugin for sass", + "main": "index.js", + "scripts": { + "test": "node test/test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/dlmanning/gulp-sass" + }, + "keywords": [ + "gulpplugin", + "sass", + "gulp" + ], + "author": { + "name": "David Manning" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/dlmanning/gulp-sass/issues" + }, + "dependencies": { + "node-sass": "~0.8.1", + "gulp-util": "~2.2.5", + "map-stream": "~0.1.0" + }, + "devDependencies": { + "tape": "~2.3.2", + "concat-stream": "~1.4.1" + }, + "jshintConfig": { + "laxcomma": true + }, + "readme": "[![Build Status](https://travis-ci.org/dlmanning/gulp-sass.png?branch=master)](https://travis-ci.org/dlmanning/gulp-sass)\n\ngulp-sass\n=========\n\nSASS plugin for [gulp](https://github.com/wearefractal/gulp).\n\n#Install\n\n```\nnpm install gulp-sass\n```\n\n#Basic Usage\n\nSomething like this:\n\n```javascript\nvar gulp = require('gulp');\nvar sass = require('gulp-sass')\n\ngulp.task('sass', function () {\n\tgulp.src('./scss/*.scss')\n\t\t.pipe(sass())\n\t\t.pipe(gulp.dest('./css'));\n});\n```\n\nOptions passed as a hash into `sass()` will be passed along to [`node-sass`](https://github.com/andrew/node-sass)\n\n## gulp-sass specific options\n\n#### `errLogToConsole: true`\n\nIf you pass `errLogToConsole: true` into the options hash, sass errors will be logged to the console instead of generating a `gutil.PluginError` object. Use this option with `gulp.watch` to keep gulp from stopping every time you mess up your sass.\n\n#### `onSuccess: callback`\n\nPass in your own callback to be called upon successful compilaton by node-sass. The callback has the form `callback(css)`, and is passed the compiled css as a string. Note: This *does not* prevent gulp-sass's default behavior of writing the output css file.\n\n#### `onError: callback`\n\nPass in your own callback to be called upon a sass error from node-sass. The callback has the form `callback(err)`, where err is the error string generated by libsass. Note: this *does* prevent an actual `gulpPluginError` object from being created.\n\n#Imports and Partials\n\ngulp-sass now automatically passes along the directory of every scss file it parses as an include path for node-sass. This means that as long as you specify your includes relative to path of your scss file, everything will just work.\n\nscss/includes/_settings.scss:\n\n```scss\n$blue: #3bbfce;\n$margin: 16px;\n```\n\nscss/style.scss:\n\n```scss\n@import \"includes/settings\";\n\n.content-navigation {\n border-color: $blue;\n color:\n darken($blue, 9%);\n}\n\n.border {\n padding: $margin / 2;\n margin: $margin / 2;\n border-color: $blue;\n}\n```\n\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/dlmanning/gulp-sass", + "_id": "gulp-sass@0.6.0", + "_from": "gulp-sass@" +} diff --git a/node_modules/gulp-sass/test/ref/inheritance.css b/node_modules/gulp-sass/test/ref/inheritance.css new file mode 100644 index 00000000..1e58035d --- /dev/null +++ b/node_modules/gulp-sass/test/ref/inheritance.css @@ -0,0 +1,10 @@ +.error, .badError { + border: #f00; + background: #fdd; } + +.error.intrusion { + font-size: 1.3em; + font-weight: bold; } + +.badError { + border-width: 3px; } diff --git a/node_modules/gulp-sass/test/ref/mixins.css b/node_modules/gulp-sass/test/ref/mixins.css new file mode 100644 index 00000000..f1a00f57 --- /dev/null +++ b/node_modules/gulp-sass/test/ref/mixins.css @@ -0,0 +1,8 @@ +#data { + float: left; + margin-left: 10px; } + #data th { + text-align: center; + font-weight: bold; } + #data td, #data th { + padding: 2px; } diff --git a/node_modules/gulp-sass/test/ref/nesting.css b/node_modules/gulp-sass/test/ref/nesting.css new file mode 100644 index 00000000..5a7d6bb7 --- /dev/null +++ b/node_modules/gulp-sass/test/ref/nesting.css @@ -0,0 +1,9 @@ +table.hl { + margin: 2em 0; } + table.hl td.ln { + text-align: right; } + +li { + font-family: serif; + font-weight: bold; + font-size: 1.2em; } diff --git a/node_modules/gulp-sass/test/ref/variables.css b/node_modules/gulp-sass/test/ref/variables.css new file mode 100644 index 00000000..217dd34b --- /dev/null +++ b/node_modules/gulp-sass/test/ref/variables.css @@ -0,0 +1,8 @@ +.content-navigation { + border-color: #3bbfce; + color: #2ca2af; } + +.border { + padding: 8px; + margin: 8px; + border-color: #3bbfce; } diff --git a/node_modules/gulp-sass/test/scss/includes/_cats.scss b/node_modules/gulp-sass/test/scss/includes/_cats.scss new file mode 100644 index 00000000..7096c21a --- /dev/null +++ b/node_modules/gulp-sass/test/scss/includes/_cats.scss @@ -0,0 +1,2 @@ +$blue: #3bbfce; +$margin: 16px; \ No newline at end of file diff --git a/node_modules/gulp-sass/test/scss/inheritance.scss b/node_modules/gulp-sass/test/scss/inheritance.scss new file mode 100644 index 00000000..f3caa927 --- /dev/null +++ b/node_modules/gulp-sass/test/scss/inheritance.scss @@ -0,0 +1,16 @@ +@import "includes/cats"; + +.error { + border: #f00; + background: #fdd; +} + +.error.intrusion { + font-size: 1.3em; + font-weight: bold; +} + +.badError { + @extend .error; + border-width: 3px; +} \ No newline at end of file diff --git a/node_modules/gulp-sass/test/scss/mixins.scss b/node_modules/gulp-sass/test/scss/mixins.scss new file mode 100644 index 00000000..3b81f73e --- /dev/null +++ b/node_modules/gulp-sass/test/scss/mixins.scss @@ -0,0 +1,17 @@ +@mixin table-base { + th { + text-align: center; + font-weight: bold; + } + td, th {padding: 2px} +} + +@mixin left($dist) { + float: left; + margin-left: $dist; +} + +#data { + @include left(10px); + @include table-base; +} \ No newline at end of file diff --git a/node_modules/gulp-sass/test/scss/nesting.scss b/node_modules/gulp-sass/test/scss/nesting.scss new file mode 100644 index 00000000..d3300ea8 --- /dev/null +++ b/node_modules/gulp-sass/test/scss/nesting.scss @@ -0,0 +1,14 @@ +table.hl { + margin: 2em 0; + td.ln { + text-align: right; + } +} + +li { + font: { + family: serif; + weight: bold; + size: 1.2em; + } +} diff --git a/node_modules/gulp-sass/test/scss/variables.scss b/node_modules/gulp-sass/test/scss/variables.scss new file mode 100644 index 00000000..7c5de0f0 --- /dev/null +++ b/node_modules/gulp-sass/test/scss/variables.scss @@ -0,0 +1,14 @@ +$blue: #3bbfce; +$margin: 16px; + +.content-navigation { + border-color: $blue; + color: + darken($blue, 9%); +} + +.border { + padding: $margin / 2; + margin: $margin / 2; + border-color: $blue; +} \ No newline at end of file diff --git a/node_modules/gulp-sass/test/test.js b/node_modules/gulp-sass/test/test.js new file mode 100644 index 00000000..978c0a5b --- /dev/null +++ b/node_modules/gulp-sass/test/test.js @@ -0,0 +1,109 @@ +var assert = require('assert'); +var gsass = require('../'); +var gutil = require('gulp-util'); +var fs = require('fs'); +var path = require('path'); +var test = require('tape'); + +function createVinyl(sassFileName, contents) { + var base = path.join(__dirname, 'scss'); + var filePath = path.join(base, sassFileName); + + return new gutil.File({ + cwd: __dirname, + base: base, + path: filePath, + contents: contents || fs.readFileSync(filePath) + }); +} + +test('pass file when isNull()', function (t) { + var stream = gsass(); + var emptyFile = { + isNull: function () { return true; } + }; + stream.on('data', function (data) { + t.equal(data, emptyFile); + t.end(); + }); + stream.write(emptyFile); +}); + +// test('emit error when file isStream()', function (t) { +// var stream = gsass(); +// var streamFile = { +// isNull: function () { return false; }, +// isStream: function () { return true; } +// }; +// stream.on() +// }); + +test('compile a single sass file', function (t) { + var sassFile = createVinyl('mixins.scss'); + + var stream = gsass(); + stream.on('data', function (cssFile) { + t.ok(cssFile, 'cssFile should exist'); + t.ok(cssFile.path, 'cssFile.path should exist'); + t.ok(cssFile.relative, 'cssFile.relative should exist'); + t.ok(cssFile.contents, 'cssFile.contents should exist'); + t.equal(cssFile.path, path.join(__dirname, 'scss', 'mixins.css')); + t.equal( + fs.readFileSync(path.join(__dirname, 'ref/mixins.css'), 'utf8'), + cssFile.contents.toString(), + 'file compiles correctly to css' + ); + t.end(); + }) + stream.write(sassFile); +}); + +test('compile multiple sass files', function (t) { + var files = [ + createVinyl('inheritance.scss'), + createVinyl('mixins.scss'), + createVinyl('nesting.scss'), + createVinyl('variables.scss') + ]; + + t.plan(files.length * 4); + var stream = gsass(); + + stream.on('data', function (cssFile) { + t.ok(cssFile, 'cssFile exists'); + t.ok(cssFile.path, 'cssFile.path exists'); + t.ok(cssFile.relative, 'cssFile.relative exists'); + t.ok(cssFile.contents, 'cssFile.contents exists'); + }); + + files.forEach(function (file) { + stream.write(file); + }); +}); + +test('emit error on sass errors', function (t) { + var stream = gsass(); + var errorFile = createVinyl('somefile.sass', + new Buffer('body { font \'Comic Sans\'; }')); + stream.on('error', function (err) { + t.equal(err.message, + 'source string:1: error: property "font" must be followed by a \':\'\n' + ); + t.end(); + }); + stream.write(errorFile); +}); + +test('call custom error callback when opts.onError is given', function (t) { + var stream = gsass({ onError: function (err) { + t.equal(err, + 'source string:1: error: property "font" must be followed by a \':\'\n' + ); + t.end(); + }}); + + var errorFile = createVinyl('somefile.sass', + new Buffer('body { font \'Comic Sans\'; }')); + + stream.write(errorFile); +}); \ No newline at end of file diff --git a/node_modules/gulp/.jshintrc b/node_modules/gulp/.jshintrc new file mode 100644 index 00000000..b5804889 --- /dev/null +++ b/node_modules/gulp/.jshintrc @@ -0,0 +1,12 @@ +{ + "strict": true, + "undef": true, + "unused": true, + "node": true, + "globals": { + "describe": true, + "it": true, + "beforeEach": true, + "afterEach": true + } +} diff --git a/node_modules/gulp/.npmignore b/node_modules/gulp/.npmignore new file mode 100644 index 00000000..f93c3951 --- /dev/null +++ b/node_modules/gulp/.npmignore @@ -0,0 +1,12 @@ +.DS_Store +*.log +node_modules +build +*.node +components +coverage +*.orig +.idea +sandbox +test/out-fixtures/* +test/watch-*.txt diff --git a/node_modules/gulp/.travis.yml b/node_modules/gulp/.travis.yml new file mode 100644 index 00000000..33ad9f8c --- /dev/null +++ b/node_modules/gulp/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.9" + - "0.10" +after_script: + - npm run coveralls \ No newline at end of file diff --git a/node_modules/gulp/CHANGELOG.md b/node_modules/gulp/CHANGELOG.md new file mode 100644 index 00000000..2b73b0e5 --- /dev/null +++ b/node_modules/gulp/CHANGELOG.md @@ -0,0 +1,128 @@ +# gulp changelog + +# 3.5.2 + +- add -V for version on CLI (unix standard) +- -v is deprecated, use -V +- add -T as an alias for --tasks +- documentation + +# 3.5 + +- added `gulp.watch(globs, tasksArray)` sugar +- remove gulp.taskQueue +- deprecate gulp.run +- deprecate gulp.env +- add engineStrict to prevent people with node < 0.9 from installing + +# 3.4 + +- added `--tasks` that prints out the tree of tasks + deps +- global cli + local install mismatch is no longer fatal +- remove tests for fs stuff +- switch core src, dest, and watch to vinyl-fs +- internal cleaning + +## 3.3.4 + +- `--base` is now `--cwd` + +## 3.3.3 + +- support for `--base` CLI arg to change where the search for gulpfile/`--require`s starts +- support for `--gulpfile` CLI arg to point to a gulpfile specifically + +## 3.3.0 + +- file.contents streams are no longer paused coming out of src +- dest now passes files through before they are empty to fix passing to multiple dests + +## 3.2.4 + +- Bug fix - we didn't have any CLI tests + +## 3.2.3 + +- Update dependencies for bug fixes +- autocomplete stuff in the completion folder + +## 3.2 + +- File object is now [vinyl](https://github.com/wearefractal/vinyl) +- .watch() is now [glob-watcher](https://github.com/wearefractal/glob-watcher) +- Fix CLI -v when no gulpfile found +- gulp-util updated +- Logging moved to CLI bin file + - Will cause double logging if you update global CLI to 3.2 but not local + - Will cause no logging if you update local to 3.1 but not global CLI +- Drop support for < 0.9 + +## 3.1.3 + +- Move isStream and isBuffer to gulp-util + +## 3.1 + +- Move file class to gulp-util + +## 3.0 + +- Ability to pass multiple globs and glob negations to glob-stream +- Breaking change to the way glob-stream works +- File object is now a class +- file.shortened changed to file.relative +- file.cwd added +- Break out getStats to avoid nesting +- Major code reorganization + +## 2.7 + +- Breaking change to the way options are passed to glob-stream +- Introduce new File object to ease pain of computing shortened names (now a getter) + +## 2.4 - 2.6 + +- Moved stuff to gulp-util +- Quit exposing createGlobStream (just use the glob-stream module) +- More logging +- Prettier time durations +- Tons of documentation changes +- gulp.trigger(tasks...) as a through stream + +## 1.2-2.4 (11/12/13) + +- src buffer=false fixed for 0.8 and 0.9 (remember to .resume() on these versions before consuming) +- CLI completely rewritten + - Colorful logging + - Uses local version of gulp to run tasks + - Uses findup to locate gulpfile (so you can run it anywhere in your project) + - chdir to gulpfile directory before loading it + - Correct exit codes on errors +- silent flag added to gulp to disable logging +- Fixes to task orchestration (3rd party) +- Better support for globbed directories (thanks @robrich) + +## 1.2 (10/28/13) + +- Can specify buffer=false on src streams to make file.content a stream +- Can specify read=false on src streams to disable file.content + +## 1.1 (10/21/13) + +- Can specify run callback +- Can specify task dependencies +- Tasks can accept callback or return promise +- `gulp.verbose` exposes run-time internals + +## 1.0 (9/26/13) + +- Specify dependency versions +- Updated docs + +## 0.2 (8/6/13) + +- Rename .files() to .src() and .folder() to .dest() + +## 0.1 (7/18/13) + +- Initial Release diff --git a/node_modules/gulp/LICENSE b/node_modules/gulp/LICENSE new file mode 100755 index 00000000..7cbe012c --- /dev/null +++ b/node_modules/gulp/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Fractal + +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/gulp/README.md b/node_modules/gulp/README.md new file mode 100644 index 00000000..a1978e59 --- /dev/null +++ b/node_modules/gulp/README.md @@ -0,0 +1,77 @@ +

      + + + +
      + Visit our website! +

      + +# gulp [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][daviddm-url]][daviddm-image] +> The streaming build system + +## Like what we do? + +[Support us via gittip](https://www.gittip.com/Contra/) + +## Documentation + +For a Getting started guide, API docs, recipes, making a plugin, etc. see the [documentation page](/docs/README.md)! + +## Sample gulpfile + +This file is just a quick sample to give you a taste of what gulp does. + +```javascript +var gulp = require('gulp'); + +var coffee = require('gulp-coffee'); +var concat = require('gulp-concat'); +var uglify = require('gulp-uglify'); +var imagemin = require('gulp-imagemin'); + +var paths = { + scripts: ['client/js/**/*.coffee', '!client/external/**/*.coffee'], + images: 'client/img/**/*' +}; + +gulp.task('scripts', function() { + // Minify and copy all JavaScript (except vendor scripts) + return gulp.src(paths.scripts) + .pipe(coffee()) + .pipe(uglify()) + .pipe(concat('all.min.js')) + .pipe(gulp.dest('build/js')); +}); + +// Copy all static images +gulp.task('images', function() { + return gulp.src(paths.images) + // Pass in options to the task + .pipe(imagemin({optimizationLevel: 5})) + .pipe(gulp.dest('build/img')); +}); + +// Rerun the task when a file changes +gulp.task('watch', function () { + gulp.watch(paths.scripts, ['scripts']); + gulp.watch(paths.images, ['images']); +}); + +// The default task (called when you run `gulp` from cli) +gulp.task('default', ['scripts', 'images', 'watch']); + +``` + + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/wearefractal/gulp/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + +[npm-url]: https://npmjs.org/package/gulp +[npm-image]: https://badge.fury.io/js/gulp.png +[travis-url]: https://travis-ci.org/gulpjs/gulp +[travis-image]: https://travis-ci.org/gulpjs/gulp.png?branch=master +[coveralls-url]: https://coveralls.io/r/gulpjs/gulp +[coveralls-image]: https://coveralls.io/repos/gulpjs/gulp/badge.png +[depstat-url]: https://david-dm.org/gulpjs/gulp +[depstat-image]: https://david-dm.org/gulpjs/gulp.png +[daviddm-url]: https://david-dm.org/gulpjs/gulp.png?theme=shields.io +[daviddm-image]: https://david-dm.org/gulpjs/gulp diff --git a/node_modules/gulp/bin/gulp.js b/node_modules/gulp/bin/gulp.js new file mode 100755 index 00000000..08651fa6 --- /dev/null +++ b/node_modules/gulp/bin/gulp.js @@ -0,0 +1,202 @@ +#!/usr/bin/env node + +'use strict'; + +var path = require('path'); + +var resolve = require('resolve'); +var findup = require('findup-sync'); +var gutil = require('gulp-util'); +var prettyTime = require('pretty-hrtime'); +var minimist = require('minimist'); +var semver = require('semver'); +var archy = require('archy'); + +var completion = require('../lib/completion'); +var taskTree = require('../lib/taskTree'); +var cliPkg = require('../package.json'); + +// parse what we want off the CLI +var argv = minimist(process.argv.slice(2)); + +if (argv.completion) { + return completion(argv.completion); +} + +var tasks = argv._; +var tasksFlag = argv.T || argv.tasks; + +// TODO: drop argv.v in the next breaking release +var versionFlag = argv.v || argv.V || argv.version; +var cwdFlag = argv.cwd; +var fileFlag = argv.gulpfile; + +var cwd; + +if (cwdFlag) { + cwd = path.resolve(cwdFlag); +} else { + cwd = process.cwd(); +} + +loadRequires(argv.require, cwd); + +var gulpFile; + +if (fileFlag) { + gulpFile = path.join(cwd, fileFlag); +} else { + gulpFile = getGulpFile(cwd); +} + +// find the local gulp +var localGulp = findLocalGulp(gulpFile); +var localPkg = findLocalGulpPackage(gulpFile); + +// print some versions and shit +if (versionFlag) { + gutil.log('CLI version', cliPkg.version); + if (localGulp) { + gutil.log('Local version', localPkg.version); + } + process.exit(0); +} + +if (!localGulp) { + gutil.log(gutil.colors.red('No local gulp install found in'), gutil.colors.magenta(getLocalBase(gulpFile))); + gutil.log(gutil.colors.red('Try running: npm install gulp')); + process.exit(1); +} + +// check for semver difference in running gulp vs locally installed and warn if running gulp > locally installed +if (semver.gt(cliPkg.version, localPkg.version)) { + gutil.log(gutil.colors.red('gulp version mismatch:')); + gutil.log(gutil.colors.red('Running gulp is', cliPkg.version)); + gutil.log(gutil.colors.red('Local gulp (installed in gulpfile dir) is', localPkg.version)); +} + +if (!gulpFile) { + gutil.log(gutil.colors.red('No gulpfile found')); + process.exit(1); +} + +// Wire up logging for tasks +// on local gulp singleton +logEvents(localGulp); + +// Load their gulpfile and run it +gutil.log('Using file', gutil.colors.magenta(gulpFile)); +loadGulpFile(localGulp, gulpFile, tasks); + +function loadRequires(requires, baseDir) { + if (typeof requires === 'undefined') requires = []; + if (!Array.isArray(requires)) requires = [requires]; + return requires.map(function(modName){ + gutil.log('Requiring external module', gutil.colors.magenta(modName)); + var mod = findLocalModule(modName, baseDir); + if (typeof mod === 'undefined') { + gutil.log('Failed to load external module', gutil.colors.magenta(modName)); + } + }); +} + +function getLocalBase(gulpFile) { + return path.resolve(path.dirname(gulpFile)); +} + +function findLocalGulp(gulpFile){ + var baseDir = getLocalBase(gulpFile); + return findLocalModule('gulp', baseDir); +} + +function findLocalModule(modName, baseDir){ + try { + return require(resolve.sync(modName, {basedir: baseDir})); + } catch(e) {} + return; +} + +function findLocalGulpPackage(gulpFile){ + var baseDir = getLocalBase(gulpFile); + var packageBase; + try { + packageBase = path.dirname(resolve.sync('gulp', {basedir: baseDir})); + return require(path.join(packageBase, 'package.json')); + } catch(e) {} + return; +} + +function loadGulpFile(localGulp, gulpFile, tasks){ + var gulpFileCwd = path.dirname(gulpFile); + process.chdir(gulpFileCwd); + gutil.log('Working directory changed to', gutil.colors.magenta(gulpFileCwd)); + + var theGulpfile = require(gulpFile); + + // just for good measure + process.nextTick(function(){ + if (tasksFlag) { + return logTasks(gulpFile, localGulp); + } + + startGulp(localGulp, tasks); + }); + return theGulpfile; +} + +function startGulp(localGulp, tasks) { + // impose our opinion of "default" tasks onto orchestrator + var toRun = tasks.length ? tasks : ['default']; + return localGulp.start.apply(localGulp, toRun); +} + +function logTasks(gulpFile, localGulp) { + var tree = taskTree(localGulp.tasks); + tree.label = 'Tasks for '+gutil.colors.magenta(gulpFile); + archy(tree).split('\n').forEach(function(v){ + if (v.trim().length === 0) return; + gutil.log(v); + }); +} + +function getGulpFile() { + var extensions; + if (require.extensions) { + extensions = Object.keys(require.extensions).join(','); + } else { + extensions = ['.js']; + } + var gulpFile = findup('gulpfile{'+extensions+'}', {cwd: cwd, nocase: true}); + return gulpFile; +} + +// format orchestrator errors +function formatError (e) { + if (!e.err) return e.message; + if (e.err.message) return e.err.message; + return JSON.stringify(e.err); +} + +// wire up logging events +function logEvents(gulp) { + gulp.on('task_start', function(e){ + gutil.log('Running', "'"+gutil.colors.cyan(e.task)+"'..."); + }); + + gulp.on('task_stop', function(e){ + var time = prettyTime(e.hrDuration); + gutil.log('Finished', "'"+gutil.colors.cyan(e.task)+"'", 'in', gutil.colors.magenta(time)); + }); + + gulp.on('task_err', function(e){ + var msg = formatError(e); + var time = prettyTime(e.hrDuration); + gutil.log('Errored', "'"+gutil.colors.cyan(e.task)+"'", 'in', gutil.colors.magenta(time), gutil.colors.red(msg)); + }); + + gulp.on('task_not_found', function(err){ + gutil.log(gutil.colors.red("Task '"+err.task+"' was not defined in your gulpfile but you tried to run it.")); + gutil.log('Please check the documentation for proper gulpfile formatting.'); + process.exit(1); + }); +} diff --git a/node_modules/gulp/completion/README.md b/node_modules/gulp/completion/README.md new file mode 100644 index 00000000..3cd9c169 --- /dev/null +++ b/node_modules/gulp/completion/README.md @@ -0,0 +1,12 @@ +# Completion for gulp +> Thanks to grunt team and Tyler Kellen + +To enable tasks auto-completion in shell you should add `eval "$(gulp --completion=shell)"` in your `.shellrc` file. + +## Bash + +Add `eval "$(gulp --completion=bash)"` to `~/.bashrc`. + +## Zsh + +Add `eval "$(gulp --completion=zsh)"` to `~/.zshrc`. \ No newline at end of file diff --git a/node_modules/gulp/completion/bash b/node_modules/gulp/completion/bash new file mode 100644 index 00000000..f9e2512b --- /dev/null +++ b/node_modules/gulp/completion/bash @@ -0,0 +1,29 @@ +#!/bin/bash + +# Borrowed from grunt-cli +# http://gruntjs.com/ +# +# Copyright (c) 2012 Tyler Kellen, contributors +# Licensed under the MIT license. +# https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT + +# Usage: +# +# To enable bash completion for grunt, add the following line (minus the +# leading #, which is the bash comment character) to your ~/.bashrc file: +# +# eval "$(gulp --completion=bash)" + +# Enable bash autocompletion. +function _gulp_completions() { + # The currently-being-completed word. + local cur="${COMP_WORDS[COMP_CWORD]}" + #Grab tasks + local compls=$(node -e "try { var gulp = require('gulp'); require('./gulpfile'); console.log(Object.keys(gulp.tasks).join(' ')); } catch (e) {}") + # Trim whitespace. + compls=$(echo "$compls" | sed -e 's/^ *//g' -e 's/ *$//g') + # Tell complete what stuff to show. + COMPREPLY=($(compgen -W "$compls" -- "$cur")) +} + +complete -o default -F _gulp_completions gulp diff --git a/node_modules/gulp/completion/zsh b/node_modules/gulp/completion/zsh new file mode 100644 index 00000000..6e4aa0bb --- /dev/null +++ b/node_modules/gulp/completion/zsh @@ -0,0 +1,27 @@ +#!/bin/zsh + +# Borrowed from grunt-cli +# http://gruntjs.com/ +# +# Copyright (c) 2012 Tyler Kellen, contributors +# Licensed under the MIT license. +# https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT + +# Usage: +# +# To enable zsh completion for grunt, add the following line (minus the +# leading #, which is the zsh comment character) to your ~/.zshrc file: +# +# eval "$(gulp --completion=zsh)" + +# Enable zsh autocompletion. +function _gulp_completion() { + # Grap tasks + compls=$(node -e "try { var gulp = require('gulp'); require('./gulpfile'); console.log(Object.keys(gulp.tasks).join(' ')); } catch (e) {}") + # Trim whitespace. + compls=$(echo "$compls" | sed -e 's/^ *//g' -e 's/ *$//g') + completions=(${=compls}) + compadd -- $completions +} + +compdef _gulp_completion gulp diff --git a/node_modules/gulp/docs/API.md b/node_modules/gulp/docs/API.md new file mode 100644 index 00000000..8c58ce63 --- /dev/null +++ b/node_modules/gulp/docs/API.md @@ -0,0 +1,232 @@ +## gulp API docs + +### gulp.src(globs[, options]) + +Takes a glob and represents a file structure. Can be piped to plugins. + +```javascript +gulp.src('./client/templates/*.jade') + .pipe(jade()) + .pipe(minify()) + .pipe(gulp.dest('./build/minified_templates')); +``` + +#### globs +Type: `String` or `Array` + +Glob or globs to read. + +#### options +Type: `Object` + +Options to pass to [node-glob] through [glob-stream]. + +gulp adds two additional options in addition to the [options supported by node-glob][node-glob documentation]: + +#### options.buffer +Type: `Boolean` +Default: `true` + +Setting this to `false` will return `file.contents` as a stream and not buffer files. This is useful when working with large files. **Note:** Plugins may not implement support for streams. + +#### options.read +Type: `Boolean` +Default: `true` + +Setting this to `false` will return `file.contents` as null and not read the file at all. + + +### gulp.dest(path) + +Can be piped to and it will write files. Re-emits all data passed to it so you can pipe to multiple folders. + +```javascript +gulp.src('./client/templates/*.jade') + .pipe(jade()) + .pipe(gulp.dest('./build/templates')) + .pipe(minify()) + .pipe(gulp.dest('./build/minified_templates')); +``` + +#### path +Type: `String` + +The path (folder) to write files to. + + +### gulp.task(name[, deps], fn) + +Define a task using [Orchestrator]. + +```javascript +gulp.task('somename', function() { + // Do stuff +}); +``` + +#### name + +The name of the task. Tasks that you want to run from the command line should not have spaces in them. + +#### deps +Type: `Array` + +An array of tasks to be executed and completed before your task will run. + +```javascript +gulp.task('mytask', ['array', 'of', 'task', 'names'], function() { + // Do stuff +}); +``` + +**Note:** Are your tasks running before the dependencies are complete? Make sure your dependency tasks +are correctly using the async run hints: take in a callback or return a promise or event stream. + +#### fn + +The function that performs the task's operations. Generally this takes the form of `gulp.src().pipe(someplugin())`. + +#### Async task support + +Tasks can be made asynchronous if its `fn` does one of the following: + +##### Accept a callback + +```javascript +gulp.task('somename', function(cb) { + // Do stuff + cb(err); +}); +``` + +##### Return a stream + +```javascript +gulp.task('somename', function() { + var stream = gulp.src('./client/**/*.js') + .pipe(minify()) + .pipe(gulp.dest('/build')); + return stream; +}); +``` + +##### Return a promise + +```javascript +var Q = require('q'); + +gulp.task('somename', function() { + var deferred = Q.defer(); + + // Do async stuff + setTimeout(function() { + deferred.resolve(); + }, 1); + + return deferred.promise; +}); +``` + +**Note:** By default, tasks run with maximum concurrency -- e.g. it launches all the tasks at once and waits for nothing. +If you want to create a series where tasks run in a particular order, you need to do two things: + +- give it a hint to tell it when the task is done, +- and give it a hint that a task depends on completion of another. + +For these examples, let's presume you have two tasks, "one" and "two" that you specifically want to run in this order: + +1. In task "one" you add a hint to tell it when the task is done. Either take in a callback and call it when you're +done or return a promise or stream that the engine should wait to resolve or end respectively. + +2. In task "two" you add a hint telling the engine that it depends on completion of the first task. + +So this example would look like this: + +```javascript +var gulp = require('gulp'); + +// takes in a callback so the engine knows when it'll be done +gulp.task('one', function (cb) { + // do stuff -- async or otherwise + cb(err); // if err is not null and not undefined, the run will stop, and note that it failed +}); + +// identifies a dependent task must be complete before this one begins +gulp.task('two', ['one'], function () { + // task 'one' is done now +}); + +gulp.task('default', ['one', 'two']); +``` + + +### gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb]) + +Watch files and do something when a file changes. This always returns an EventEmitter that emits `changed` events. + +### gulp.watch(glob[, opts], tasks) + +#### glob +Type: `String` or `Array` + +A single glob or array of globs that indicate which files to watch for changes. + +#### opts +Type: `Object` + +Options, that are passed to [`gaze`](https://github.com/shama/gaze). + +#### tasks +Type: `Array` + +Names of task(s) to run when a file changes, added with `gulp.task()` + +```javascript +var watcher = gulp.watch('js/**/*.js', ['uglify','reload']); +watcher.on('changed', function(event){ + console.log('File '+event.path+' was '+event.type+', running tasks...'); +}); +``` + +### gulp.watch(glob[, opts, cb]) + +#### glob +Type: `String` or `Array` + +A single glob or array of globs that indicate which files to watch for changes. + +#### opts +Type: `Object` + +Options, that are passed to [`gaze`](https://github.com/shama/gaze). + +#### cb(event) +Type: `Function` + +Callback to be called on each change. + +```javascript +gulp.watch('js/**/*.js', function(event) { + console.log('File '+event.path+' was '+event.type+', running tasks...'); +}); +``` + +The callback will be passed an object, `event`, that describes the change: + +##### event.type +Type: `String` + +The type of change that occurred, either `added`, `changed` or `deleted`. + +##### event.path +Type: `String` + +The path to the file that triggered the event. + + +[node-optimist]: https://github.com/substack/node-optimist +[node-glob documentation]: https://github.com/isaacs/node-glob#options +[node-glob]: https://github.com/isaacs/node-glob +[glob-stream]: https://github.com/wearefractal/glob-stream +[gulp-if]: https://github.com/robrich/gulp-if +[Orchestrator]: https://github.com/robrich/orchestrator diff --git a/node_modules/gulp/docs/CLI.md b/node_modules/gulp/docs/CLI.md new file mode 100644 index 00000000..c6c9b578 --- /dev/null +++ b/node_modules/gulp/docs/CLI.md @@ -0,0 +1,25 @@ +## gulp CLI docs + +### Flags + +gulp has very few flags to know about. All other flags are for tasks to use if needed. + +- `-V` or `--version` will display the global and local gulp versions +- `--require ` will require a module before running the gulpfile. This is useful for transpilers but also has other applications. You can use multiple `--require` flags +- `--gulpfile ` manually set path of gulpfile. Useful if you have multiple gulpfiles. This will set the CWD to the gulpfile directory as well. +- `--cwd ` manually set the CWD. The search for the gulpfile, as well as the relativity of all requires will be from here. +- `-T` or `--tasks` will display the task dependency tree for the loaded gulpfile + +### Tasks + +Tasks can be executed by running `gulp `. Just running `gulp` will execute the task you registered called `default`. If there is no `default` task gulp will error. + +### Compilers + +You can use any language you want for your gulpfile. You will have to specify the language module name so the CLI can load it (and its associated extensions) before attempting to find your gulpfile. Make sure you have this module installed accessible by the folder you are running the CLI in. + +Example: + +``` +gulp dosomething --require coffee-script/register +``` \ No newline at end of file diff --git a/node_modules/gulp/docs/FAQ.md b/node_modules/gulp/docs/FAQ.md new file mode 100644 index 00000000..b6bd58fe --- /dev/null +++ b/node_modules/gulp/docs/FAQ.md @@ -0,0 +1,50 @@ +# FAQ + +## Why gulp? Why not ____? + +See the [gulp introduction slideshow] for a rundown on how gulp came to be. + +## Is it "gulp" or "Gulp"? + +gulp is always lowercase. + +## Where can I find a list of gulp plugins? + +gulp plugins always include the `gulpplugin` keyword. [Search gulp plugins][search-gulp-plugins] or [view all plugins][npm plugin search]. + +## I want to write a gulp plugin, how do I get started? + +See the [Writing a gulp plugin] wiki page for guidelines and an example to get you started. + +## My plugin does ____, is it doing too much? + +Probably. Ask yourself: + +1. Is my plugin doing something that other plugins may need to do? + - If so, that piece of functionality should be a separate plugin. [Check if it already exists on npm][npm plugin search]. +1. Is my plugin doing two, completely different things based on a configuration option? + - If so, it may serve the community better to release it as two separate plugins + - If the two tasks are different, but very closely related, it's probably OK + +## How should newlines be represented in plugin output? + +Always use gulp-util.newline (which is \n) to prevent diff issues between operating systems. + +## Where can I get updates on gulp? + +gulp updates can be found on the following twitters: + +- [@wearefractal](https://twitter.com/wearefractal) +- [@eschoff](https://twitter.com/eschoff) +- [@funkytek](https://twitter.com/funkytek) +- [@gulpjs](https://twitter.com/gulpjs) + +## Does gulp have an IRC channel? + +Yes, come chat with us in #gulpjs on [Freenode]. + +[Writing a gulp plugin]: writing-a-plugin/README.md +[gulp introduction slideshow]: http://slid.es/contra/gulp +[Freenode]: http://freenode.net/ +[search-gulp-plugins]: http://gratimax.github.io/search-gulp-plugins/ +[npm plugin search]: https://npmjs.org/browse/keyword/gulpplugin diff --git a/node_modules/gulp/docs/README.md b/node_modules/gulp/docs/README.md new file mode 100644 index 00000000..f4643240 --- /dev/null +++ b/node_modules/gulp/docs/README.md @@ -0,0 +1,30 @@ +# gulp documentation + +* [Getting Started](getting-started.md) - How to get going with gulp +* [API documentation](API.md) - Learn the ins and outs of using gulp +* [CLI documentation](CLI.md) - Learn how to call tasks and use compilers +* [Writing a Plugin](writing-a-plugin/README.md) - So you're writing a gulp plugin? Go here for the essential dos and don'ts. + +## FAQ + +See [the FAQ](FAQ.md) for the answers to commonly asked questions. + +## Recipes + +The community has compiled guides on how to use gulp for common use cases. Check out the [recipes folder](recipes) for a full list. + +## Articles + +* [Introduction to node.js streams](https://github.com/substack/stream-handbook) +* [Video introduction to node.js streams](http://www.youtube.com/watch?v=QgEuZ52OZtU) +* [Getting started with gulp (by @markgdyr)](http://markgoodyear.com/2014/01/getting-started-with-gulp/) +* [Why you shouldn’t create a gulp plugin (or, how to stop worrying and learn to love existing node packages)](http://blog.overzealous.com/post/74121048393/why-you-shouldnt-create-a-gulp-plugin-or-how-to-stop) +* [Inspiration (slides) about why gulp was made](http://slid.es/contra/gulp) + +## License + +All the documentation is covered by the CC0 license *(do whatever you want with it - public domain)*. + +[![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/) + +To the extent possible under law, [Fractal](http://wearefractal.com) has waived all copyright and related or neighboring rights to this work. diff --git a/node_modules/gulp/docs/getting-started.md b/node_modules/gulp/docs/getting-started.md new file mode 100644 index 00000000..7d3298c7 --- /dev/null +++ b/node_modules/gulp/docs/getting-started.md @@ -0,0 +1,46 @@ +## Getting Started + +### 1. Install gulp globally: + +``` +npm install -g gulp +``` + +### 2. Install gulp and gulp-util in your project devDependencies: + +``` +npm install --save-dev gulp gulp-util +``` + +### 3. Create a `gulpfile.js` at the root of your project: + +```javascript +var gulp = require('gulp'); +var gutil = require('gulp-util'); + +gulp.task('default', function(){ + // place code for your default task here +}); +``` + +### 4. Run gulp + +``` +gulp +``` + +The default task will run and do nothing. + +To run individual tasks, use `gulp ` + +## Where do I go now? + +You have an empty gulpfile and everything is installed. How do you REALLY get started? Check out the [recipes and articles section](README.md#articles-and-recipes) for more information + +## .src, .watch, .dest, CLI args - How do I use these things? + +For API specific documentation you can check out the [documentation for that](API.md) + +## Available Plugins + +The gulp community is growing, with new plugins being added daily. See the [main website](http://gulpjs.com/) for a complete list. diff --git a/node_modules/gulp/docs/recipes/combining-streams-to-handle-errors.md b/node_modules/gulp/docs/recipes/combining-streams-to-handle-errors.md new file mode 100644 index 00000000..eb71b412 --- /dev/null +++ b/node_modules/gulp/docs/recipes/combining-streams-to-handle-errors.md @@ -0,0 +1,38 @@ +# Combining streams to handle errors # + +By default, emitting an error on a stream will cause it to be thrown +unless it already has a listener attached to the `error` event. This +gets a bit tricky when you're working with longer pipelines of streams. + +By using [gulp-util](https://github.com/gulpjs/gulp-util)'s `combine` +method you can turn a series of streams into a single stream, meaning you +only need to listen to the `error` event in one place in your code. + +Here's an example of using it in a gulpfile: + +``` javascript +var combine = require('gulp-util').combine +var uglify = require('gulp-uglify') +var gulp = require('gulp') + +gulp.task('test', function() { + var combined = combine( + gulp.src('bootstrap/js/*.js'), + uglify(), + gulp.dest('public/bootstrap') + ) + + // any errors in the above streams + // will get caught by this listener, + // instead of being thrown: + combined.on('error', function(err) { + console.warn(err.message) + }) + + return combined +}) +``` + +You can use this technique in your gulp plugins and node modules too using +the [multipipe](http://npmjs.org/package/multipipe) module, and is a generally useful means of ensuring that errors aren't thrown from inaccessible streams +somewhere deep inside `./node_modules`. diff --git a/node_modules/gulp/docs/recipes/mocha-test-runner-with-gulp.md b/node_modules/gulp/docs/recipes/mocha-test-runner-with-gulp.md new file mode 100644 index 00000000..3753070a --- /dev/null +++ b/node_modules/gulp/docs/recipes/mocha-test-runner-with-gulp.md @@ -0,0 +1,69 @@ +# Mocha test-runner with gulp + +### Passing shared module in all tests + +```js +var gulp = require('gulp'); +var mocha = require('gulp-mocha'); + +gulp.task('tests', function() { + return gulp.src(['test/test-*.js'], { read: false }) + .pipe(mocha({ + reporter: 'spec', + globals: { + should: require('should') + } + })); +}); +``` + +### Running mocha tests when files change + +With bundled `gulp.watch` and [`gulp-batch`](https://github.com/floatdrop/gulp-batch) (see readme of gulp-batch for reasons): + +```js +// npm install gulp gulp-watch gulp-mocha gulp-batch + +var gulp = require('gulp'); +var mocha = require('gulp-mocha'); +var batch = require('gulp-batch'); +var gutil = require('gulp-util'); + +gulp.task('mocha', function () { + return gulp.src(['test/*.js'], { read: false }) + .pipe(mocha({ reporter: 'list' })) + .on('error', gutil.log); +}); + +gulp.watch(['lib/**', 'test/**'], batch(function(events, cb) { + gulp.run('mocha', cb); +})); +``` + +With [`gulp-watch`](https://github.com/floatdrop/gulp-watch) plugin: + +```js +// npm i gulp gulp-watch gulp-mocha + +var gulp = require('gulp'); +var mocha = require('gulp-mocha'); +var watch = require('gulp-watch'); +var gutil = require('gulp-util') + +gulp.task('mocha', function () { + return gulp.src(['test/*.js'], { read: false }) + .pipe(mocha({ reporter: 'list' })) + .on('error', gutil.log); +}); + +gulp.task('watch', function() { + return gulp.src(['lib/**', 'test/**'], { read: false }) + .pipe(watch(function(events, cb) { + gulp.run('mocha', cb); + })); +}); + +gulp.task('default', ['mocha', 'watch']); + +// run `gulp watch` or just `gulp` for watching and rerunning tests +``` diff --git a/node_modules/gulp/docs/recipes/only-pass-through-changed-files.md b/node_modules/gulp/docs/recipes/only-pass-through-changed-files.md new file mode 100644 index 00000000..9c6feb1b --- /dev/null +++ b/node_modules/gulp/docs/recipes/only-pass-through-changed-files.md @@ -0,0 +1,27 @@ +# Only pass through changed files + +Files are passed through the whole pipe chain on every run by default. By using [gulp-changed](https://github.com/sindresorhus/gulp-changed) only changed files will be passed through. This can speed up consecutive runs considerably. + + +```js +// run `npm install gulp gulp-changed gulp-jscs gulp-uglify` +var gulp = require('gulp'); +var changed = require('gulp-changed'); +var jscs = require('gulp-jscs'); +var uglify = require('gulp-uglify'); + +// we define some constants here so they can be reused +var SRC = 'src/*.js'; +var DEST = 'dist'; + +gulp.task('default', function () { + return gulp.src(SRC) + // the `changed` task needs to know the destination directory + // upfront to be able to figure out which files changed + .pipe(changed(DEST)) + // only files that has changed will pass through here + .pipe(jscs()) + .pipe(uglify()) + .pipe(gulp.dest(DEST)); +}); +``` diff --git a/node_modules/gulp/docs/recipes/pass-params-from-cli.md b/node_modules/gulp/docs/recipes/pass-params-from-cli.md new file mode 100644 index 00000000..f203469b --- /dev/null +++ b/node_modules/gulp/docs/recipes/pass-params-from-cli.md @@ -0,0 +1,28 @@ +# Pass parameters from the command line +## bonus: keeping those tasks DRY + +--- + +`gulpfile.js` + +```js +// npm install gulp gulp-util gulp-if gulp-uglify +var gulp = require('gulp'); +var gutil = require('gulp-util'); +var gulpif = require('gulp-if'); +var uglify = require('gulp-uglify'); + +var isProduction = gutil.env.type === 'production'; + +gulp.task('scripts', function () { + return gulp.src('**/*.js') + .pipe(gulpif(isProduction, uglify())) // only minify if production + .pipe(gulp.dest('dist')); +}); +``` + +--- + +`cli` + +`gulp scripts --type production` diff --git a/node_modules/gulp/docs/recipes/rebuild-only-files-that-change.md b/node_modules/gulp/docs/recipes/rebuild-only-files-that-change.md new file mode 100644 index 00000000..056c8e39 --- /dev/null +++ b/node_modules/gulp/docs/recipes/rebuild-only-files-that-change.md @@ -0,0 +1,16 @@ +# Rebuild only files that change + +With [`gulp-watch`](https://github.com/floatdrop/gulp-watch): + +```js +var gulp = require('gulp'); +var sass = require('gulp-sass'); +var watch = require('gulp-watch'); + +gulp.task('default', function() { + return gulp.src('./sass/*.scss') + .pipe(watch()) + .pipe(sass()) + .pipe(gulp.dest('./dist/')); +}); +``` diff --git a/node_modules/gulp/docs/recipes/running-tasks-in-series.md b/node_modules/gulp/docs/recipes/running-tasks-in-series.md new file mode 100644 index 00000000..27159ba0 --- /dev/null +++ b/node_modules/gulp/docs/recipes/running-tasks-in-series.md @@ -0,0 +1,34 @@ +# Running tasks in series + +By default, tasks run with maximum concurrency -- e.g. it launches all the tasks at once and waits for nothing. +If you want to create a series where tasks run in a particular order, you need to do two things: + +- give it a hint to tell it when the task is done, +- and give it a hint that a task depends on completion of another. + +For these examples, let's presume you have two tasks, "one" and "two" that you specifically want to run in this order: + +1. In task "one" you add a hint to tell it when the task is done. Either take in a callback and call it when you're +done or return a promise or stream that the engine should wait to resolve or end respectively. + +2. In task "two" you add a hint telling the engine that it depends on completion of the first task. + +So this example would look like this: + +```javascript +var gulp = require('gulp'); + +// takes in a callback so the engine knows when it'll be done +gulp.task('one', function (cb) { + // do stuff -- async or otherwise + cb(err); // if err is not null and not undefined, the orchestration will stop, and 'two' will not run +}); + +// identifies a dependent task must be complete before this one begins +gulp.task('two', ['one'], function () { + // task 'one' is done now +}); + +gulp.task('default', ['one', 'two']); +// alternatively: gulp.task('default', ['two']); +``` diff --git a/node_modules/gulp/docs/recipes/specifying-a-cwd.md b/node_modules/gulp/docs/recipes/specifying-a-cwd.md new file mode 100644 index 00000000..c8268be4 --- /dev/null +++ b/node_modules/gulp/docs/recipes/specifying-a-cwd.md @@ -0,0 +1,37 @@ +# Specifying a new cwd (current working directory) + +This is helpful for projects using a nested directory structure, such as: + +``` +/project + /layer1 + /layer2 +``` + +You can use the gulp CLI option `--cwd` + +From the `project/` directory + +```bash +gulp --cwd ./layer1/ +``` + +Another option is to use `process.chdir` which is just vanilla node. + +`gulpfile.js` + +```js +var gulp = require('gulp'); + +try { + process.chdir(gulp.env.cwd); +} catch (err) { + console.error('Unable to chdir to %s', gulp.env.cwd); +} +``` + +If you only need to specify a cwd for a certain glob, you can use the `cwd` option on a [glob-stream](https://github.com/wearefractal/glob-stream) + +```js +gulp.src('./some/dir/**/*.js', { cwd: './public' }); +``` diff --git a/node_modules/gulp/docs/recipes/using-coffee-script-for-gulpfile.md b/node_modules/gulp/docs/recipes/using-coffee-script-for-gulpfile.md new file mode 100644 index 00000000..86003b85 --- /dev/null +++ b/node_modules/gulp/docs/recipes/using-coffee-script-for-gulpfile.md @@ -0,0 +1,23 @@ +# Using coffee-script for gulpfile + +As discussed in [issue #103](https://github.com/gulpjs/gulp/issues/103), there are 2 ways to do this. + +1. Use `gulp --require coffee-script/register` at the command line + +2. Require in `gulpfile.coffee` after requiring `coffee-script` in `gulpfile.js` + +`gulpfile.js` + +```js +require('coffee-script/register'); +require('./gulpfile.coffee'); +``` + +`gulpfile.coffee` + +```coffeescript +gulp = require 'gulp' + +gulp.task 'default', -> + console.log('default task called') +``` diff --git a/node_modules/gulp/docs/recipes/using-external-config-file.md b/node_modules/gulp/docs/recipes/using-external-config-file.md new file mode 100644 index 00000000..719ae921 --- /dev/null +++ b/node_modules/gulp/docs/recipes/using-external-config-file.md @@ -0,0 +1,49 @@ +# Using external config file +## bonus: keeping those tasks DRY +## bonus2: config.json can be used by another task runner, like `Grunt` + +--- + +`config.json` + +```json +{ + "desktop" : { + "src" : [ + "dev/desktop/js/**/*.js", + "!dev/desktop/js/vendor/**" + ], + "dest" : "build/desktop/js" + }, + "mobile" : { + "src" : [ + "dev/mobile/js/**/*.js", + "!dev/mobile/js/vendor/**" + ], + "dest" : "build/mobile/js" + } +} +``` + +--- + +`gulpfile.js` + +```js +// npm install gulp gulp-uglify +var gulp = require('gulp'); +var uglify = require('gulp-uglify'); +var config = require('./config.json'); + +function doStuff(cfg) { + return gulp.src(cfg.src) + .pipe(uglify()) + .pipe(gulp.dest(cfg.dest)); +} + +gulp.task('dry', function () { + doStuff(config.desktop); + doStuff(config.mobile); +}); +``` + diff --git a/node_modules/gulp/docs/recipes/using-multiple-sources-in-one-task.md b/node_modules/gulp/docs/recipes/using-multiple-sources-in-one-task.md new file mode 100644 index 00000000..21d36ece --- /dev/null +++ b/node_modules/gulp/docs/recipes/using-multiple-sources-in-one-task.md @@ -0,0 +1,17 @@ +# Using multiple sources in one task + +```js +// npm install gulp event-stream + +var gulp = require('gulp'); +var es = require('event-stream'); + +gulp.task('test', function(cb) { + return es.concat( + gulp.src('bootstrap/js/*.js') + .pipe(gulp.dest('public/bootstrap')), + gulp.src('jquery.cookie/jquery.cookie.js') + .pipe(gulp.dest('public/jquery')) + ); +}); +``` diff --git a/node_modules/gulp/docs/writing-a-plugin/README.md b/node_modules/gulp/docs/writing-a-plugin/README.md new file mode 100644 index 00000000..c481277c --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/README.md @@ -0,0 +1,53 @@ +# Writing a plugin + +If you plan to create your own Gulp plugin, you will save time by reading the full documentation. + +* [Guidelines](guidelines.md) (a MUST read) +* [Using buffers](using-buffers.md) +* [Dealing with streams](dealing-with-streams.md) +* [Testing](testing.md) +* [README conventions](readme-conventions.md) + +## What it does + +### Streaming file objects + +A gulp plugin always returns a stream in [object mode](http://nodejs.org/api/stream.html#stream_object_mode) that does the following: + +1. Takes in [vinyl File objects](http://github.com/wearefractal/vinyl) +2. Outputs [vinyl File objects](http://github.com/wearefractal/vinyl) + +These are known as [transform streams](http://nodejs.org/api/stream.html#stream_class_stream_transform_1) (also sometimes called through streams). Transform streams are streams that are readable and writable which manipulate objects as they're being passed through. + +### Modifying file content + +Vinyl files can have 3 possible forms for the contents attribute: + +- [Streams](dealing-with-streams.md) +- [Buffers](using-buffers.md) +- Empty (null) - Useful for things like rimraf, clean, where contents is not neeeded. + +## Useful resources + +* [File object](https://github.com/wearefractal/gulp-util/#new-fileobj) +* [PluginError](https://github.com/gulpjs/gulp-util#new-pluginerrorpluginname-message-options) +* [event-stream](https://github.com/dominictarr/event-stream) +* [BufferStream](https://github.com/nfroidure/BufferStream) +* [gulp-util](https://github.com/wearefractal/gulp-util) + + +## Sample plugins + +* [sindresorhus' gulp plugins](https://github.com/search?q=%40sindresorhus+gulp-) +* [Fractal's gulp plugins](https://github.com/search?q=%40wearefractal+gulp-) +* [gulp-replace](https://github.com/lazd/gulp-replace) + + +## About streams + +If you're unfamiliar with streams, you will need to read up on them: + +* https://github.com/substack/stream-handbook (a MUST read) +* http://nodejs.org/api/stream.html + +Other libraries that are not file manipulating through streams but are made for use with gulp are tagged with the [gulpfriendly](https://npmjs.org/browse/keyword/gulpfriendly) keyword on npm. diff --git a/node_modules/gulp/docs/writing-a-plugin/dealing-with-streams.md b/node_modules/gulp/docs/writing-a-plugin/dealing-with-streams.md new file mode 100644 index 00000000..4ad9d375 --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/dealing-with-streams.md @@ -0,0 +1,83 @@ +# Dealing with streams + +> It is highly recommended to write plugins supporting streams. Here is some information on creating a gulp plugin that supports streams. + +> Make sure to follow the best practice regarging error handling and add the line that make the gulp plugin re-emit the first error catched during the transformation of the content + +[Writing a Plugin](README.md) > Writing stream based plugins + +## Dealing with streams + +Let's implement a plugin prepending some text to files. This plugin supports all possible forms of file.contents. + +```js +var through = require('through2'); +var gutil = require('gulp-util'); +var PluginError = gutil.PluginError; + +// Consts +const PLUGIN_NAME = 'gulp-prefixer'; + +function prefixStream(prefixText) { + var stream = through(); + stream.write(prefixText); + return stream; +} + +// Plugin level function (dealing with files) +function gulpPrefixer(prefixText) { + + if (!prefixText) { + throw PluginError(PLUGIN_NAME, "Missing prefix text!"); + } + prefixText = new Buffer(prefixText); // allocate ahead of time + + // Creating a stream through which each file will pass + var stream = through.obj(function (file, enc, callback) { + if (file.isNull()) { + this.push(file); // Do nothing if no contents + return callback(); + } + + if (file.isBuffer()) { + this.emit('error', new PluginError(PLUGIN_NAME, 'Buffers not supported!')); + return callback(); + } + + if (file.isStream()) { + // define the streamer that will transform the content + var streamer = prefixStream(prefixText); + // catch errors from the streamer and emit a gulp plugin error + streamer.on('error', this.emit.bind(this, 'error')); + // start the transformation + file.contents = file.contents.pipe(streamer); + // make sure the file goes through the next gulp plugin + this.push(file); + // tell the stream engine that we are done with this file + return callback(); + } + }); + + // returning the file stream + return stream; +}; + +// Exporting the plugin main function +module.exports = gulpPrefixer; +``` + +The above plugin can be used like this: + +```js +var gulp = require('gulp'); +var gulpPrefixer = require('gulp-prefixer'); + +gulp.src('files/**/*.js') + .pipe(gulpPrefixer('prepended string')) + .pipe(gulp.dest('/modified-files/')); +``` + +## Some plugins using streams + +* [gulp-svgicons2svgfont](https://github.com/nfroidure/gulp-svgiconstosvgfont) +* gulp-browserify (Soon) diff --git a/node_modules/gulp/docs/writing-a-plugin/guidelines.md b/node_modules/gulp/docs/writing-a-plugin/guidelines.md new file mode 100644 index 00000000..48c478d7 --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/guidelines.md @@ -0,0 +1,97 @@ +# Guidelines + +> While these guidelines are totally optional, we **HIGHLY** recommend that everyone follows them. Nobody wants to use a bad plugin. These guidelines will actually help make your life easier by giving you assurance that your plugin fits well within gulp. + +[Writing a Plugin](README.md) > Guidelines + +1. Your plugin should not do something that can be done easily with an existing node module + - Wrapping every possible thing just for the sake of wrapping it will pollute the ecosystem with low quality plugins that don't make sense +1. Your plugin should only do **one thing**, and do it well. + - Avoid config options that make your plugin do completely different tasks +1. Your plugin shouldn't do things that other plugins are responsible for + - It should not concat, [gulp-concat](https://github.com/wearefractal/gulp-concat) does that + - It should not add headers, [gulp-header](https://github.com/godaddy/gulp-header) does that + - It should not add footers, [gulp-footer](https://github.com/godaddy/gulp-footer) does that + - If it's a common but optional use case, document that your plugin is often used with another plugin + - If it's an internal requirement, make use of existing plugins by piping your plugin's output to them +1. Your plugin **must be tested** + - Testing a gulp plugin is easy, you don't even need gulp to test it + - Look at other plugins for examples +1. Add `gulpplugin` as a keyword in your `package.json` so you show up on our search +1. Do not throw errors inside a stream + - Instead, you should emit it as an **error** event. + - If you encounter an error **outside** the stream, such as invalid configuration, you may throw it. +1. Prefix any errors with the name of your plugin + - For example: `gulp-replace: Cannot do regexp replace on a stream` + - Use gulp-util's [PluginError](https://github.com/gulpjs/gulp-util#new-pluginerrorpluginname-message-options) class to make this easy +1. The type of `file.contents` should always be the same going out as it was when it came in + - If file.contents is null (non-read) just ignore the file and pass it along + - If file.contents is a Stream and you don't support that just emit an error + - If you choose to support file.contents as a Stream, use [BufferStream](https://github.com/nfroidure/BufferStream) to make this easy +1. Do not pass the `file` object downstream until you are done with it +1. Make use of the [gulp-util](https://github.com/gulpjs/gulp-util) library + - It provides templating, CLI colors, logging, changing file extensions + - Try looking for common things there first and add it if it doesn't exist +1. Do NOT require `gulp` as a dependency or peerDependency + - There is no reason you should have to do this and it will cause problems if you do + +## Why are these guidelines so strict? + +gulp aims to be simple for users. By providing strict guidelines we are able to provide a consistent and high-quality ecosystem for everyone. While this does add a little more work and thought for plugin authors, it removes a lot of problems later down the road. + +### What happens if I don't follow them? + +npm is open for everyone, and you are free to make whatever you want but these guidelines were prescribed for a reason. There are acceptances tests coming soon that will be integrated into the plugin search. If you fail to adhere to the plugin guidelines it will be publicly visible/sortable via a scoring system. People will always prefer to use plugins that match "the gulp way". + +### What does a good plugin look like? + +```js +// through2 is a thin wrapper around node transform streams +var through = require('through2'); +var gutil = require('gulp-util'); +var PluginError = gutil.PluginError; + +// Consts +const PLUGIN_NAME = 'gulp-prefixer'; + +function prefixStream(prefixText) { + var stream = through(); + stream.write(prefixText); + return stream; +} + +// Plugin level function (dealing with files) +function gulpPrefixer(prefixText) { + + if (!prefixText) { + throw PluginError(PLUGIN_NAME, "Missing prefix text!"); + } + prefixText = new Buffer(prefixText); // allocate ahead of time + + // Creating a stream through which each file will pass + var stream = through.obj(function (file, enc, callback) { + if (file.isNull()) { + this.push(file); // Do nothing if no contents + return callback(); + } + + if (file.isBuffer()) { + file.contents = Buffer.concat([prefixText, file.contents]); + this.push(file); + return callback(); + } + + if (file.isStream()) { + file.contents = file.contents.pipe(prefixStream(prefixText)); + this.push(file); + return callback(); + } + }); + + // returning the file stream + return stream; +}; + +// Exporting the plugin main function +module.exports = gulpPrefixer; +``` diff --git a/node_modules/gulp/docs/writing-a-plugin/readme-conventions.md b/node_modules/gulp/docs/writing-a-plugin/readme-conventions.md new file mode 100644 index 00000000..c7a56138 --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/readme-conventions.md @@ -0,0 +1,218 @@ +# README conventions + +> Follow README conventions to increase your plugin readability and usability. + +[Writing a Gulp Plugin](README.md) > README conventions + +A plugin README should have the following parts at a minimum: + +1. **Heading**: Give a short introduction to your plugin + * Include the version of gulp your plugin was designed for + * Include any badges on the same line as the heading +1. **Usage**: Include a simple usage example + * Show the plugin used on the context of a `gulpfile.js` + * Cover the most common or simplest use case +1. **API**: Document your plugin's API + * For individual parameters, include: + 1. Parameter name + 1. Type + 1. Default value + 1. Description + 1. Optional example for complex options + * If a parameter accepts an Object, do the above for each property + * If your plugin accepts overloaded arguments, document each style individually + + +# Example: Options object + +The following is an example of a plugin that takes a single options object (from [gulp-handlebars](https://github.com/lazd/gulp-handlebars)). + + +*** + +# gulp-handlebars [![NPM version][handlebars-npm-image]][handlebars-npm-url] [![Build status][handlebars-travis-image]][handlebars-travis-url] +> Handlebars plugin for gulp 3 + +## Usage + +First, install `gulp-handlebars` as a development dependency: + +```shell +npm install --save-dev gulp-handlebars +``` + +Then, add it to your `gulpfile.js`: + +```js +var handlebars = require('gulp-handlebars'); + +gulp.task('templates', function(){ + gulp.src(['client/templates/*.hbs']) + .pipe(handlebars({ + namespace: 'MyApp.templates', + outputType: 'hybrid' + })) + .pipe(concat('templates.js')) + .pipe(gulp.dest('build/js/')); +}); +``` + +## API + +### handlebars(options) + +#### options.namespace +Type: `String` +Default: `templates` + +The namespace in which the precompiled templates will be assigned. Use dot notation (e.g. `App.Templates`) for nested namespaces or false to declare templates in the global namespace. + +#### options.outputType +Type: `String` +Default: `browser` + +The desired output type. One of the following: + +* `browser` - Produce plain JavaScript files for the browser +* `hybrid` - Produce Node modules that can optionally be used on the frontend +* `node` - Produce Node modules +* `amd` - Produce AMD modules +* `commonjs` - Produce CommonJS modules +* `bare` - Return an unmolested function definition + +#### options.declareNamespace +Type: `Boolean` +Default: `true` + +If true, non-destructively declare all parts of the namespace. This option is only necessary when `options.type` is `browser` or `hybrid`. + +For example, if the namespace is `MyApp.Templates` and a template is named `App.Header.hbs`, the following declaration will be present in the output file for that template: + +```js +this["MyApp"] = this["MyApp"] || {}; +this["MyApp"]["templates"] = this["MyApp"]["templates"] || {}; +this["MyApp"]["templates"]["App"] = this["MyApp"]["templates"]["App"] || {}; +this["MyApp"]["templates"]["App"]["Header"] = function () {}; +``` + +When processing multiple templates under a given namespace, this will result in duplicate declarations. That is, the non-destructive declaration of the namespace will be repeated for each template compiled. + +#### options.processName +Type: `Function` +Default: Strip file extension + +This option accepts a function which takes one argument (the template filepath) and returns a string which will be used as the key for the precompiled template object. By default, the filename minus the extension is used. + +If this function returns a string containing periods (not including the file extension), they will be represented as a sub-namespace. See `options.declareNamespace` for an example of the effect. + +#### options.compilerOptions +Type: `Object` + +Compiler options to pass to `Handlebars.precompile()`. + + +[handlebars-travis-url]: http://travis-ci.org/lazd/gulp-handlebars +[handlebars-travis-image]: https://secure.travis-ci.org/lazd/gulp-handlebars.png?branch=master +[handlebars-npm-url]: https://npmjs.org/package/gulp-handlebars +[handlebars-npm-image]: https://badge.fury.io/js/gulp-handlebars.png +*** + + +# Example: Overloaded API + +The following is an example of a plugin that has an overloaded API (from [gulp-csslint](https://github.com/lazd/gulp-csslint)). + + +*** +# gulp-csslint [![NPM version][csslint-npm-image]][csslint-npm-url] [![Build status][csslint-travis-image]][csslint-travis-url] +> CSSLint plugin for gulp 3 + +## Usage + +First, install `gulp-csslint` as a development dependency: + +```shell +npm install --save-dev gulp-csslint +``` + +Then, add it to your `gulpfile.js`: + +```javascript +var csslint = require('gulp-csslint'); + +gulp.task('css', function() { + gulp.src('./client/css/*.css') + .pipe(csslint()) + .pipe(csslint.reporter()); +}); +``` + +## API + +### csslint(ruleConfiguration) + +#### ruleConfiguration +Type: `Object` + +You can pass rule configuration as an object. See the [list of rules by ID on the CSSLint wiki](https://github.com/stubbornella/csslint/wiki/Rules-by-ID) for valid rule IDs. + +```javascript +gulp.src('./client/css/*.css') + .pipe(csslint({ + 'shorthand': false + })) + .pipe(csslint.reporter()); +``` + +### csslint(csslintrc) + +#### csslintrc +Type: `String` + +You can also pass the path to your csslintrc file instead of a rule configuration object. + +```javascript +gulp.src('./client/css/*.css') + .pipe(csslint('csslintrc.json')) + .pipe(csslint.reporter()); +``` + +## Results + +Adds the following properties to the file object: + +```javascript +file.csslint.success = true; // or false +file.csslint.errorCount = 0; // number of errors returned by CSSLint +file.csslint.results = []; // CSSLint errors +file.csslint.opt = {}; // The options you passed to CSSLint +``` + +## Custom Reporters + +Custom reporter functions can be passed as `cssline.reporter(reporterFunc)`. The reporter function will be called for each linted file and passed the file object as described above. + +```javascript +var csslint = require('gulp-csslint'); +var gutil = require('gulp-util'); + +var customReporter = function(file) { + gutil.log(gutil.colors.cyan(file.csslint.errorCount)+' errors in '+gutil.colors.magenta(file.path)); + + file.csslint.results.forEach(function(result) { + gutil.log(result.error.message+' on line '+result.error.line); + }); +}; + +gulp.task('lint', function() { + gulp.files('./lib/*.js') + .pipe(csslint()) + .pipe(csslint.reporter(customReporter)); +}); +``` + +[csslint-travis-url]: http://travis-ci.org/lazd/gulp-csslint +[csslint-travis-image]: https://secure.travis-ci.org/lazd/gulp-csslint.png?branch=master +[csslint-npm-url]: https://npmjs.org/package/gulp-csslint +[csslint-npm-image]: https://badge.fury.io/js/gulp-csslint.png +*** diff --git a/node_modules/gulp/docs/writing-a-plugin/testing.md b/node_modules/gulp/docs/writing-a-plugin/testing.md new file mode 100644 index 00000000..79efe2d9 --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/testing.md @@ -0,0 +1,95 @@ +# Testing + +> Testing your plugin is the only way to ensure quality. It brings confidence to your users and makes your life easier. + +[Writing a Plugin](README.md) > Testing + +## Tooling + +Most plugins use [mocha](https://github.com/visionmedia/mocha) and [event-stream](https://github.com/dominictarr/event-stream) to help them test. The following examples will use these tools. + +## Testing plugins for streaming mode + +```js +var assert = require('assert'); +var es = require('event-stream'); +var gutil = require('gulp-util'); +var prefixer = require('../index'); + +describe('gulp-prefixer', function () { + describe('in streaming mode', function () { + + it('should prepend text', function (done) { + + // create the fake file + var fakeFile = new gutil.File({ + contents: es.readArray(['stream', 'with', 'those', 'contents']) + }); + + // Create a prefixer plugin stream + var myPrefixer = prefixer('prependthis'); + + // write the fake file to it + myPrefixer.write(fakeFile); + + // wait for the file to come back out + myPrefixer.once('data', function (file) { + // make sure it came out the same way it went in + assert(file.isStream()); + + // buffer the contents to make sure it got prepended to + file.contents.pipe(es.wait(function (err, data) { + // check the contents + assert.equal(data, 'prependthistostreamwiththosecontents'); + done(); + })); + }); + + }); + + }); +}); +``` + +## Testing plugins for buffer mode + +```js +var assert = require('assert'); +var es = require('event-stream'); +var gutil = require('gulp-util'); +var prefixer = require('../index'); + +describe('gulp-prefixer', function () { + describe('in buffer mode', function () { + + it('should prepend text', function (done) { + + // create the fake file + var fakeFile = new gutil.File({ + contents: new Buffer('abufferwiththiscontent') + }); + + // Create a prefixer plugin stream + var myPrefixer = prefixer('prependthis'); + + // write the fake file to it + myPrefixer.write(fakeFile); + + // wait for the file to come back out + myPrefixer.once('data', function (file) { + // make sure it came out the same way it went in + assert(file.isBuffer()); + + // check the contents + assert.equal(file.contents.toString('utf8'), 'prependthisabufferwiththiscontent'); + done(); + }); + + }); + + }); +}); +``` + +## Sample tests +* [gulp-cat](https://github.com/ben-eb/gulp-cat/blob/master/test.js) diff --git a/node_modules/gulp/docs/writing-a-plugin/using-buffers.md b/node_modules/gulp/docs/writing-a-plugin/using-buffers.md new file mode 100644 index 00000000..6a01acaa --- /dev/null +++ b/node_modules/gulp/docs/writing-a-plugin/using-buffers.md @@ -0,0 +1,72 @@ +# Using buffers + +> Here is some information on creating gulp plugin that manipulates buffers. + +[Writing a Plugin](README.md) > Using buffers + +## Using buffers +If your plugin is relying on a buffer based library, you will probably choose to base your plugin around file.contents as a buffer. Let's implement a plugin prepending some text to files: + +```js +var through = require('through2'); +var gutil = require('gulp-util'); +var PluginError = gutil.PluginError; + +// Consts +const PLUGIN_NAME = 'gulp-prefixer'; + +// Plugin level function (dealing with files) +function gulpPrefixer(prefixText) { + + if (!prefixText) { + throw new PluginError(PLUGIN_NAME, "Missing prefix text!"); + } + prefixText = new Buffer(prefixText); // allocate ahead of time + + // Creating a stream through which each file will pass + var stream = through.obj(function (file, enc, callback) { + if (file.isNull()) { + this.push(file); // Do nothing if no contents + return callback(); + } + + if (file.isBuffer()) { + file.contents = Buffer.concat([prefixText, file.contents]); + this.push(file); + return callback(); + } + + if (file.isStream()) { + this.emit('error', new PluginError(PLUGIN_NAME, 'Streams are not supported!')); + return callback(); + } + }); + + // returning the file stream + return stream; +}; + +// Exporting the plugin main function +module.exports = gulpPrefixer; +``` +The above plugin can be used like this: + +```js +var gulp = require('gulp'); +var gulpPrefixer = require('gulp-prefixer'); + +gulp.src('files/**/*.js') + .pipe(gulpPrefixer('prepended string')) + .pipe(gulp.dest('/modified-files/')); +``` + +## Handling streams + +Unfortunately, the above plugin will error when using gulp.src in non-buffered (streaming) mode. You should support streams too if possible. See [Dealing with streams](dealing-with-streams.md) for more information. + +## Some plugins based on buffers + +* [gulp-coffee](https://github.com/wearefractal/gulp-coffee) +* [gulp-svgmin](https://github.com/ben-eb/gulp-svgmin) +* [gulp-marked](https://github.com/lmtm/gulp-marked) +* [gulp-svg2ttf](https://github.com/nfroidure/gulp-svg2ttf) diff --git a/node_modules/gulp/gulpfile.js b/node_modules/gulp/gulpfile.js new file mode 100644 index 00000000..25e92b51 --- /dev/null +++ b/node_modules/gulp/gulpfile.js @@ -0,0 +1,27 @@ +'use strict'; + +var gulp = require('./'); +var env = require('gulp-util').env; +var log = require('gulp-util').log; + +var jshint = require('gulp-jshint'); + +var codeFiles = ['**/*.js', '!node_modules/**']; + +gulp.task('lint', function(){ + log('Linting Files'); + return gulp.src(codeFiles) + .pipe(jshint('.jshintrc')) + .pipe(jshint.reporter()); +}); + +gulp.task('watch', function(){ + log('Watching Files'); + gulp.watch(codeFiles, ['lint']); +}); + +gulp.task('default', ['lint', 'watch']); + +var taskToRun = env.dev ? 'default' : 'lint'; + +gulp.start(taskToRun); diff --git a/node_modules/gulp/index.js b/node_modules/gulp/index.js new file mode 100644 index 00000000..50796e5e --- /dev/null +++ b/node_modules/gulp/index.js @@ -0,0 +1,51 @@ +'use strict'; + +var util = require('util'); +var Orchestrator = require('orchestrator'); +var gutil = require('gulp-util'); +var deprecated = require('deprecated'); +var vfs = require('vinyl-fs'); + +function Gulp(){ + Orchestrator.call(this); +} +util.inherits(Gulp, Orchestrator); + +Gulp.prototype.task = Gulp.prototype.add; +Gulp.prototype.run = function(){ + // run() is deprecated as of 3.5 and will be removed in 4.0 + // use task dependencies instead + + // impose our opinion of "default" tasks onto orchestrator + var tasks = arguments.length ? arguments : ['default']; + + this.start.apply(this, tasks); +}; + +Gulp.prototype.src = vfs.src; +Gulp.prototype.dest = vfs.dest; +Gulp.prototype.watch = function (glob, opt, fn) { + if (!fn) { + fn = opt; + opt = null; + } + + // array of tasks given + if (Array.isArray(fn)) { + return vfs.watch(glob, opt, function(){ + this.start.apply(this, fn); + }.bind(this)); + } + + return vfs.watch(glob, opt, fn); +}; + +// let people use this class from our instance +Gulp.prototype.Gulp = Gulp; + +// deprecations +deprecated.field('gulp.env has been deprecated. Use gulp-util.env or your own CLI parser instead.', console.log, Gulp.prototype, 'env', gutil.env); +Gulp.prototype.run = deprecated.method('gulp.run() has been deprecated. Use task dependencies or gulp.watch task triggering instead.', console.log, Gulp.prototype.run); + +var inst = new Gulp(); +module.exports = inst; diff --git a/node_modules/gulp/lib/completion.js b/node_modules/gulp/lib/completion.js new file mode 100644 index 00000000..d8f93317 --- /dev/null +++ b/node_modules/gulp/lib/completion.js @@ -0,0 +1,16 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +module.exports = function(name) { + if (typeof name !== 'string') throw new Error('Missing completion type'); + var file = path.join(__dirname, '../completion', name); + try { + console.log(fs.readFileSync(file, 'utf8')); + process.exit(0); + } catch (err) { + console.log('echo "Specified gulp shell auto-completion rules for \''+name+'\' not found"'); + process.exit(5); + } +}; diff --git a/node_modules/gulp/lib/taskTree.js b/node_modules/gulp/lib/taskTree.js new file mode 100644 index 00000000..f06de7a6 --- /dev/null +++ b/node_modules/gulp/lib/taskTree.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = function(tasks) { + return Object.keys(tasks).reduce(function(prev, task) { + prev.nodes.push({ + label: task, + nodes: tasks[task].dep + }); + return prev; + }, {nodes: []}); +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/.bin/semver b/node_modules/gulp/node_modules/.bin/semver new file mode 120000 index 00000000..317eb293 --- /dev/null +++ b/node_modules/gulp/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver \ No newline at end of file diff --git a/node_modules/gulp/node_modules/archy/.travis.yml b/node_modules/gulp/node_modules/archy/.travis.yml new file mode 100644 index 00000000..f1d0f13c --- /dev/null +++ b/node_modules/gulp/node_modules/archy/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/gulp/node_modules/archy/README.markdown b/node_modules/gulp/node_modules/archy/README.markdown new file mode 100644 index 00000000..deaba0fd --- /dev/null +++ b/node_modules/gulp/node_modules/archy/README.markdown @@ -0,0 +1,92 @@ +archy +===== + +Render nested hierarchies `npm ls` style with unicode pipes. + +[![build status](https://secure.travis-ci.org/substack/node-archy.png)](http://travis-ci.org/substack/node-archy) + +example +======= + +``` js +var archy = require('archy'); +var s = archy({ + label : 'beep', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny' ] + }, + 'human' + ] + }, + 'party\ntime!' + ] + } + ] +}); +console.log(s); +``` + +output + +``` +beep +├── ity +└─┬ boop + ├─┬ o_O + │ ├─┬ oh + │ │ ├── hello + │ │ └── puny + │ └── human + └── party + time! +``` + +methods +======= + +var archy = require('archy') + +archy(obj, prefix='', opts={}) +------------------------------ + +Return a string representation of `obj` with unicode pipe characters like how +`npm ls` looks. + +`obj` should be a tree of nested objects with `'label'` and `'nodes'` fields. +`'label'` is a string of text to display at a node level and `'nodes'` is an +array of the descendents of the current node. + +If a node is a string, that string will be used as the `'label'` and an empty +array of `'nodes'` will be used. + +`prefix` gets prepended to all the lines and is used by the algorithm to +recursively update. + +If `'label'` has newlines they will be indented at the present indentation level +with the current prefix. + +To disable unicode results in favor of all-ansi output set `opts.unicode` to +`false`. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install archy +``` + +license +======= + +MIT/X11 diff --git a/node_modules/gulp/node_modules/archy/examples/beep.js b/node_modules/gulp/node_modules/archy/examples/beep.js new file mode 100644 index 00000000..9c070479 --- /dev/null +++ b/node_modules/gulp/node_modules/archy/examples/beep.js @@ -0,0 +1,24 @@ +var archy = require('../'); +var s = archy({ + label : 'beep', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny' ] + }, + 'human' + ] + }, + 'party\ntime!' + ] + } + ] +}); +console.log(s); diff --git a/node_modules/gulp/node_modules/archy/examples/multi_line.js b/node_modules/gulp/node_modules/archy/examples/multi_line.js new file mode 100644 index 00000000..8afdfada --- /dev/null +++ b/node_modules/gulp/node_modules/archy/examples/multi_line.js @@ -0,0 +1,25 @@ +var archy = require('../'); + +var s = archy({ + label : 'beep\none\ntwo', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O\nwheee', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny\nmeat' ] + }, + 'creature' + ] + }, + 'party\ntime!' + ] + } + ] +}); +console.log(s); diff --git a/node_modules/gulp/node_modules/archy/index.js b/node_modules/gulp/node_modules/archy/index.js new file mode 100644 index 00000000..869d64e6 --- /dev/null +++ b/node_modules/gulp/node_modules/archy/index.js @@ -0,0 +1,35 @@ +module.exports = function archy (obj, prefix, opts) { + if (prefix === undefined) prefix = ''; + if (!opts) opts = {}; + var chr = function (s) { + var chars = { + '│' : '|', + '└' : '`', + '├' : '+', + '─' : '-', + '┬' : '-' + }; + return opts.unicode === false ? chars[s] : s; + }; + + if (typeof obj === 'string') obj = { label : obj }; + + var nodes = obj.nodes || []; + var lines = (obj.label || '').split('\n'); + var splitter = '\n' + prefix + (nodes.length ? chr('│') : ' ') + ' '; + + return prefix + + lines.join(splitter) + '\n' + + nodes.map(function (node, ix) { + var last = ix === nodes.length - 1; + var more = node.nodes && node.nodes.length; + var prefix_ = prefix + (last ? ' ' : chr('│')) + ' '; + + return prefix + + (last ? chr('└') : chr('├')) + chr('─') + + (more ? chr('┬') : chr('─')) + ' ' + + archy(node, prefix_, opts).slice(prefix.length + 2) + ; + }).join('') + ; +}; diff --git a/node_modules/gulp/node_modules/archy/package.json b/node_modules/gulp/node_modules/archy/package.json new file mode 100644 index 00000000..5d2f4616 --- /dev/null +++ b/node_modules/gulp/node_modules/archy/package.json @@ -0,0 +1,49 @@ +{ + "name": "archy", + "version": "0.0.2", + "description": "render nested hierarchies `npm ls` style with unicode pipes", + "main": "index.js", + "directories": { + "lib": ".", + "example": "example", + "test": "test" + }, + "devDependencies": { + "tap": "~0.2.3" + }, + "scripts": { + "test": "tap test" + }, + "repository": { + "type": "git", + "url": "http://github.com/substack/node-archy.git" + }, + "keywords": [ + "hierarchy", + "npm ls", + "unicode", + "pretty", + "print" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT/X11", + "engine": { + "node": ">=0.4" + }, + "readme": "archy\n=====\n\nRender nested hierarchies `npm ls` style with unicode pipes.\n\n[![build status](https://secure.travis-ci.org/substack/node-archy.png)](http://travis-ci.org/substack/node-archy)\n\nexample\n=======\n\n``` js\nvar archy = require('archy');\nvar s = archy({\n label : 'beep',\n nodes : [\n 'ity',\n {\n label : 'boop',\n nodes : [\n {\n label : 'o_O',\n nodes : [\n {\n label : 'oh',\n nodes : [ 'hello', 'puny' ]\n },\n 'human'\n ]\n },\n 'party\\ntime!'\n ]\n }\n ]\n});\nconsole.log(s);\n```\n\noutput\n\n```\nbeep\n├── ity\n└─┬ boop\n ├─┬ o_O\n │ ├─┬ oh\n │ │ ├── hello\n │ │ └── puny\n │ └── human\n └── party\n time!\n```\n\nmethods\n=======\n\nvar archy = require('archy')\n\narchy(obj, prefix='', opts={})\n------------------------------\n\nReturn a string representation of `obj` with unicode pipe characters like how\n`npm ls` looks.\n\n`obj` should be a tree of nested objects with `'label'` and `'nodes'` fields.\n`'label'` is a string of text to display at a node level and `'nodes'` is an\narray of the descendents of the current node.\n\nIf a node is a string, that string will be used as the `'label'` and an empty\narray of `'nodes'` will be used.\n\n`prefix` gets prepended to all the lines and is used by the algorithm to\nrecursively update.\n\nIf `'label'` has newlines they will be indented at the present indentation level\nwith the current prefix.\n\nTo disable unicode results in favor of all-ansi output set `opts.unicode` to\n`false`.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install archy\n```\n\nlicense\n=======\n\nMIT/X11\n", + "readmeFilename": "README.markdown", + "bugs": { + "url": "https://github.com/substack/node-archy/issues" + }, + "homepage": "https://github.com/substack/node-archy", + "_id": "archy@0.0.2", + "dist": { + "shasum": "309338c61a5ef6d8249e772a14bfea549b8382dc" + }, + "_from": "archy@~0.0.2", + "_resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" +} diff --git a/node_modules/gulp/node_modules/archy/test/beep.js b/node_modules/gulp/node_modules/archy/test/beep.js new file mode 100644 index 00000000..b978c758 --- /dev/null +++ b/node_modules/gulp/node_modules/archy/test/beep.js @@ -0,0 +1,40 @@ +var test = require('tap').test; +var archy = require('../'); + +test('beep', function (t) { + var s = archy({ + label : 'beep', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny' ] + }, + 'human' + ] + }, + 'party!' + ] + } + ] + }); + t.equal(s, [ + 'beep', + '├── ity', + '└─┬ boop', + ' ├─┬ o_O', + ' │ ├─┬ oh', + ' │ │ ├── hello', + ' │ │ └── puny', + ' │ └── human', + ' └── party!', + '' + ].join('\n')); + t.end(); +}); diff --git a/node_modules/gulp/node_modules/archy/test/multi_line.js b/node_modules/gulp/node_modules/archy/test/multi_line.js new file mode 100644 index 00000000..737cb654 --- /dev/null +++ b/node_modules/gulp/node_modules/archy/test/multi_line.js @@ -0,0 +1,45 @@ +var test = require('tap').test; +var archy = require('../'); + +test('multi-line', function (t) { + var s = archy({ + label : 'beep\none\ntwo', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O\nwheee', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny\nmeat' ] + }, + 'creature' + ] + }, + 'party\ntime!' + ] + } + ] + }); + t.equal(s, [ + 'beep', + '│ one', + '│ two', + '├── ity', + '└─┬ boop', + ' ├─┬ o_O', + ' │ │ wheee', + ' │ ├─┬ oh', + ' │ │ ├── hello', + ' │ │ └── puny', + ' │ │ meat', + ' │ └── creature', + ' └── party', + ' time!', + '' + ].join('\n')); + t.end(); +}); diff --git a/node_modules/gulp/node_modules/archy/test/non_unicode.js b/node_modules/gulp/node_modules/archy/test/non_unicode.js new file mode 100644 index 00000000..2f7cdafd --- /dev/null +++ b/node_modules/gulp/node_modules/archy/test/non_unicode.js @@ -0,0 +1,40 @@ +var test = require('tap').test; +var archy = require('../'); + +test('beep', function (t) { + var s = archy({ + label : 'beep', + nodes : [ + 'ity', + { + label : 'boop', + nodes : [ + { + label : 'o_O', + nodes : [ + { + label : 'oh', + nodes : [ 'hello', 'puny' ] + }, + 'human' + ] + }, + 'party!' + ] + } + ] + }, '', { unicode : false }); + t.equal(s, [ + 'beep', + '+-- ity', + '`-- boop', + ' +-- o_O', + ' | +-- oh', + ' | | +-- hello', + ' | | `-- puny', + ' | `-- human', + ' `-- party!', + '' + ].join('\n')); + t.end(); +}); diff --git a/node_modules/gulp/node_modules/deprecated/.npmignore b/node_modules/gulp/node_modules/deprecated/.npmignore new file mode 100644 index 00000000..b5ef13a3 --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/.npmignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +node_modules +build +*.node +components \ No newline at end of file diff --git a/node_modules/gulp/node_modules/deprecated/.travis.yml b/node_modules/gulp/node_modules/deprecated/.travis.yml new file mode 100644 index 00000000..33ad9f8c --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.9" + - "0.10" +after_script: + - npm run coveralls \ No newline at end of file diff --git a/node_modules/gulp/node_modules/deprecated/LICENSE b/node_modules/gulp/node_modules/deprecated/LICENSE new file mode 100755 index 00000000..7cbe012c --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Fractal + +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/gulp/node_modules/deprecated/README.md b/node_modules/gulp/node_modules/deprecated/README.md new file mode 100644 index 00000000..493e6ea5 --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/README.md @@ -0,0 +1,51 @@ +# deprecated [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][david-image]][david-url] + + +## Information + + + + + + + + + + + + + +
      Packagedeprecated
      DescriptionTool for deprecating things
      Node Version>= 0.9
      + +## Usage + +```javascript +var oldfn = function(a,b) { + return a+b; +}; + +// returns a new wrapper function that logs the deprecated function once +var somefn = deprecated('dont use this anymore', console.log, oldfn); + +var someobj = {}; + +// set up a getter/set for field that logs deprecated message once +deprecated('dont use this anymore', console.log, someobj, 'a', 123); + +console.log(someobj.a); // 123 +``` + +[npm-url]: https://npmjs.org/package/deprecated +[npm-image]: https://badge.fury.io/js/deprecated.png + +[travis-url]: https://travis-ci.org/wearefractal/deprecated +[travis-image]: https://travis-ci.org/wearefractal/deprecated.png?branch=master + +[coveralls-url]: https://coveralls.io/r/wearefractal/deprecated +[coveralls-image]: https://coveralls.io/repos/wearefractal/deprecated/badge.png + +[depstat-url]: https://david-dm.org/wearefractal/deprecated +[depstat-image]: https://david-dm.org/wearefractal/deprecated.png + +[david-url]: https://david-dm.org/wearefractal/deprecated +[david-image]: https://david-dm.org/wearefractal/deprecated.png?theme=shields.io \ No newline at end of file diff --git a/node_modules/gulp/node_modules/deprecated/index.js b/node_modules/gulp/node_modules/deprecated/index.js new file mode 100644 index 00000000..f689e9cd --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/index.js @@ -0,0 +1,39 @@ +var deprecated = { + method: function(msg, log, fn) { + var called = false; + return function(){ + if (!called) { + called = true; + log(msg); + } + return fn.apply(this, arguments); + }; + }, + + field: function(msg, log, parent, field, val) { + var called = false; + var getter = function(){ + if (!called) { + called = true; + log(msg); + } + return val; + }; + var setter = function(v) { + if (!called) { + called = true; + log(msg); + } + val = v; + return v; + }; + Object.defineProperty(parent, field, { + get: getter, + set: setter, + enumerable: true + }); + return; + } +}; + +module.exports = deprecated; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/deprecated/package.json b/node_modules/gulp/node_modules/deprecated/package.json new file mode 100644 index 00000000..b0781712 --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/package.json @@ -0,0 +1,50 @@ +{ + "name": "deprecated", + "description": "Tool for deprecating things", + "version": "0.0.1", + "homepage": "http://github.com/wearefractal/deprecated", + "repository": { + "type": "git", + "url": "git://github.com/wearefractal/deprecated.git" + }, + "author": { + "name": "Fractal", + "email": "contact@wearefractal.com", + "url": "http://wearefractal.com/" + }, + "main": "./index.js", + "dependencies": {}, + "devDependencies": { + "mocha": "~1.17.0", + "should": "~3.1.0", + "mocha-lcov-reporter": "~0.0.1", + "coveralls": "~2.6.1", + "istanbul": "~0.2.3", + "rimraf": "~2.2.5", + "jshint": "~2.4.1" + }, + "scripts": { + "test": "mocha --reporter spec && jshint", + "coveralls": "istanbul cover _mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage" + }, + "engines": { + "node": ">= 0.9" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/wearefractal/deprecated/raw/master/LICENSE" + } + ], + "readme": "# deprecated [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][david-image]][david-url]\n\n\n## Information\n\n\n \n\n\n\n\n\n\n\n\n\n\n
      Packagedeprecated
      DescriptionTool for deprecating things
      Node Version>= 0.9
      \n\n## Usage\n\n```javascript\nvar oldfn = function(a,b) {\n return a+b;\n};\n\n// returns a new wrapper function that logs the deprecated function once\nvar somefn = deprecated('dont use this anymore', console.log, oldfn);\n\nvar someobj = {};\n\n// set up a getter/set for field that logs deprecated message once\ndeprecated('dont use this anymore', console.log, someobj, 'a', 123);\n\nconsole.log(someobj.a); // 123\n```\n\n[npm-url]: https://npmjs.org/package/deprecated\n[npm-image]: https://badge.fury.io/js/deprecated.png\n\n[travis-url]: https://travis-ci.org/wearefractal/deprecated\n[travis-image]: https://travis-ci.org/wearefractal/deprecated.png?branch=master\n\n[coveralls-url]: https://coveralls.io/r/wearefractal/deprecated\n[coveralls-image]: https://coveralls.io/repos/wearefractal/deprecated/badge.png\n\n[depstat-url]: https://david-dm.org/wearefractal/deprecated\n[depstat-image]: https://david-dm.org/wearefractal/deprecated.png\n\n[david-url]: https://david-dm.org/wearefractal/deprecated\n[david-image]: https://david-dm.org/wearefractal/deprecated.png?theme=shields.io", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/wearefractal/deprecated/issues" + }, + "_id": "deprecated@0.0.1", + "dist": { + "shasum": "f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + }, + "_from": "deprecated@~0.0.1", + "_resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz" +} diff --git a/node_modules/gulp/node_modules/deprecated/test/field.js b/node_modules/gulp/node_modules/deprecated/test/field.js new file mode 100644 index 00000000..91a7029c --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/test/field.js @@ -0,0 +1,44 @@ +var deprecated = require('../'); +var should = require('should'); +require('mocha'); + +describe('field()', function() { + it('should return a wrapped function that logs once on get', function(done) { + var message = 'testing'; + var scope = { + a: 1 + }; + var obj = {}; + var logged = false; + var log = function(msg){ + msg.should.equal(message); + logged.should.equal(false); + logged = true; + }; + deprecated.field(message, log, obj, 'a', 123); + + obj.a.should.equal(123); + obj.a = 1234; + obj.a.should.equal(1234); + logged.should.equal(true); + done(); + }); + it('should return a wrapped function that logs once on set', function(done) { + var message = 'testing'; + var scope = { + a: 1 + }; + var obj = {}; + var logged = false; + var log = function(msg){ + msg.should.equal(message); + logged.should.equal(false); + logged = true; + }; + deprecated.field(message, log, obj, 'a', 123); + + obj.a = 1234; + logged.should.equal(true); + done(); + }); +}); \ No newline at end of file diff --git a/node_modules/gulp/node_modules/deprecated/test/method.js b/node_modules/gulp/node_modules/deprecated/test/method.js new file mode 100644 index 00000000..615ba945 --- /dev/null +++ b/node_modules/gulp/node_modules/deprecated/test/method.js @@ -0,0 +1,32 @@ +var deprecated = require('../'); +var should = require('should'); +require('mocha'); + +describe('method()', function() { + it('should return a wrapped function that logs once', function(done) { + var message = 'testing'; + var scope = { + a: 1 + }; + var logged = false; + var log = function(msg){ + msg.should.equal(message); + logged.should.equal(false); + logged = true; + }; + var fn = deprecated.method(message, log, function(one, two){ + this.should.equal(scope); + one.should.equal(1); + two.should.equal(2); + return one+two; + }); + + fn.bind(scope)(1,2).should.equal(3); + fn.bind(scope)(1,2).should.equal(3); + fn.bind(scope)(1,2).should.equal(3); + fn.bind(scope)(1,2).should.equal(3); + + logged.should.equal(true); + done(); + }); +}); \ No newline at end of file diff --git a/node_modules/gulp/node_modules/findup-sync/.jshintrc b/node_modules/gulp/node_modules/findup-sync/.jshintrc new file mode 100644 index 00000000..6d171b89 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/.jshintrc @@ -0,0 +1,16 @@ +{ + "loopfunc": true, + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "unused": true, + "boss": true, + "eqnull": true, + "node": true, + "es5": true +} diff --git a/node_modules/gulp/node_modules/findup-sync/.npmignore b/node_modules/gulp/node_modules/findup-sync/.npmignore new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/gulp/node_modules/findup-sync/Gruntfile.js b/node_modules/gulp/node_modules/findup-sync/Gruntfile.js new file mode 100644 index 00000000..2f964a5b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/Gruntfile.js @@ -0,0 +1,25 @@ +'use strict'; + +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + nodeunit: { + files: ['test/**/*_test.js'], + }, + jshint: { + options: { + jshintrc: '.jshintrc' + }, + all: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js'] + } + }); + + // Load plugins. + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-nodeunit'); + + // Default task. + grunt.registerTask('default', ['jshint', 'nodeunit']); + +}; diff --git a/node_modules/gulp/node_modules/findup-sync/LICENSE-MIT b/node_modules/gulp/node_modules/findup-sync/LICENSE-MIT new file mode 100644 index 00000000..bb2aad6d --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2013 "Cowboy" Ben Alman + +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/gulp/node_modules/findup-sync/README.md b/node_modules/gulp/node_modules/findup-sync/README.md new file mode 100644 index 00000000..3b08b4e0 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/README.md @@ -0,0 +1,44 @@ +# findup-sync + +Find the first file matching a given pattern in the current directory or the nearest ancestor directory. + +## Getting Started +Install the module with: `npm install findup-sync` + +```js +var findup = require('findup-sync'); + +// Start looking in the CWD. +var filepath1 = findup('{a,b}*.txt'); + +// Start looking somewhere else, and ignore case (probably a good idea). +var filepath2 = findup('{a,b}*.txt', {cwd: '/some/path', nocase: true}); +``` + +## Usage + +```js +findup(patternOrPatterns [, minimatchOptions]) +``` + +### patternOrPatterns +Type: `String` or `Array` +Default: none + +One or more wildcard glob patterns. Or just filenames. + +### minimatchOptions +Type: `Object` +Default: `{}` + +Options to be passed to [minimatch](https://github.com/isaacs/minimatch). + +Note that if you want to start in a different directory than the current working directory, specify a `cwd` property here. + +## Contributing +In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/). + +## Release History +2013-03-08 - v0.1.2 - Updated dependencies. Fixed a Node 0.9.x bug. Updated unit tests to work cross-platform. +2012-11-15 - v0.1.1 - Now works without an options object. +2012-11-01 - v0.1.0 - Initial release. diff --git a/node_modules/gulp/node_modules/findup-sync/lib/findup-sync.js b/node_modules/gulp/node_modules/findup-sync/lib/findup-sync.js new file mode 100644 index 00000000..742a4781 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/lib/findup-sync.js @@ -0,0 +1,46 @@ +/* + * findup-sync + * https://github.com/cowboy/node-findup-sync + * + * Copyright (c) 2013 "Cowboy" Ben Alman + * Licensed under the MIT license. + */ + +'use strict'; + +// Nodejs libs. +var path = require('path'); + +// External libs. +var glob = require('glob'); +var _ = require('lodash'); + +// Search for a filename in the given directory or all parent directories. +module.exports = function(patterns, options) { + // Normalize patterns to an array. + if (!Array.isArray(patterns)) { patterns = [patterns]; } + // Create globOptions so that it can be modified without mutating the + // original object. + var globOptions = Object.create(options || {}); + globOptions.maxDepth = 1; + globOptions.cwd = path.resolve(globOptions.cwd || '.'); + + var files, lastpath; + do { + // Search for files matching patterns. + files = _(patterns).map(function(pattern) { + return glob.sync(pattern, globOptions); + }).flatten().uniq().value(); + // Return file if found. + if (files.length > 0) { + return path.resolve(path.join(globOptions.cwd, files[0])); + } + // Go up a directory. + lastpath = globOptions.cwd; + globOptions.cwd = path.resolve(globOptions.cwd, '..'); + // If parentpath is the same as basedir, we can't go any higher. + } while (globOptions.cwd !== lastpath); + + // No files were found! + return null; +}; diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.npmignore b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.npmignore new file mode 100644 index 00000000..2af4b71c --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.npmignore @@ -0,0 +1,2 @@ +.*.swp +test/a/ diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.travis.yml b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.travis.yml new file mode 100644 index 00000000..baa0031d --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.8 diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/LICENSE b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/README.md new file mode 100644 index 00000000..6e27df62 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/README.md @@ -0,0 +1,233 @@ +# Glob + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +## Attention: node-glob users! + +The API has changed dramatically between 2.x and 3.x. This library is +now 100% JavaScript, and the integer flags have been replaced with an +options object. + +Also, there's an event emitter class, proper tests, and all the other +things you've come to expect from node modules. + +And best of all, no compilation! + +## Usage + +```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. +}) +``` + +## Features + +Please see the [minimatch +documentation](https://github.com/isaacs/minimatch) for more details. + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options] + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instanting 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} 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. +* `error` The error encountered. When an error is encountered, the + glob object is in an undefined state, and should be discarded. +* `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. + +### 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 matched. +* `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 + +* `abort` Stop the search. + +### 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. + +* `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.) +* `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. It will cause + ELOOP to be triggered one level sooner in the case of cyclical + symbolic links. +* `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. +* `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.) +* `sync` Perform a synchronous glob search. +* `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). +* `nocase` Perform a case-insensitive match. Note that case-insensitive + filesystems will sometimes result in glob returning results that are + case-insensitively matched anyway, since readdir and stat will not + raise an error. +* `debug` Set to enable debug logging in minimatch and glob. +* `globDebug` Set to enable debug logging in glob, but not minimatch. + +## 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. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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 this is different from the way that `**` is +handled by ruby's `Dir` class.** + +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. + +## 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 statCache object is 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. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/g.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/g.js new file mode 100644 index 00000000..be122df0 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/g.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "test/a/**/[cg]/../[cg]" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/usr-local.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/usr-local.js new file mode 100644 index 00000000..327a425e --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/examples/usr-local.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "{./*/*,/*,/usr/local/*}" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/glob.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/glob.js new file mode 100644 index 00000000..891c8836 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/glob.js @@ -0,0 +1,643 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern) +// 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. +// readdir(PREFIX) as ENTRIES +// If fails, END +// 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 .. $]) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $]) +// +// 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("graceful-fs") +, minimatch = require("minimatch") +, Minimatch = minimatch.Minimatch +, inherits = require("inherits") +, EE = require("events").EventEmitter +, path = require("path") +, isDir = {} +, assert = require("assert").ok + +function glob (pattern, options, cb) { + if (typeof options === "function") cb = options, options = {} + if (!options) options = {} + + if (typeof options === "number") { + deprecated() + return + } + + var g = new Glob(pattern, options, cb) + return g.sync ? g.found : g +} + +glob.fnmatch = deprecated + +function deprecated () { + throw new Error("glob's interface has changed. Please see the docs.") +} + +glob.sync = globSync +function globSync (pattern, options) { + if (typeof options === "number") { + deprecated() + return + } + + options = options || {} + options.sync = true + return glob(pattern, options) +} + + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (!(this instanceof Glob)) { + return new Glob(pattern, options, cb) + } + + if (typeof cb === "function") { + this.on("error", cb) + this.on("end", function (matches) { + cb(null, matches) + }) + } + + options = options || {} + + this.EOF = {} + this._emitQueue = [] + + this.maxDepth = options.maxDepth || 1000 + this.maxLength = options.maxLength || Infinity + this.statCache = options.statCache || {} + + this.changedCwd = false + var cwd = process.cwd() + if (!options.hasOwnProperty("cwd")) this.cwd = cwd + else { + this.cwd = options.cwd + this.changedCwd = path.resolve(options.cwd) !== cwd + } + + this.root = options.root || path.resolve(this.cwd, "/") + this.root = path.resolve(this.root) + if (process.platform === "win32") + this.root = this.root.replace(/\\/g, "/") + + this.nomount = !!options.nomount + + if (!pattern) { + throw new Error("must provide pattern") + } + + // 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 + } + + this.strict = options.strict !== false + this.dot = !!options.dot + this.mark = !!options.mark + this.sync = !!options.sync + this.nounique = !!options.nounique + this.nonull = !!options.nonull + this.nosort = !!options.nosort + this.nocase = !!options.nocase + this.stat = !!options.stat + + this.debug = !!options.debug || !!options.globDebug + if (this.debug) + this.log = console.error + + this.silent = !!options.silent + + var mm = this.minimatch = new Minimatch(pattern, options) + this.options = mm.options + pattern = this.pattern = mm.pattern + + this.error = null + this.aborted = false + + EE.call(this) + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: 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) + + this.minimatch.set.forEach(iterator.bind(this)) + function iterator (pattern, i, set) { + this._process(pattern, 0, i, function (er) { + if (er) this.emit("error", er) + if (-- n <= 0) this._finish() + }) + } +} + +Glob.prototype.log = function () {} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + + var nou = this.nounique + , all = nou ? [] : {} + + for (var i = 0, l = this.matches.length; i < l; i ++) { + var matches = this.matches[i] + this.log("matches[%d] =", i, matches) + // do like the shell, and spit out the literal glob + if (!matches) { + if (this.nonull) { + var literal = this.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 (!this.nosort) { + all = all.sort(this.nocase ? alphasorti : alphasort) + } + + if (this.mark) { + // at *some* point we statted all of these + all = all.map(function (m) { + var sc = this.statCache[m] + if (!sc) + return m + var isDir = (Array.isArray(sc) || sc === 2) + if (isDir && m.slice(-1) !== "/") { + return m + "/" + } + if (!isDir && m.slice(-1) === "/") { + return m.replace(/\/+$/, "") + } + return m + }, this) + } + + this.log("emitting end", all) + + this.EOF = this.found = all + this.emitMatch(this.EOF) +} + +function alphasorti (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return alphasort(a, b) +} + +function alphasort (a, b) { + return a > b ? 1 : a < b ? -1 : 0 +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit("abort") +} + +Glob.prototype.pause = function () { + if (this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = true + this.emit("pause") +} + +Glob.prototype.resume = function () { + if (!this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = false + this.emit("resume") + this._processEmitQueue() + //process.nextTick(this.emit.bind(this, "resume")) +} + +Glob.prototype.emitMatch = function (m) { + this._emitQueue.push(m) + this._processEmitQueue() +} + +Glob.prototype._processEmitQueue = function (m) { + while (!this._processingEmitQueue && + !this.paused) { + this._processingEmitQueue = true + var m = this._emitQueue.shift() + if (!m) { + this._processingEmitQueue = false + break + } + + this.log('emit!', m === this.EOF ? "end" : "match") + + this.emit(m === this.EOF ? "end" : "match", m) + this._processingEmitQueue = false + } +} + +Glob.prototype._process = function (pattern, depth, index, cb_) { + assert(this instanceof Glob) + + var cb = function cb (er, res) { + assert(this instanceof Glob) + if (this.paused) { + if (!this._processQueue) { + this._processQueue = [] + this.once("resume", function () { + var q = this._processQueue + this._processQueue = null + q.forEach(function (cb) { cb() }) + }) + } + this._processQueue.push(cb_.bind(this, er, res)) + } else { + cb_.call(this, er, res) + } + }.bind(this) + + if (this.aborted) return cb() + + if (depth > this.maxDepth) return cb() + + // 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: + prefix = pattern.join("/") + this._stat(prefix, function (exists, isDir) { + // either it's there, or it isn't. + // nothing more to do, either way. + if (exists) { + if (prefix && isAbsolute(prefix) && !this.nomount) { + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + } + } + + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][prefix] = true + this.emitMatch(prefix) + } + return 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) + prefix = prefix.join("/") + break + } + + // get the list of entries. + var read + if (prefix === null) read = "." + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) { + prefix = path.join("/", prefix) + } + read = prefix = path.resolve(prefix) + + // if (process.platform === "win32") + // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/") + + this.log('absolute: ', prefix, this.root, pattern, read) + } else { + read = prefix + } + + this.log('readdir(%j)', read, this.cwd, this.root) + + return this._readdir(read, function (er, entries) { + if (er) { + // not a directory! + // this means that, whatever else comes after this, it can never match + return cb() + } + + // globstar is special + if (pattern[n] === minimatch.GLOBSTAR) { + // test without the globstar, and with every child both below + // and replacing the globstar. + var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ] + entries.forEach(function (e) { + if (e.charAt(0) === "." && !this.dot) return + // instead of the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))) + // below the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n))) + }, this) + + // now asyncForEach over this + var l = s.length + , errState = null + s.forEach(function (gsPattern) { + this._process(gsPattern, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l <= 0) return cb() + }) + }, this) + + return + } + + // not a globstar + // 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 = pattern[n] + if (typeof pn === "string") { + var found = entries.indexOf(pn) !== -1 + entries = found ? entries[pn] : [] + } else { + var rawGlob = pattern[n]._glob + , dotOk = this.dot || rawGlob.charAt(0) === "." + + entries = entries.filter(function (e) { + return (e.charAt(0) !== "." || dotOk) && + (typeof pattern[n] === "string" && e === pattern[n] || + e.match(pattern[n])) + }) + } + + // If n === pattern.length - 1, then there's no need for the extra stat + // *unless* the user has specified "mark" or "stat" explicitly. + // We know that they exist, since the readdir returned them. + if (n === pattern.length - 1 && + !this.mark && + !this.stat) { + entries.forEach(function (e) { + if (prefix) { + if (prefix !== "/") e = prefix + "/" + e + else e = prefix + e + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e) + } + + if (process.platform === "win32") + e = e.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][e] = true + this.emitMatch(e) + }, this) + return cb.call(this) + } + + + // now test all the remaining entries as stand-ins for that part + // of the pattern. + var l = entries.length + , errState = null + if (l === 0) return cb() // no matches possible + entries.forEach(function (e) { + var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)) + this._process(p, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l === 0) return cb.call(this) + }) + }, this) + }) + +} + +Glob.prototype._stat = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + this.log('stat', [this.cwd, f, '=', abs]) + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterStat(f, abs, cb, er) + } + + if (this.statCache.hasOwnProperty(f)) { + var exists = this.statCache[f] + , isDir = exists && (Array.isArray(exists) || exists === 2) + if (this.sync) return cb.call(this, !!exists, isDir) + return process.nextTick(cb.bind(this, !!exists, isDir)) + } + + if (this.sync) { + var er, stat + try { + stat = fs.statSync(abs) + } catch (e) { + er = e + } + this._afterStat(f, abs, cb, er, stat) + } else { + fs.stat(abs, this._afterStat.bind(this, f, abs, cb)) + } +} + +Glob.prototype._afterStat = function (f, abs, cb, er, stat) { + var exists + assert(this instanceof Glob) + + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) { + this.log("should be ENOTDIR, fake it") + + er = new Error("ENOTDIR, not a directory '" + abs + "'") + er.path = abs + er.code = "ENOTDIR" + stat = null + } + + if (er || !stat) { + exists = false + } else { + exists = stat.isDirectory() ? 2 : 1 + } + this.statCache[f] = this.statCache[f] || exists + cb.call(this, !!exists, exists === 2) +} + +Glob.prototype._readdir = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (isAbsolute(f)) { + abs = f + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + + this.log('readdir', [this.cwd, f, abs]) + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterReaddir(f, abs, cb, er) + } + + if (this.statCache.hasOwnProperty(f)) { + var c = this.statCache[f] + if (Array.isArray(c)) { + if (this.sync) return cb.call(this, null, c) + return process.nextTick(cb.bind(this, null, c)) + } + + if (!c || c === 1) { + // either ENOENT or ENOTDIR + var code = c ? "ENOTDIR" : "ENOENT" + , er = new Error((c ? "Not a directory" : "Not found") + ": " + f) + er.path = f + er.code = code + this.log(f, er) + if (this.sync) return cb.call(this, er) + return process.nextTick(cb.bind(this, er)) + } + + // at this point, c === 2, meaning it's a dir, but we haven't + // had to read it yet, or c === true, meaning it's *something* + // but we don't have any idea what. Need to read it, either way. + } + + if (this.sync) { + var er, entries + try { + entries = fs.readdirSync(abs) + } catch (e) { + er = e + } + return this._afterReaddir(f, abs, cb, er, entries) + } + + fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb)) +} + +Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) { + assert(this instanceof Glob) + if (entries && !er) { + this.statCache[f] = entries + // if we haven't asked to stat everything for suresies, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. This also gets us one step + // further into ELOOP territory. + if (!this.mark && !this.stat) { + entries.forEach(function (e) { + if (f === "/") e = f + e + else e = f + "/" + e + this.statCache[e] = true + }, this) + } + + return cb.call(this, er, entries) + } + + // now handle errors, and cache the information + if (er) switch (er.code) { + case "ENOTDIR": // totally normal. means it *does* exist. + this.statCache[f] = 1 + return cb.call(this, er) + case "ENOENT": // not terribly unusual + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.statCache[f] = false + return cb.call(this, er) + default: // some unusual error. Treat as failure. + this.statCache[f] = false + if (this.strict) this.emit("error", er) + if (!this.silent) console.error("glob error", er) + return cb.call(this, er) + } +} + +var isAbsolute = process.platform === "win32" ? absWin : absUnix + +function absWin (p) { + if (absUnix(p)) return true + // pull off the device/UNC bit from a windows path. + // from node's lib/path.js + var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ + , result = splitDeviceRe.exec(p) + , device = result[1] || '' + , isUnc = device && device.charAt(1) !== ':' + , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute + + return isAbsolute +} + +function absUnix (p) { + return p.charAt(0) === "/" || p === "" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/.npmignore b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/.npmignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/LICENSE b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/README.md new file mode 100644 index 00000000..01af3d6b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/README.md @@ -0,0 +1,33 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over fs module + +graceful-fs: + +* keeps track of how many file descriptors are open, and by default + limits this to 1024. Any further requests to open a file are put in a + queue until new slots become available. If 1024 turns out to be too + much, it decreases the limit further. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. + +## Configuration + +The maximum number of open file descriptors that graceful-fs manages may +be adjusted by setting `fs.MAX_OPEN` to a different number. The default +is 1024. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/graceful-fs.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 00000000..ca911524 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,442 @@ +// this keeps a queue of opened file descriptors, and will make +// fs operations wait until some have closed before trying to open more. + +var fs = exports = module.exports = {} +fs._originalFs = require("fs") + +Object.getOwnPropertyNames(fs._originalFs).forEach(function(prop) { + var desc = Object.getOwnPropertyDescriptor(fs._originalFs, prop) + Object.defineProperty(fs, prop, desc) +}) + +var queue = [] + , constants = require("constants") + +fs._curOpen = 0 + +fs.MIN_MAX_OPEN = 64 +fs.MAX_OPEN = 1024 + +// prevent EMFILE errors +function OpenReq (path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb +} + +function noop () {} + +fs.open = gracefulOpen + +function gracefulOpen (path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new OpenReq(path, flags, mode, cb)) + setTimeout(flush) + return + } + open(path, flags, mode, function (er, fd) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + // that was too many. reduce max, get back in queue. + // this should only happen once in a great while, and only + // if the ulimit -n is set lower than 1024. + fs.MAX_OPEN = fs._curOpen - 1 + return fs.open(path, flags, mode, cb) + } + cb(er, fd) + }) +} + +function open (path, flags, mode, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.open.call(fs, path, flags, mode, function (er, fd) { + if (er) onclose() + cb(er, fd) + }) +} + +fs.openSync = function (path, flags, mode) { + var ret + ret = fs._originalFs.openSync.call(fs, path, flags, mode) + fs._curOpen ++ + return ret +} + +function onclose () { + fs._curOpen -- + flush() +} + +function flush () { + while (fs._curOpen < fs.MAX_OPEN) { + var req = queue.shift() + if (!req) return + switch (req.constructor.name) { + case 'OpenReq': + open(req.path, req.flags || "r", req.mode || 0777, req.cb) + break + case 'ReaddirReq': + readdir(req.path, req.cb) + break + case 'ReadFileReq': + readFile(req.path, req.options, req.cb) + break + case 'WriteFileReq': + writeFile(req.path, req.data, req.options, req.cb) + break + default: + throw new Error('Unknown req type: ' + req.constructor.name) + } + } +} + +fs.close = function (fd, cb) { + cb = cb || noop + fs._originalFs.close.call(fs, fd, function (er) { + onclose() + cb(er) + }) +} + +fs.closeSync = function (fd) { + try { + return fs._originalFs.closeSync.call(fs, fd) + } finally { + onclose() + } +} + + +// readdir takes a fd as well. +// however, the sync version closes it right away, so +// there's no need to wrap. +// It would be nice to catch when it throws an EMFILE, +// but that's relatively rare anyway. + +fs.readdir = gracefulReaddir + +function gracefulReaddir (path, cb) { + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new ReaddirReq(path, cb)) + setTimeout(flush) + return + } + + readdir(path, function (er, files) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.readdir(path, cb) + } + cb(er, files) + }) +} + +function readdir (path, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.readdir.call(fs, path, function (er, files) { + onclose() + cb(er, files) + }) +} + +function ReaddirReq (path, cb) { + this.path = path + this.cb = cb +} + + +fs.readFile = gracefulReadFile + +function gracefulReadFile(path, options, cb) { + if (typeof options === "function") cb = options, options = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new ReadFileReq(path, options, cb)) + setTimeout(flush) + return + } + + readFile(path, options, function (er, data) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.readFile(path, options, cb) + } + cb(er, data) + }) +} + +function readFile (path, options, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.readFile.call(fs, path, options, function (er, data) { + onclose() + cb(er, data) + }) +} + +function ReadFileReq (path, options, cb) { + this.path = path + this.options = options + this.cb = cb +} + + + + +fs.writeFile = gracefulWriteFile + +function gracefulWriteFile(path, data, options, cb) { + if (typeof options === "function") cb = options, options = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new WriteFileReq(path, data, options, cb)) + setTimeout(flush) + return + } + + writeFile(path, data, options, function (er) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.writeFile(path, data, options, cb) + } + cb(er) + }) +} + +function writeFile (path, data, options, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.writeFile.call(fs, path, data, options, function (er) { + onclose() + cb(er) + }) +} + +function WriteFileReq (path, data, options, cb) { + this.path = path + this.data = data + this.options = options + this.cb = cb +} + + +// (re-)implement some things that are known busted or missing. + +var constants = require("constants") + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +function chownErOk (er) { + // if there's no getuid, or if getuid() is something other than 0, + // and the error is EINVAL or EPERM, then just ignore it. + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // When running as root, or if other types of errors are encountered, + // then it's strict. + if (!er || (!process.getuid || process.getuid() !== 0) + && (er.code === "EINVAL" || er.code === "EPERM")) return true +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/package.json new file mode 100644 index 00000000..05d8742b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/package.json @@ -0,0 +1,49 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "1.2.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over fs module\n\ngraceful-fs:\n\n* keeps track of how many file descriptors are open, and by default\n limits this to 1024. Any further requests to open a file are put in a\n queue until new slots become available. If 1024 turns out to be too\n much, it decreases the limit further.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## Configuration\n\nThe maximum number of open file descriptors that graceful-fs manages may\nbe adjusted by setting `fs.MAX_OPEN` to a different number. The default\nis 1024.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs", + "_id": "graceful-fs@1.2.3", + "_from": "graceful-fs@~1.2.0" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/open.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/open.js new file mode 100644 index 00000000..930d5325 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/open.js @@ -0,0 +1,46 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is not fs', function (t) { + t.notEqual(fs, require('fs')) + t.end() +}) + +test('open an existing file works', function (t) { + var start = fs._curOpen + var fd = fs.openSync(__filename, 'r') + t.equal(fs._curOpen, start + 1) + fs.closeSync(fd) + t.equal(fs._curOpen, start) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + t.equal(fs._curOpen, start + 1) + fs.close(fd, function (er) { + if (er) throw er + t.equal(fs._curOpen, start) + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var start = fs._curOpen + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.equal(fs._curOpen, start) + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.equal(fs._curOpen, start) + t.end() + }) +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/ulimit.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/ulimit.js new file mode 100644 index 00000000..8d0882d0 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/graceful-fs/test/ulimit.js @@ -0,0 +1,158 @@ +var test = require('tap').test + +// simulated ulimit +// this is like graceful-fs, but in reverse +var fs_ = require('fs') +var fs = require('../graceful-fs.js') +var files = fs.readdirSync(__dirname) + +// Ok, no more actual file reading! + +var fds = 0 +var nextFd = 60 +var limit = 8 +fs_.open = function (path, flags, mode, cb) { + process.nextTick(function() { + ++fds + if (fds >= limit) { + --fds + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + return cb(er) + } else { + cb(null, nextFd++) + } + }) +} + +fs_.openSync = function (path, flags, mode) { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + throw er + } else { + ++fds + return nextFd++ + } +} + +fs_.close = function (fd, cb) { + process.nextTick(function () { + --fds + cb() + }) +} + +fs_.closeSync = function (fd) { + --fds +} + +fs_.readdir = function (path, cb) { + process.nextTick(function() { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + return cb(er) + } else { + ++fds + process.nextTick(function () { + --fds + cb(null, [__filename, "some-other-file.js"]) + }) + } + }) +} + +fs_.readdirSync = function (path) { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + throw er + } else { + return [__filename, "some-other-file.js"] + } +} + + +test('open emfile autoreduce', function (t) { + fs.MIN_MAX_OPEN = 4 + t.equal(fs.MAX_OPEN, 1024) + + var max = 12 + for (var i = 0; i < max; i++) { + fs.open(__filename, 'r', next(i)) + } + + var phase = 0 + + var expect = + [ [ 0, 60, null, 1024, 4, 12, 1 ], + [ 1, 61, null, 1024, 4, 12, 2 ], + [ 2, 62, null, 1024, 4, 12, 3 ], + [ 3, 63, null, 1024, 4, 12, 4 ], + [ 4, 64, null, 1024, 4, 12, 5 ], + [ 5, 65, null, 1024, 4, 12, 6 ], + [ 6, 66, null, 1024, 4, 12, 7 ], + [ 7, 67, null, 6, 4, 5, 1 ], + [ 8, 68, null, 6, 4, 5, 2 ], + [ 9, 69, null, 6, 4, 5, 3 ], + [ 10, 70, null, 6, 4, 5, 4 ], + [ 11, 71, null, 6, 4, 5, 5 ] ] + + var actual = [] + + function next (i) { return function (er, fd) { + if (er) + throw er + actual.push([i, fd, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds]) + + if (i === max - 1) { + t.same(actual, expect) + t.ok(fs.MAX_OPEN < limit) + t.end() + } + + fs.close(fd) + } } +}) + +test('readdir emfile autoreduce', function (t) { + fs.MAX_OPEN = 1024 + var max = 12 + for (var i = 0; i < max; i ++) { + fs.readdir(__dirname, next(i)) + } + + var expect = + [ [0,[__filename,"some-other-file.js"],null,7,4,7,7], + [1,[__filename,"some-other-file.js"],null,7,4,7,6], + [2,[__filename,"some-other-file.js"],null,7,4,7,5], + [3,[__filename,"some-other-file.js"],null,7,4,7,4], + [4,[__filename,"some-other-file.js"],null,7,4,7,3], + [5,[__filename,"some-other-file.js"],null,7,4,6,2], + [6,[__filename,"some-other-file.js"],null,7,4,5,1], + [7,[__filename,"some-other-file.js"],null,7,4,4,0], + [8,[__filename,"some-other-file.js"],null,7,4,3,3], + [9,[__filename,"some-other-file.js"],null,7,4,2,2], + [10,[__filename,"some-other-file.js"],null,7,4,1,1], + [11,[__filename,"some-other-file.js"],null,7,4,0,0] ] + + var actual = [] + + function next (i) { return function (er, files) { + if (er) + throw er + var line = [i, files, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds ] + actual.push(line) + + if (i === max - 1) { + t.ok(fs.MAX_OPEN < limit) + t.same(actual, expect) + t.end() + } + } } +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/README.md new file mode 100644 index 00000000..b2beaed9 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/README.md @@ -0,0 +1,51 @@ +A dead simple way to do inheritance in JS. + + var inherits = require("inherits") + + function Animal () { + this.alive = true + } + Animal.prototype.say = function (what) { + console.log(what) + } + + inherits(Dog, Animal) + function Dog () { + Dog.super.apply(this) + } + Dog.prototype.sniff = function () { + this.say("sniff sniff") + } + Dog.prototype.bark = function () { + this.say("woof woof") + } + + inherits(Chihuahua, Dog) + function Chihuahua () { + Chihuahua.super.apply(this) + } + Chihuahua.prototype.bark = function () { + this.say("yip yip") + } + + // also works + function Cat () { + Cat.super.apply(this) + } + Cat.prototype.hiss = function () { + this.say("CHSKKSS!!") + } + inherits(Cat, Animal, { + meow: function () { this.say("miao miao") } + }) + Cat.prototype.purr = function () { + this.say("purr purr") + } + + + var c = new Chihuahua + assert(c instanceof Chihuahua) + assert(c instanceof Dog) + assert(c instanceof Animal) + +The actual function is laughably small. 10-lines small. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/inherits.js new file mode 100644 index 00000000..061b3962 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/inherits.js @@ -0,0 +1,29 @@ +module.exports = inherits + +function inherits (c, p, proto) { + proto = proto || {} + var e = {} + ;[c.prototype, proto].forEach(function (s) { + Object.getOwnPropertyNames(s).forEach(function (k) { + e[k] = Object.getOwnPropertyDescriptor(s, k) + }) + }) + c.prototype = Object.create(p.prototype, e) + c.super = p +} + +//function Child () { +// Child.super.call(this) +// console.error([this +// ,this.constructor +// ,this.constructor === Child +// ,this.constructor.super === Parent +// ,Object.getPrototypeOf(this) === Child.prototype +// ,Object.getPrototypeOf(Object.getPrototypeOf(this)) +// === Parent.prototype +// ,this instanceof Child +// ,this instanceof Parent]) +//} +//function Parent () {} +//inherits(Child, Parent) +//new Child diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json new file mode 100644 index 00000000..738a0a58 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json @@ -0,0 +1,30 @@ +{ + "name": "inherits", + "description": "A tiny simple way to do classic inheritance in js", + "version": "1.0.0", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented" + ], + "main": "./inherits.js", + "repository": { + "type": "git", + "url": "https://github.com/isaacs/inherits" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "readme": "A dead simple way to do inheritance in JS.\n\n var inherits = require(\"inherits\")\n\n function Animal () {\n this.alive = true\n }\n Animal.prototype.say = function (what) {\n console.log(what)\n }\n\n inherits(Dog, Animal)\n function Dog () {\n Dog.super.apply(this)\n }\n Dog.prototype.sniff = function () {\n this.say(\"sniff sniff\")\n }\n Dog.prototype.bark = function () {\n this.say(\"woof woof\")\n }\n\n inherits(Chihuahua, Dog)\n function Chihuahua () {\n Chihuahua.super.apply(this)\n }\n Chihuahua.prototype.bark = function () {\n this.say(\"yip yip\")\n }\n\n // also works\n function Cat () {\n Cat.super.apply(this)\n }\n Cat.prototype.hiss = function () {\n this.say(\"CHSKKSS!!\")\n }\n inherits(Cat, Animal, {\n meow: function () { this.say(\"miao miao\") }\n })\n Cat.prototype.purr = function () {\n this.say(\"purr purr\")\n }\n\n\n var c = new Chihuahua\n assert(c instanceof Chihuahua)\n assert(c instanceof Dog)\n assert(c instanceof Animal)\n\nThe actual function is laughably small. 10-lines small.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "homepage": "https://github.com/isaacs/inherits", + "_id": "inherits@1.0.0", + "_from": "inherits@1" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/.npmignore b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/README.md new file mode 100644 index 00000000..978268e2 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/README.md @@ -0,0 +1,218 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +Eventually, it will replace the C binding in node-glob. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instanting the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +## Functions + +The top-level exported function has a `cache` property, which is an LRU +cache set to store 100 items. So, calling these methods repeatedly +with the same pattern and options will use the same Minimatch object, +saving the cost of parsing it multiple times. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself. When set, an empty list is returned if there are +no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.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. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/minimatch.js new file mode 100644 index 00000000..c633f89f --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/minimatch.js @@ -0,0 +1,1055 @@ +;(function (require, exports, module, platform) { + +if (module) module.exports = minimatch +else exports.minimatch = minimatch + +if (!require) { + require = function (id) { + switch (id) { + case "sigmund": return function sigmund (obj) { + return JSON.stringify(obj) + } + case "path": return { basename: function (f) { + f = f.split(/[\/\\]/) + var e = f.pop() + if (!e) e = f.pop() + return e + }} + case "lru-cache": return function LRUCache () { + // not quite an LRU, but still space-limited. + var cache = {} + var cnt = 0 + this.set = function (k, v) { + cnt ++ + if (cnt >= 100) cache = {} + cache[k] = v + } + this.get = function (k) { return cache[k] } + } + } + } +} + +minimatch.Minimatch = Minimatch + +var LRU = require("lru-cache") + , cache = minimatch.cache = new LRU({max: 100}) + , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} + , sigmund = require("sigmund") + +var path = require("path") + // any single thing other than / + // don't need to escape / when using new RegExp() + , qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" + + // characters that need to be escaped in RegExp. + , reSpecials = charSet("().*{}+?[]^$\\!") + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split("").reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + + +function minimatch (p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + return false + } + + // "" only matches "" + if (pattern.trim() === "") return p === "" + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options, cache) + } + + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + pattern = pattern.split("\\").join("/") + } + + // lru storage. + // these things aren't particularly big, but walking down the string + // and turning it into a regexp can get pretty costly. + var cacheKey = pattern + "\n" + sigmund(options) + var cached = minimatch.cache.get(cacheKey) + if (cached) return cached + minimatch.cache.set(cacheKey, this) + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function() {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return -1 === s.indexOf(false) + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + , negate = false + , options = this.options + , negateOffset = 0 + + if (options.nonegate) return + + for ( var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === "!" + ; i ++) { + negate = !negate + negateOffset ++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return new Minimatch(pattern, options).braceExpand() +} + +Minimatch.prototype.braceExpand = braceExpand +function braceExpand (pattern, options) { + options = options || this.options + pattern = typeof pattern === "undefined" + ? this.pattern : pattern + + if (typeof pattern === "undefined") { + throw new Error("undefined pattern") + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + var escaping = false + + // examples and comments refer to this crazy pattern: + // a{b,c{d,e},{f,g}h}x{y,z} + // expected: + // abxy + // abxz + // acdxy + // acdxz + // acexy + // acexz + // afhxy + // afhxz + // aghxy + // aghxz + + // everything before the first \{ is just a prefix. + // So, we pluck that off, and work with the rest, + // and then prepend it to everything we find. + if (pattern.charAt(0) !== "{") { + this.debug(pattern) + var prefix = null + for (var i = 0, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug(i, c) + if (c === "\\") { + escaping = !escaping + } else if (c === "{" && !escaping) { + prefix = pattern.substr(0, i) + break + } + } + + // actually no sets, all { were escaped. + if (prefix === null) { + this.debug("no sets") + return [pattern] + } + + var tail = braceExpand.call(this, pattern.substr(i), options) + return tail.map(function (t) { + return prefix + t + }) + } + + // now we have something like: + // {b,c{d,e},{f,g}h}x{y,z} + // walk through the set, expanding each part, until + // the set ends. then, we'll expand the suffix. + // If the set only has a single member, then'll put the {} back + + // first, handle numeric sets, since they're easier + var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) + if (numset) { + this.debug("numset", numset[1], numset[2]) + var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) + , start = +numset[1] + , end = +numset[2] + , inc = start > end ? -1 : 1 + , set = [] + for (var i = start; i != (end + inc); i += inc) { + // append all the suffixes + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + set.push(i + suf[ii]) + } + } + return set + } + + // ok, walk through the set + // We hope, somewhat optimistically, that there + // will be a } at the end. + // If the closing brace isn't found, then the pattern is + // interpreted as braceExpand("\\" + pattern) so that + // the leading \{ will be interpreted literally. + var i = 1 // skip the \{ + , depth = 1 + , set = [] + , member = "" + , sawEnd = false + , escaping = false + + function addMember () { + set.push(member) + member = "" + } + + this.debug("Entering for") + FOR: for (i = 1, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug("", i, c) + + if (escaping) { + escaping = false + member += "\\" + c + } else { + switch (c) { + case "\\": + escaping = true + continue + + case "{": + depth ++ + member += "{" + continue + + case "}": + depth -- + // if this closes the actual set, then we're done + if (depth === 0) { + addMember() + // pluck off the close-brace + i ++ + break FOR + } else { + member += c + continue + } + + case ",": + if (depth === 1) { + addMember() + } else { + member += c + } + continue + + default: + member += c + continue + } // switch + } // else + } // for + + // now we've either finished the set, and the suffix is + // pattern.substr(i), or we have *not* closed the set, + // and need to escape the leading brace + if (depth !== 0) { + this.debug("didn't close", pattern) + return braceExpand.call(this, "\\" + pattern, options) + } + + // x{y,z} -> ["xy", "xz"] + this.debug("set", set) + this.debug("suffix", pattern.substr(i)) + var suf = braceExpand.call(this, pattern.substr(i), options) + // ["b", "c{d,e}","{f,g}h"] -> + // [["b"], ["cd", "ce"], ["fh", "gh"]] + var addBraces = set.length === 1 + this.debug("set pre-expanded", set) + set = set.map(function (p) { + return braceExpand.call(this, p, options) + }, this) + this.debug("set expanded", set) + + + // [["b"], ["cd", "ce"], ["fh", "gh"]] -> + // ["b", "cd", "ce", "fh", "gh"] + set = set.reduce(function (l, r) { + return l.concat(r) + }) + + if (addBraces) { + set = set.map(function (s) { + return "{" + s + "}" + }) + } + + // now attach the suffixes. + var ret = [] + for (var i = 0, l = set.length; i < l; i ++) { + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + ret.push(set[i] + suf[ii]) + } + } + return ret +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === "**") return GLOBSTAR + if (pattern === "") return "" + + var re = "" + , hasMagic = !!options.nocase + , escaping = false + // ? => one single character + , patternListStack = [] + , plType + , stateChar + , inClass = false + , reClassStart = -1 + , classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + , patternStart = pattern.charAt(0) === "." ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" + : "(?!\\.)" + , self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case "*": + re += star + hasMagic = true + break + case "?": + re += qmark + hasMagic = true + break + default: + re += "\\"+stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for ( var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i ++ ) { + + this.debug("%s\t%s %s %j", pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += "\\" + c + escaping = false + continue + } + + SWITCH: switch (c) { + case "/": + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case "\\": + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === "!" && i === classStart + 1) c = "^" + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case "(": + if (inClass) { + re += "(" + continue + } + + if (!stateChar) { + re += "\\(" + continue + } + + plType = stateChar + patternListStack.push({ type: plType + , start: i - 1 + , reStart: re.length }) + // negation is (?:(?!js)[^/]*) + re += stateChar === "!" ? "(?:(?!" : "(?:" + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ")": + if (inClass || !patternListStack.length) { + re += "\\)" + continue + } + + clearStateChar() + hasMagic = true + re += ")" + plType = patternListStack.pop().type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case "!": + re += "[^/]*?)" + break + case "?": + case "+": + case "*": re += plType + case "@": break // the default anyway + } + continue + + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|" + escaping = false + continue + } + + clearStateChar() + re += "|" + continue + + // these are mostly the same in regexp and glob + case "[": + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += "\\" + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case "]": + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += "\\" + c + escaping = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === "^" && inClass)) { + re += "\\" + } + + re += c + + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + var cs = pattern.substr(classStart + 1) + , sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + "\\[" + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + var pl + while (pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = "\\" + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + "|" + }) + + this.debug("tail=%j\n %s", tail, tail) + var t = pl.type === "*" ? star + : pl.type === "?" ? qmark + : "\\" + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + + t + "\\(" + + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += "\\\\" + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case ".": + case "[": + case "(": addPatternStart = true + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== "" && hasMagic) re = "(?=.)" + re + + if (addPatternStart) re = patternStart + re + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [ re, hasMagic ] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? "i" : "" + , regExp = new RegExp("^" + re + "$", flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) return this.regexp = false + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + , flags = options.nocase ? "i" : "" + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === "string") ? regExpEscape(p) + : p._src + }).join("\\\/") + }).join("|") + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$" + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$" + + try { + return this.regexp = new RegExp(re, flags) + } catch (ex) { + return this.regexp = false + } +} + +minimatch.match = function (list, pattern, options) { + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === "" + + if (f === "/" && partial) return true + + var options = this.options + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + f = f.split("\\").join("/") + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, "split", f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, "set", set) + + var splitFile = path.basename(f.join("/")).split("/") + + for (var i = 0, l = set.length; i < l; i ++) { + var pattern = set[i], file = f + if (options.matchBase && pattern.length === 1) { + file = splitFile + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug("matchOne", + { "this": this + , file: file + , pattern: pattern }) + + this.debug("matchOne", file.length, pattern.length) + + for ( var fi = 0 + , pi = 0 + , fl = file.length + , pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi ++, pi ++ ) { + + this.debug("matchOne loop") + var p = pattern[pi] + , f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + , pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for ( ; fi < fl; fi ++) { + if (file[fi] === "." || file[fi] === ".." || + (!options.dot && file[fi].charAt(0) === ".")) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + WHILE: while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', + file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === "." || swallowee === ".." || + (!options.dot && swallowee.charAt(0) === ".")) { + this.debug("dot detected!", file, fr, pattern, pr) + break WHILE + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr ++ + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug("string match", p, f, hit) + } else { + hit = f.match(p) + this.debug("pattern match", p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") + return emptyFileEnd + } + + // should be unreachable. + throw new Error("wtf?") +} + + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, "$1") +} + + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") +} + +})( typeof require === "function" ? require : null, + this, + typeof module === "object" ? module : null, + typeof process === "object" ? process.platform : "win32" + ) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS new file mode 100644 index 00000000..4a0bc503 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS @@ -0,0 +1,14 @@ +# Authors, sorted by whether or not they are me +Isaac Z. Schlueter +Brian Cottingham +Carlos Brito Lage +Jesse Dailey +Kevin O'Hara +Marco Rogers +Mark Cavage +Marko Mikulicic +Nathan Rajlich +Satheesh Natesan +Trent Mick +ashleybrener +n4kz diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md new file mode 100644 index 00000000..03ee0f98 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md @@ -0,0 +1,97 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n) { return n * 2 } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = LRU(options) + , otherCache = LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n){return n.length}`. The default is + `function(n){return 1}`, which is fine if you want to store `n` + like-sized things. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. + +## API + +* `set(key, value)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js new file mode 100644 index 00000000..d1d13817 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -0,0 +1,252 @@ +;(function () { // closure for web browsers + +if (typeof module === 'object' && module.exports) { + module.exports = LRUCache +} else { + // just set the global for non-node platforms. + this.LRUCache = LRUCache +} + +function hOP (obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key) +} + +function naiveLength () { return 1 } + +function LRUCache (options) { + if (!(this instanceof LRUCache)) + return new LRUCache(options) + + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + this._max = options.max + // Kind of weird to have a default max of Infinity, but oh well. + if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) + this._max = Infinity + + this._lengthCalculator = options.length || naiveLength + if (typeof this._lengthCalculator !== "function") + this._lengthCalculator = naiveLength + + this._allowStale = options.stale || false + this._maxAge = options.maxAge || null + this._dispose = options.dispose + this.reset() +} + +// resize the cache when the max changes. +Object.defineProperty(LRUCache.prototype, "max", + { set : function (mL) { + if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity + this._max = mL + if (this._length > this._max) trim(this) + } + , get : function () { return this._max } + , enumerable : true + }) + +// resize the cache when the lengthCalculator changes. +Object.defineProperty(LRUCache.prototype, "lengthCalculator", + { set : function (lC) { + if (typeof lC !== "function") { + this._lengthCalculator = naiveLength + this._length = this._itemCount + for (var key in this._cache) { + this._cache[key].length = 1 + } + } else { + this._lengthCalculator = lC + this._length = 0 + for (var key in this._cache) { + this._cache[key].length = this._lengthCalculator(this._cache[key].value) + this._length += this._cache[key].length + } + } + + if (this._length > this._max) trim(this) + } + , get : function () { return this._lengthCalculator } + , enumerable : true + }) + +Object.defineProperty(LRUCache.prototype, "length", + { get : function () { return this._length } + , enumerable : true + }) + + +Object.defineProperty(LRUCache.prototype, "itemCount", + { get : function () { return this._itemCount } + , enumerable : true + }) + +LRUCache.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + var i = 0; + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + i++ + var hit = this._lruList[k] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + del(this, hit) + if (!this._allowStale) hit = undefined + } + if (hit) { + fn.call(thisp, hit.value, hit.key, this) + } + } +} + +LRUCache.prototype.keys = function () { + var keys = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + keys[i++] = hit.key + } + return keys +} + +LRUCache.prototype.values = function () { + var values = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + values[i++] = hit.value + } + return values +} + +LRUCache.prototype.reset = function () { + if (this._dispose && this._cache) { + for (var k in this._cache) { + this._dispose(k, this._cache[k].value) + } + } + + this._cache = Object.create(null) // hash of items by key + this._lruList = Object.create(null) // list of items in order of use recency + this._mru = 0 // most recently used + this._lru = 0 // least recently used + this._length = 0 // number of items in the list + this._itemCount = 0 +} + +// Provided for debugging/dev purposes only. No promises whatsoever that +// this API stays stable. +LRUCache.prototype.dump = function () { + return this._cache +} + +LRUCache.prototype.dumpLru = function () { + return this._lruList +} + +LRUCache.prototype.set = function (key, value) { + if (hOP(this._cache, key)) { + // dispose of the old one before overwriting + if (this._dispose) this._dispose(key, this._cache[key].value) + if (this._maxAge) this._cache[key].now = Date.now() + this._cache[key].value = value + this.get(key) + return true + } + + var len = this._lengthCalculator(value) + var age = this._maxAge ? Date.now() : 0 + var hit = new Entry(key, value, this._mru++, len, age) + + // oversized objects fall out of cache automatically. + if (hit.length > this._max) { + if (this._dispose) this._dispose(key, value) + return false + } + + this._length += hit.length + this._lruList[hit.lu] = this._cache[key] = hit + this._itemCount ++ + + if (this._length > this._max) trim(this) + return true +} + +LRUCache.prototype.has = function (key) { + if (!hOP(this._cache, key)) return false + var hit = this._cache[key] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + return false + } + return true +} + +LRUCache.prototype.get = function (key) { + return get(this, key, true) +} + +LRUCache.prototype.peek = function (key) { + return get(this, key, false) +} + +LRUCache.prototype.pop = function () { + var hit = this._lruList[this._lru] + del(this, hit) + return hit || null +} + +LRUCache.prototype.del = function (key) { + del(this, this._cache[key]) +} + +function get (self, key, doUse) { + var hit = self._cache[key] + if (hit) { + if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + del(self, hit) + if (!self._allowStale) hit = undefined + } else { + if (doUse) use(self, hit) + } + if (hit) hit = hit.value + } + return hit +} + +function use (self, hit) { + shiftLU(self, hit) + hit.lu = self._mru ++ + self._lruList[hit.lu] = hit +} + +function trim (self) { + while (self._lru < self._mru && self._length > self._max) + del(self, self._lruList[self._lru]) +} + +function shiftLU (self, hit) { + delete self._lruList[ hit.lu ] + while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ +} + +function del (self, hit) { + if (hit) { + if (self._dispose) self._dispose(hit.key, hit.value) + self._length -= hit.length + self._itemCount -- + delete self._cache[ hit.key ] + shiftLU(self, hit) + } +} + +// classy, since V8 prefers predictable objects. +function Entry (key, value, lu, length, now) { + this.key = key + this.value = value + this.lu = lu + this.length = length + this.now = now +} + +})() diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json new file mode 100644 index 00000000..4472725d --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json @@ -0,0 +1,33 @@ +{ + "name": "lru-cache", + "description": "A cache object that deletes the least-recently-used items.", + "version": "2.5.0", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "scripts": { + "test": "tap test --gc" + }, + "main": "lib/lru-cache.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "devDependencies": { + "tap": "", + "weak": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" + }, + "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "homepage": "https://github.com/isaacs/node-lru-cache", + "_id": "lru-cache@2.5.0", + "_from": "lru-cache@2" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js new file mode 100644 index 00000000..f72697c4 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -0,0 +1,369 @@ +var test = require("tap").test + , LRU = require("../") + +test("basic", function (t) { + var cache = new LRU({max: 10}) + cache.set("key", "value") + t.equal(cache.get("key"), "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.length, 1) + t.equal(cache.max, 10) + t.end() +}) + +test("least recently set", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.get("a") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), "A") + t.end() +}) + +test("del", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.del("a") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("max", function (t) { + var cache = new LRU(3) + + // test changing the max, verify that the LRU items get dropped. + cache.max = 100 + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + + // now remove the max restriction, and try again. + cache.max = "hello" + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + // should trigger an immediate resize + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + t.end() +}) + +test("reset", function (t) { + var cache = new LRU(10) + cache.set("a", "A") + cache.set("b", "B") + cache.reset() + t.equal(cache.length, 0) + t.equal(cache.max, 10) + t.equal(cache.get("a"), undefined) + t.equal(cache.get("b"), undefined) + t.end() +}) + + +// Note: `.dump()` is a debugging tool only. No guarantees are made +// about the format/layout of the response. +test("dump", function (t) { + var cache = new LRU(10) + var d = cache.dump(); + t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") + cache.set("a", "A") + var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } + t.ok(d.a) + t.equal(d.a.key, "a") + t.equal(d.a.value, "A") + t.equal(d.a.lu, 0) + + cache.set("b", "B") + cache.get("b") + d = cache.dump() + t.ok(d.b) + t.equal(d.b.key, "b") + t.equal(d.b.value, "B") + t.equal(d.b.lu, 2) + + t.end() +}) + + +test("basic with weighed length", function (t) { + var cache = new LRU({ + max: 100, + length: function (item) { return item.size } + }) + cache.set("key", {val: "value", size: 50}) + t.equal(cache.get("key").val, "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.lengthCalculator(cache.get("key")), 50) + t.equal(cache.length, 50) + t.equal(cache.max, 100) + t.end() +}) + + +test("weighed length item too large", function (t) { + var cache = new LRU({ + max: 10, + length: function (item) { return item.size } + }) + t.equal(cache.max, 10) + + // should fall out immediately + cache.set("key", {val: "value", size: 50}) + + t.equal(cache.length, 0) + t.equal(cache.get("key"), undefined) + t.end() +}) + +test("least recently set with weighed length", function (t) { + var cache = new LRU({ + max:8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.set("d", "DDDD") + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("c"), "CCC") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten with weighed length", function (t) { + var cache = new LRU({ + max: 8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.get("a") + cache.get("b") + cache.set("d", "DDDD") + t.equal(cache.get("c"), undefined) + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("b"), "BB") + t.equal(cache.get("a"), "A") + t.end() +}) + +test("set returns proper booleans", function(t) { + var cache = new LRU({ + max: 5, + length: function (item) { return item.length } + }) + + t.equal(cache.set("a", "A"), true) + + // should return false for max exceeded + t.equal(cache.set("b", "donuts"), false) + + t.equal(cache.set("b", "B"), true) + t.equal(cache.set("c", "CCCC"), true) + t.end() +}) + +test("drop the old items", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A") + + setTimeout(function () { + cache.set("b", "b") + t.equal(cache.get("a"), "A") + }, 25) + + setTimeout(function () { + cache.set("c", "C") + // timed out + t.notOk(cache.get("a")) + }, 60) + + setTimeout(function () { + t.notOk(cache.get("b")) + t.equal(cache.get("c"), "C") + }, 90) + + setTimeout(function () { + t.notOk(cache.get("c")) + t.end() + }, 155) +}) + +test("disposal function", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + dispose: function (k, n) { + disposed = n + } + }) + + cache.set(1, 1) + cache.set(2, 2) + t.equal(disposed, 1) + cache.set(3, 3) + t.equal(disposed, 2) + cache.reset() + t.equal(disposed, 3) + t.end() +}) + +test("disposal function on too big of item", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + length: function (k) { + return k.length + }, + dispose: function (k, n) { + disposed = n + } + }) + var obj = [ 1, 2 ] + + t.equal(disposed, false) + cache.set("obj", obj) + t.equal(disposed, obj) + t.end() +}) + +test("has()", function(t) { + var cache = new LRU({ + max: 1, + maxAge: 10 + }) + + cache.set('foo', 'bar') + t.equal(cache.has('foo'), true) + cache.set('blu', 'baz') + t.equal(cache.has('foo'), false) + t.equal(cache.has('blu'), true) + setTimeout(function() { + t.equal(cache.has('blu'), false) + t.end() + }, 15) +}) + +test("stale", function(t) { + var cache = new LRU({ + maxAge: 10, + stale: true + }) + + cache.set('foo', 'bar') + t.equal(cache.get('foo'), 'bar') + t.equal(cache.has('foo'), true) + setTimeout(function() { + t.equal(cache.has('foo'), false) + t.equal(cache.get('foo'), 'bar') + t.equal(cache.get('foo'), undefined) + t.end() + }, 15) +}) + +test("lru update via set", function(t) { + var cache = LRU({ max: 2 }); + + cache.set('foo', 1); + cache.set('bar', 2); + cache.del('bar'); + cache.set('baz', 3); + cache.set('qux', 4); + + t.equal(cache.get('foo'), undefined) + t.equal(cache.get('bar'), undefined) + t.equal(cache.get('baz'), 3) + t.equal(cache.get('qux'), 4) + t.end() +}) + +test("least recently set w/ peek", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + t.equal(cache.peek("a"), "A") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("pop the least used item", function (t) { + var cache = new LRU(3) + , last + + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + + t.equal(cache.length, 3) + t.equal(cache.max, 3) + + // Ensure we pop a, c, b + cache.get("b", "B") + + last = cache.pop() + t.equal(last.key, "a") + t.equal(last.value, "A") + t.equal(cache.length, 2) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "c") + t.equal(last.value, "C") + t.equal(cache.length, 1) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "b") + t.equal(last.value, "B") + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last, null) + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js new file mode 100644 index 00000000..eefb80d9 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -0,0 +1,52 @@ +var test = require('tap').test +var LRU = require('../') + +test('forEach', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 9 + l.forEach(function (val, key, cache) { + t.equal(cache, l) + t.equal(key, i.toString()) + t.equal(val, i.toString(2)) + i -= 1 + }) + + // get in order of most recently used + l.get(6) + l.get(8) + + var order = [ 8, 6, 9, 7, 5 ] + var i = 0 + + l.forEach(function (val, key, cache) { + var j = order[i ++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + + t.end() +}) + +test('keys() and values()', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + t.similar(l.keys(), ['9', '8', '7', '6', '5']) + t.similar(l.values(), ['1001', '1000', '111', '110', '101']) + + // get in order of most recently used + l.get(6) + l.get(8) + + t.similar(l.keys(), ['8', '6', '9', '7', '5']) + t.similar(l.values(), ['1000', '110', '1001', '111', '101']) + + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js new file mode 100644 index 00000000..7af45b02 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node --expose_gc + +var weak = require('weak'); +var test = require('tap').test +var LRU = require('../') +var l = new LRU({ max: 10 }) +var refs = 0 +function X() { + refs ++ + weak(this, deref) +} + +function deref() { + refs -- +} + +test('no leaks', function (t) { + // fill up the cache + for (var i = 0; i < 100; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var start = process.memoryUsage() + + // capture the memory + var startRefs = refs + + // do it again, but more + for (var i = 0; i < 10000; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var end = process.memoryUsage() + t.equal(refs, startRefs, 'no leaky refs') + + console.error('start: %j\n' + + 'end: %j', start, end); + t.pass(); + t.end(); +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md new file mode 100644 index 00000000..7e365129 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md @@ -0,0 +1,53 @@ +# sigmund + +Quick and dirty signatures for Objects. + +This is like a much faster `deepEquals` comparison, which returns a +string key suitable for caches and the like. + +## Usage + +```javascript +function doSomething (someObj) { + var key = sigmund(someObj, maxDepth) // max depth defaults to 10 + var cached = cache.get(key) + if (cached) return cached) + + var result = expensiveCalculation(someObj) + cache.set(key, result) + return result +} +``` + +The resulting key will be as unique and reproducible as calling +`JSON.stringify` or `util.inspect` on the object, but is much faster. +In order to achieve this speed, some differences are glossed over. +For example, the object `{0:'foo'}` will be treated identically to the +array `['foo']`. + +Also, just as there is no way to summon the soul from the scribblings +of a cocain-addled psychoanalyst, there is no way to revive the object +from the signature string that sigmund gives you. In fact, it's +barely even readable. + +As with `sys.inspect` and `JSON.stringify`, larger objects will +produce larger signature strings. + +Because sigmund is a bit less strict than the more thorough +alternatives, the strings will be shorter, and also there is a +slightly higher chance for collisions. For example, these objects +have the same signature: + + var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} + var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +Like a good Freudian, sigmund is most effective when you already have +some understanding of what you're looking for. It can help you help +yourself, but you must be willing to do some work as well. + +Cycles are handled, and cyclical objects are silently omitted (though +the key is included in the signature output.) + +The second argument is the maximum depth, which defaults to 10, +because that is the maximum object traversal depth covered by most +insurance carriers. diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js new file mode 100644 index 00000000..5acfd6d9 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js @@ -0,0 +1,283 @@ +// different ways to id objects +// use a req/res pair, since it's crazy deep and cyclical + +// sparseFE10 and sigmund are usually pretty close, which is to be expected, +// since they are essentially the same algorithm, except that sigmund handles +// regular expression objects properly. + + +var http = require('http') +var util = require('util') +var sigmund = require('./sigmund.js') +var sreq, sres, creq, cres, test + +http.createServer(function (q, s) { + sreq = q + sres = s + sres.end('ok') + this.close(function () { setTimeout(function () { + start() + }, 200) }) +}).listen(1337, function () { + creq = http.get({ port: 1337 }) + creq.on('response', function (s) { cres = s }) +}) + +function start () { + test = [sreq, sres, creq, cres] + // test = sreq + // sreq.sres = sres + // sreq.creq = creq + // sreq.cres = cres + + for (var i in exports.compare) { + console.log(i) + var hash = exports.compare[i]() + console.log(hash) + console.log(hash.length) + console.log('') + } + + require('bench').runMain() +} + +function customWs (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return customWs(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + customWs(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function custom (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return '' + obj + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return custom(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + custom(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function sparseFE2 (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ':' + ch(v[k], depth + 1) + }) + soFar += '}' + } + ch(obj, 0) + return soFar +} + +function sparseFE (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ch(v[k], depth + 1) + }) + } + ch(obj, 0) + return soFar +} + +function sparse (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ch(v[k], depth + 1) + } + } + ch(obj, 0) + return soFar +} + +function noCommas (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + + +function flatten (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + soFar += ',' + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + +exports.compare = +{ + // 'custom 2': function () { + // return custom(test, 2, 0) + // }, + // 'customWs 2': function () { + // return customWs(test, 2, 0) + // }, + 'JSON.stringify (guarded)': function () { + var seen = [] + return JSON.stringify(test, function (k, v) { + if (typeof v !== 'object' || !v) return v + if (seen.indexOf(v) !== -1) return undefined + seen.push(v) + return v + }) + }, + + 'flatten 10': function () { + return flatten(test, 10) + }, + + // 'flattenFE 10': function () { + // return flattenFE(test, 10) + // }, + + 'noCommas 10': function () { + return noCommas(test, 10) + }, + + 'sparse 10': function () { + return sparse(test, 10) + }, + + 'sparseFE 10': function () { + return sparseFE(test, 10) + }, + + 'sparseFE2 10': function () { + return sparseFE2(test, 10) + }, + + sigmund: function() { + return sigmund(test, 10) + }, + + + // 'util.inspect 1': function () { + // return util.inspect(test, false, 1, false) + // }, + // 'util.inspect undefined': function () { + // util.inspect(test) + // }, + // 'util.inspect 2': function () { + // util.inspect(test, false, 2, false) + // }, + // 'util.inspect 3': function () { + // util.inspect(test, false, 3, false) + // }, + // 'util.inspect 4': function () { + // util.inspect(test, false, 4, false) + // }, + // 'util.inspect Infinity': function () { + // util.inspect(test, false, Infinity, false) + // } +} + +/** results +**/ diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json new file mode 100644 index 00000000..cb7e2bd4 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json @@ -0,0 +1,42 @@ +{ + "name": "sigmund", + "version": "1.0.0", + "description": "Quick and dirty signatures for Objects.", + "main": "sigmund.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.3.0" + }, + "scripts": { + "test": "tap test/*.js", + "bench": "node bench.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/sigmund" + }, + "keywords": [ + "object", + "signature", + "key", + "data", + "psychoanalysis" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "BSD", + "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/sigmund/issues" + }, + "homepage": "https://github.com/isaacs/sigmund", + "_id": "sigmund@1.0.0", + "_from": "sigmund@~1.0.0" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js new file mode 100644 index 00000000..82c7ab8c --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js @@ -0,0 +1,39 @@ +module.exports = sigmund +function sigmund (subject, maxSessions) { + maxSessions = maxSessions || 10; + var notes = []; + var analysis = ''; + var RE = RegExp; + + function psychoAnalyze (subject, session) { + if (session > maxSessions) return; + + if (typeof subject === 'function' || + typeof subject === 'undefined') { + return; + } + + if (typeof subject !== 'object' || !subject || + (subject instanceof RE)) { + analysis += subject; + return; + } + + if (notes.indexOf(subject) !== -1 || session === maxSessions) return; + + notes.push(subject); + analysis += '{'; + Object.keys(subject).forEach(function (issue, _, __) { + // pseudo-private values. skip those. + if (issue.charAt(0) === '_') return; + var to = typeof subject[issue]; + if (to === 'function' || to === 'undefined') return; + analysis += issue; + psychoAnalyze(subject[issue], session + 1); + }); + } + psychoAnalyze(subject, 0); + return analysis; +} + +// vim: set softtabstop=4 shiftwidth=4: diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js new file mode 100644 index 00000000..50c53a13 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js @@ -0,0 +1,24 @@ +var test = require('tap').test +var sigmund = require('../sigmund.js') + + +// occasionally there are duplicates +// that's an acceptable edge-case. JSON.stringify and util.inspect +// have some collision potential as well, though less, and collision +// detection is expensive. +var hash = '{abc/def/g{0h1i2{jkl' +var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} +var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +var obj3 = JSON.parse(JSON.stringify(obj1)) +obj3.c = /def/ +obj3.g[2].cycle = obj3 +var cycleHash = '{abc/def/g{0h1i2{jklcycle' + +test('basic', function (t) { + t.equal(sigmund(obj1), hash) + t.equal(sigmund(obj2), hash) + t.equal(sigmund(obj3), cycleHash) + t.end() +}) + diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json new file mode 100644 index 00000000..f8f545aa --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "0.2.14", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "devDependencies": { + "tap": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" + }, + "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself. When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "homepage": "https://github.com/isaacs/minimatch", + "_id": "minimatch@0.2.14", + "_from": "minimatch@~0.2.11" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/basic.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/basic.js new file mode 100644 index 00000000..ae7ac73c --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/basic.js @@ -0,0 +1,399 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + + +var patterns = + [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + // https://github.com/isaacs/minimatch/issues/5 + , function () { + files = [ 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' + , 'a/b/.x' + , 'a/b/.x/' + , 'a/.x/b' + , '.x' + , '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b/.x/c' + , '.x/.x' ] + } + , ["**/.x/**", [ '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b' + , 'a/b/.x/' + , 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' ] ] + + ] + +var regexps = + [ '/^(?:(?=.)a[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:\\*)$/', + '/^(?:(?=.)\\*[^/]*?)$/', + '/^(?:\\*\\*)$/', + '/^(?:(?=.)b[^/]*?\\/)$/', + '/^(?:(?=.)c[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', + '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', + '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', + '/^(?:(?=.)a[^/]*?[^c])$/', + '/^(?:(?=.)a[X-]b)$/', + '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', + '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[^/]c)$/', + '/^(?:a\\*c)$/', + 'false', + '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', + '/^(?:man\\/man1\\/bash\\.1)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[-abc])$/', + '/^(?:(?!\\.)(?=.)[abc-])$/', + '/^(?:\\\\)$/', + '/^(?:(?!\\.)(?=.)[\\\\])$/', + '/^(?:(?!\\.)(?=.)[\\[])$/', + '/^(?:\\[)$/', + '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[\\]])$/', + '/^(?:(?!\\.)(?=.)[\\]-])$/', + '/^(?:(?!\\.)(?=.)[a-z])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:\\[\\])$/', + '/^(?:\\[abc)$/', + '/^(?:(?=.)XYZ)$/i', + '/^(?:(?=.)ab[^/]*?)$/i', + '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', + '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', + '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', + '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', + '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', + '/^(?:(?=.)a[^/]b)$/', + '/^(?:(?=.)#[^/]*?)$/', + '/^(?!^(?:(?=.)a[^/]*?)$).*$/', + '/^(?:(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)a[^/]*?)$/', + '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] +var re = 0; + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + patterns.forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var m = new mm.Minimatch(pattern, options) + var r = m.makeRe() + var expectRe = regexps[re++] + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + + t.equal(tapOpts.re, expectRe, tapOpts) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/brace-expand.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/brace-expand.js new file mode 100644 index 00000000..7ee278a2 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/brace-expand.js @@ -0,0 +1,33 @@ +var tap = require("tap") + , minimatch = require("../") + +tap.test("brace expansion", function (t) { + // [ pattern, [expanded] ] + ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" + , [ "abxy" + , "abxz" + , "acdxy" + , "acdxz" + , "acexy" + , "acexz" + , "afhxy" + , "afhxz" + , "aghxy" + , "aghxz" ] ] + , [ "a{1..5}b" + , [ "a1b" + , "a2b" + , "a3b" + , "a4b" + , "a5b" ] ] + , [ "a{b}c", ["a{b}c"] ] + ].forEach(function (tc) { + var p = tc[0] + , expect = tc[1] + t.equivalent(minimatch.braceExpand(p), expect, p) + }) + console.error("ending") + t.end() +}) + + diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/caching.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/caching.js new file mode 100644 index 00000000..0fec4b0f --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/caching.js @@ -0,0 +1,14 @@ +var Minimatch = require("../minimatch.js").Minimatch +var tap = require("tap") +tap.test("cache test", function (t) { + var mm1 = new Minimatch("a?b") + var mm2 = new Minimatch("a?b") + t.equal(mm1, mm2, "should get the same object") + // the lru should drop it after 100 entries + for (var i = 0; i < 100; i ++) { + new Minimatch("a"+i) + } + mm2 = new Minimatch("a?b") + t.notEqual(mm1, mm2, "cache should have dropped") + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/defaults.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/defaults.js new file mode 100644 index 00000000..25f1f601 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/defaults.js @@ -0,0 +1,274 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + ; [ "http://www.bashcookbook.com/bashinfo" + + "/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + ].forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var Class = mm.defaults(options).Minimatch + var m = new Class(pattern, {}) + var r = m.makeRe() + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js new file mode 100644 index 00000000..6676e262 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js @@ -0,0 +1,8 @@ +var test = require('tap').test +var minimatch = require('../') + +test('extglob ending with statechar', function(t) { + t.notOk(minimatch('ax', 'a?(b*)')) + t.ok(minimatch('ax', '?(a*|b)')) + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/package.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/package.json new file mode 100644 index 00000000..fd3bd2eb --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "glob", + "description": "a little globber", + "version": "3.1.21", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "main": "glob.js", + "engines": { + "node": "*" + }, + "dependencies": { + "minimatch": "~0.2.11", + "graceful-fs": "~1.2.0", + "inherits": "1" + }, + "devDependencies": { + "tap": "~0.4.0", + "mkdirp": "0", + "rimraf": "1" + }, + "scripts": { + "test": "tap test/*.js" + }, + "license": "BSD", + "readme": "# Glob\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options]\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not. **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the statCache object is reused between glob calls.\n\nUsers are thus advised not to use a glob result as a\nguarantee of filesystem state in the face of rapid changes.\nFor the vast majority of operations, this is never a problem.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "homepage": "https://github.com/isaacs/node-glob", + "_id": "glob@3.1.21", + "_from": "glob@~3.1.21" +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/00-setup.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/00-setup.js new file mode 100644 index 00000000..245afafd --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/00-setup.js @@ -0,0 +1,176 @@ +// just a little pre-run script to set up the fixtures. +// zz-finish cleans it up + +var mkdirp = require("mkdirp") +var path = require("path") +var i = 0 +var tap = require("tap") +var fs = require("fs") +var rimraf = require("rimraf") + +var files = +[ "a/.abcdef/x/y/z/a" +, "a/abcdef/g/h" +, "a/abcfed/g/h" +, "a/b/c/d" +, "a/bc/e/f" +, "a/c/d/c/b" +, "a/cb/e/f" +] + +var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c") +var symlinkFrom = "../.." + +files = files.map(function (f) { + return path.resolve(__dirname, f) +}) + +tap.test("remove fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "remove fixtures") + t.end() + }) +}) + +files.forEach(function (f) { + tap.test(f, function (t) { + var d = path.dirname(f) + mkdirp(d, 0755, function (er) { + if (er) { + t.fail(er) + return t.bailout() + } + fs.writeFile(f, "i like tests", function (er) { + t.ifError(er, "make file") + t.end() + }) + }) + }) +}) + +if (process.platform !== "win32") { + tap.test("symlinky", function (t) { + var d = path.dirname(symlinkTo) + console.error("mkdirp", d) + mkdirp(d, 0755, function (er) { + t.ifError(er) + fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) { + t.ifError(er, "make symlink") + t.end() + }) + }) + }) +} + +;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) { + w = "/tmp/glob-test/" + w + tap.test("create " + w, function (t) { + mkdirp(w, function (er) { + if (er) + throw er + t.pass(w) + t.end() + }) + }) +}) + + +// generate the bash pattern test-fixtures if possible +if (process.platform === "win32" || !process.env.TEST_REGEN) { + console.error("Windows, or TEST_REGEN unset. Using cached fixtures.") + return +} + +var spawn = require("child_process").spawn; +var globs = + // put more patterns here. + // anything that would be directly in / should be in /tmp/glob-test + ["test/a/*/+(c|g)/./d" + ,"test/a/**/[cg]/../[cg]" + ,"test/a/{b,c,d,e,f}/**/g" + ,"test/a/b/**" + ,"test/**/g" + ,"test/a/abc{fed,def}/g/h" + ,"test/a/abc{fed/g,def}/**/" + ,"test/a/abc{fed/g,def}/**///**/" + ,"test/**/a/**/" + ,"test/+(a|b|c)/a{/,bc*}/**" + ,"test/*/*/*/f" + ,"test/**/f" + ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" + ,"{./*/*,/tmp/glob-test/*}" + ,"{/tmp/glob-test/*,*}" // evil owl face! how you taunt me! + ,"test/a/!(symlink)/**" + ] +var bashOutput = {} +var fs = require("fs") + +globs.forEach(function (pattern) { + tap.test("generate fixture " + pattern, function (t) { + var cmd = "shopt -s globstar && " + + "shopt -s extglob && " + + "shopt -s nullglob && " + + // "shopt >&2; " + + "eval \'for i in " + pattern + "; do echo $i; done\'" + var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) }) + var out = [] + cp.stdout.on("data", function (c) { + out.push(c) + }) + cp.stderr.pipe(process.stderr) + cp.on("close", function (code) { + out = flatten(out) + if (!out) + out = [] + else + out = cleanResults(out.split(/\r*\n/)) + + bashOutput[pattern] = out + t.notOk(code, "bash test should finish nicely") + t.end() + }) + }) +}) + +tap.test("save fixtures", function (t) { + var fname = path.resolve(__dirname, "bash-results.json") + var data = JSON.stringify(bashOutput, null, 2) + "\n" + fs.writeFile(fname, data, function (er) { + t.ifError(er) + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +function flatten (chunks) { + var s = 0 + chunks.forEach(function (c) { s += c.length }) + var out = new Buffer(s) + s = 0 + chunks.forEach(function (c) { + c.copy(out, s) + s += c.length + }) + + return out.toString().trim() +} + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-comparison.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-comparison.js new file mode 100644 index 00000000..239ed1a9 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-comparison.js @@ -0,0 +1,63 @@ +// basic test +// show that it does the same thing by default as the shell. +var tap = require("tap") +, child_process = require("child_process") +, bashResults = require("./bash-results.json") +, globs = Object.keys(bashResults) +, glob = require("../") +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +globs.forEach(function (pattern) { + var expect = bashResults[pattern] + // anything regarding the symlink thing will fail on windows, so just skip it + if (process.platform === "win32" && + expect.some(function (m) { + return /\/symlink\//.test(m) + })) + return + + tap.test(pattern, function (t) { + glob(pattern, function (er, matches) { + if (er) + throw er + + // sort and unmark, just to match the shell results + matches = cleanResults(matches) + + t.deepEqual(matches, expect, pattern) + t.end() + }) + }) + + tap.test(pattern + " sync", function (t) { + var matches = cleanResults(glob.sync(pattern)) + + t.deepEqual(matches, expect, "should match shell") + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/') + }) +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-results.json b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-results.json new file mode 100644 index 00000000..c227449b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/bash-results.json @@ -0,0 +1,348 @@ +{ + "test/a/*/+(c|g)/./d": [ + "test/a/b/c/./d" + ], + "test/a/**/[cg]/../[cg]": [ + "test/a/abcdef/g/../g", + "test/a/abcfed/g/../g", + "test/a/b/c/../c", + "test/a/c/../c", + "test/a/c/d/c/../c", + "test/a/symlink/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c" + ], + "test/a/{b,c,d,e,f}/**/g": [], + "test/a/b/**": [ + "test/a/b", + "test/a/b/c", + "test/a/b/c/d" + ], + "test/**/g": [ + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed,def}/g/h": [ + "test/a/abcdef/g/h", + "test/a/abcfed/g/h" + ], + "test/a/abc{fed/g,def}/**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed/g,def}/**///**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/**/a/**/": [ + "test/a", + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/b", + "test/a/b/c", + "test/a/bc", + "test/a/bc/e", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/cb", + "test/a/cb/e", + "test/a/symlink", + "test/a/symlink/a", + "test/a/symlink/a/b", + "test/a/symlink/a/b/c", + "test/a/symlink/a/b/c/a", + "test/a/symlink/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b" + ], + "test/+(a|b|c)/a{/,bc*}/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h" + ], + "test/*/*/*/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/**/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [ + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c" + ], + "{./*/*,/tmp/glob-test/*}": [ + "./examples/g.js", + "./examples/usr-local.js", + "./node_modules/graceful-fs", + "./node_modules/inherits", + "./node_modules/minimatch", + "./node_modules/mkdirp", + "./node_modules/rimraf", + "./node_modules/tap", + "./test/00-setup.js", + "./test/a", + "./test/bash-comparison.js", + "./test/bash-results.json", + "./test/cwd-test.js", + "./test/mark.js", + "./test/nocase-nomagic.js", + "./test/pause-resume.js", + "./test/root-nomount.js", + "./test/root.js", + "./test/zz-cleanup.js", + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq" + ], + "{/tmp/glob-test/*,*}": [ + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq", + "examples", + "glob.js", + "LICENSE", + "node_modules", + "package.json", + "README.md", + "test" + ], + "test/a/!(symlink)/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h", + "test/a/b", + "test/a/b/c", + "test/a/b/c/d", + "test/a/bc", + "test/a/bc/e", + "test/a/bc/e/f", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/c/d/c/b", + "test/a/cb", + "test/a/cb/e", + "test/a/cb/e/f" + ] +} diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/cwd-test.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/cwd-test.js new file mode 100644 index 00000000..352c27ef --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/cwd-test.js @@ -0,0 +1,55 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing cwd and searching for **/d", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('**/d', function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('a', function (t) { + glob('**/d', {cwd:path.resolve('a')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'b/c/d', 'c/d' ]) + t.end() + }) + }) + + t.test('a/b', function (t) { + glob('**/d', {cwd:path.resolve('a/b')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('a/b/', function (t) { + glob('**/d', {cwd:path.resolve('a/b/')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('.', function (t) { + glob('**/d', {cwd: process.cwd()}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/mark.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/mark.js new file mode 100644 index 00000000..ed68a335 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/mark.js @@ -0,0 +1,74 @@ +var test = require("tap").test +var glob = require('../') +process.chdir(__dirname) + +test("mark, no / on pattern", function (t) { + glob("a/*", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + + if (process.platform !== "win32") + expect.push('a/symlink/') + + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, no / on pattern", function (t) { + glob("a/*", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef', + 'a/abcfed', + 'a/b', + 'a/bc', + 'a/c', + 'a/cb' ] + + if (process.platform !== "win32") + expect.push('a/symlink') + t.same(results, expect) + t.end() + }) +}) + +test("mark=true, / on pattern", function (t) { + glob("a/*/", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, / on pattern", function (t) { + glob("a/*/", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/nocase-nomagic.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/nocase-nomagic.js new file mode 100644 index 00000000..d8629709 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/nocase-nomagic.js @@ -0,0 +1,113 @@ +var fs = require('graceful-fs'); +var test = require('tap').test; +var glob = require('../'); + +test('mock fs', function(t) { + var stat = fs.stat + var statSync = fs.statSync + var readdir = fs.readdir + var readdirSync = fs.readdirSync + + function fakeStat(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = { isDirectory: function() { return true } } + break + case '/tmp/a': + ret = { isDirectory: function() { return false } } + break + } + return ret + } + + fs.stat = function(path, cb) { + var f = fakeStat(path); + if (f) { + process.nextTick(function() { + cb(null, f) + }) + } else { + stat.call(fs, path, cb) + } + } + + fs.statSync = function(path) { + return fakeStat(path) || statSync.call(fs, path) + } + + function fakeReaddir(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = [ 'a', 'A' ] + break + case '/': + ret = ['tmp', 'tMp', 'tMP', 'TMP'] + } + return ret + } + + fs.readdir = function(path, cb) { + var f = fakeReaddir(path) + if (f) + process.nextTick(function() { + cb(null, f) + }) + else + readdir.call(fs, path, cb) + } + + fs.readdirSync = function(path) { + return fakeReaddir(path) || readdirSync.call(fs, path) + } + + t.pass('mocked') + t.end() +}) + +test('nocase, nomagic', function(t) { + var n = 2 + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/a', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) + glob('/tmp/A', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) +}) + +test('nocase, with some magic', function(t) { + t.plan(2) + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/pause-resume.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/pause-resume.js new file mode 100644 index 00000000..e1ffbab1 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/pause-resume.js @@ -0,0 +1,73 @@ +// show that no match events happen while paused. +var tap = require("tap") +, child_process = require("child_process") +// just some gnarly pattern with lots of matches +, pattern = "test/a/!(symlink)/**" +, bashResults = require("./bash-results.json") +, patterns = Object.keys(bashResults) +, glob = require("../") +, Glob = glob.Glob +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +var globResults = [] +tap.test("use a Glob object, and pause/resume it", function (t) { + var g = new Glob(pattern) + , paused = false + , res = [] + , expect = bashResults[pattern] + + g.on("pause", function () { + console.error("pause") + }) + + g.on("resume", function () { + console.error("resume") + }) + + g.on("match", function (m) { + t.notOk(g.paused, "must not be paused") + globResults.push(m) + g.pause() + t.ok(g.paused, "must be paused") + setTimeout(g.resume.bind(g), 10) + }) + + g.on("end", function (matches) { + t.pass("reached glob end") + globResults = cleanResults(globResults) + matches = cleanResults(matches) + t.deepEqual(matches, globResults, + "end event matches should be the same as match events") + + t.deepEqual(matches, expect, + "glob matches should be the same as bash results") + + t.end() + }) +}) + diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root-nomount.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root-nomount.js new file mode 100644 index 00000000..3ac5979b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root-nomount.js @@ -0,0 +1,39 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing root and searching for /b*/**", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.', nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) + }) + + t.test('a', function (t) { + glob('/b*/**', { globDebug: true, root: path.resolve('a'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root.js new file mode 100644 index 00000000..95c23f99 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/root.js @@ -0,0 +1,46 @@ +var t = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +var glob = require('../') +var path = require('path') + +t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) +}) + + +t.test('a', function (t) { + console.error("root=" + path.resolve('a')) + glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) { + t.ifError(er) + var wanted = [ + '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' + ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + }) + + t.like(matches, wanted) + t.end() + }) +}) + +t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + })) + t.end() + }) +}) + +t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/zz-cleanup.js b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/zz-cleanup.js new file mode 100644 index 00000000..e085f0fa --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/glob/test/zz-cleanup.js @@ -0,0 +1,11 @@ +// remove the fixtures +var tap = require("tap") +, rimraf = require("rimraf") +, path = require("path") + +tap.test("cleanup fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "removed") + t.end() + }) +}) diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/README.md b/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/README.md new file mode 100644 index 00000000..cac2c654 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/README.md @@ -0,0 +1,164 @@ +# Lo-Dash v1.0.1 + +A utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features). + +## Download + +* Lo-Dash builds (for modern environments):
      +[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.js) and +[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.min.js) + +* Lo-Dash compatibility builds (for legacy and modern environments):
      +[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.compat.js) and +[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.compat.min.js) + +* Underscore compatibility builds:
      +[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.underscore.js) and +[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.underscore.min.js) + +* CDN copies of ≤ v1.0.1’s builds are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/):
      +[Lo-Dash dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.js), +[Lo-Dash prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.min.js),
      +[Lo-Dash compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.compat.js), +[Lo-Dash compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.compat.min.js),
      +[Underscore compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.underscore.js), and +[Underscore compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.underscore.min.js) + +* For optimal file size, [create a custom build](http://lodash.com/custom-builds) with only the features you need + +## Dive in + +We’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests). + +For a list of upcoming features, check out our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap). + +## Resources + +For more information check out these articles, screencasts, and other videos over Lo-Dash: + + * Posts + - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/) + + * Videos + - [Introducing Lo-Dash](https://vimeo.com/44154599) + - [Lo-Dash optimizations and custom builds](https://vimeo.com/44154601) + - [Lo-Dash’s origin and why it’s a better utility belt](https://vimeo.com/44154600) + - [Unit testing in Lo-Dash](https://vimeo.com/45865290) + - [Lo-Dash’s approach to native method use](https://vimeo.com/48576012) + - [CascadiaJS: Lo-Dash for a better utility belt](http://www.youtube.com/watch?v=dpPy4f_SeEk) + +## Features + + * AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.) + * [_(…)](http://lodash.com/docs#_) supports intuitive chaining + * [_.at](http://lodash.com/docs#at) for cherry-picking collection values + * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”* defined](http://michaux.ca/articles/lazy-function-definition-pattern) methods + * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays and objects + * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` argument + * [_.forEach](http://lodash.com/docs#forEach) is chainable and supports exiting iteration early + * [_.forIn](http://lodash.com/docs#forIn) for iterating over an object’s own and inherited properties + * [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an object’s own properties + * [_.isPlainObject](http://lodash.com/docs#isPlainObject) checks if values are created by the `Object` constructor + * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend) + * [_.partial](http://lodash.com/docs#partial) and [_.partialRight](http://lodash.com/docs#partialRight) for partial application without `this` binding + * [_.template](http://lodash.com/docs#template) supports [*“imports”* options](http://lodash.com/docs#templateSettings_imports), [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6), and [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * [_.where](http://lodash.com/docs#where) supports deep object comparisons + * [_.clone](http://lodash.com/docs#clone), [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), + [and more…](http://lodash.com/docs "_.assign, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept `callback` and `thisArg` arguments + * [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray), + [and more…](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.some, _.sortBy, _.where") accept strings + * [_.filter](http://lodash.com/docs#filter), [_.find](http://lodash.com/docs#find), [_.map](http://lodash.com/docs#map), + [and more…](http://lodash.com/docs "_.countBy, _.every, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* and *“_.where”* `callback` shorthands + +## Support + +Lo-Dash has been tested in at least Chrome 5~24, Firefox 1~18, IE 6-10, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.8.20, Narwhal 0.3.2, PhantomJS 1.8.1, RingoJS 0.9, and Rhino 1.7RC5. + +## Installation and usage + +In browsers: + +```html + +``` + +Using [`npm`](http://npmjs.org/): + +```bash +npm install lodash + +npm install -g lodash +npm link lodash +``` + +To avoid potential issues, update `npm` before installing Lo-Dash: + +```bash +npm install npm -g +``` + +In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/): + +```js +var _ = require('lodash'); + +// or as a drop-in replacement for Underscore +var _ = require('lodash/lodash.underscore'); +``` + +**Note:** If Lo-Dash is installed globally, run [`npm link lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory before requiring it. + +In [RingoJS v0.7.0-](http://ringojs.org/): + +```js +var _ = require('lodash')._; +``` + +In [Rhino](http://www.mozilla.org/rhino/): + +```js +load('lodash.js'); +``` + +In an AMD loader like [RequireJS](http://requirejs.org/): + +```js +require({ + 'paths': { + 'underscore': 'path/to/lodash' + } +}, +['underscore'], function(_) { + console.log(_.VERSION); +}); +``` + +## Release Notes + +### v1.0.1 + + * Add support for specifying source map URLs in `-p`/`--source-map` build options + * Ensured the second argument passed to `_.assign` is not treated as a `callback` + * Ensured `-p`/`--source-map` build options correctly set the `sourceMappingURL` + * Made `-p`/`--source-map` build options set source map *“sources”* keys based on the builds performed + * Made `_.defer` use `setImmediate`, in Node.js, when available + * Made `_.where` search arrays for values regardless of their index position + * Removed dead code from `_.template` + +The full changelog is available [here](https://github.com/lodash/lodash/wiki/Changelog). + +## BestieJS + +Lo-Dash is part of the [BestieJS](https://github.com/bestiejs) *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation. + +## Author + +| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton "Follow @jdalton on Twitter") | +|---| +| [John-David Dalton](http://allyoucanleet.com/) | + +## Contributors + +| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](http://twitter.com/blainebublitz "Follow @BlaineBublitz on Twitter") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias "Follow @mathias on Twitter") | +|---|---|---| +| [Blaine Bublitz](http://iceddev.com/) | [Kit Cambridge](http://kitcambridge.github.io/) | [Mathias Bynens](http://mathiasbynens.be/) | diff --git a/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js b/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js new file mode 100644 index 00000000..37ebc920 --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js @@ -0,0 +1,5152 @@ +/** + * @license + * Lo-Dash 1.0.1 (Custom Build) + * Build: `lodash -o ./dist/lodash.compat.js` + * Copyright 2012-2013 The Dojo Foundation + * Based on Underscore.js 1.4.4 + * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud Inc. + * Available under MIT license + */ +;(function(window, undefined) { + + /** Detect free variable `exports` */ + var freeExports = typeof exports == 'object' && exports; + + /** Detect free variable `module` */ + var freeModule = typeof module == 'object' && module && module.exports == freeExports && module; + + /** Detect free variable `global` and use it as `window` */ + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal) { + window = freeGlobal; + } + + /** Used for array and object method references */ + var arrayRef = [], + objectRef = {}; + + /** Used to generate unique IDs */ + var idCounter = 0; + + /** Used internally to indicate various things */ + var indicatorObject = objectRef; + + /** Used by `cachedContains` as the default size when optimizations are enabled for large arrays */ + var largeArraySize = 30; + + /** Used to restore the original `_` reference in `noConflict` */ + var oldDash = window._; + + /** Used to match HTML entities */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g; + + /** Used to match empty string literals in compiled template source */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match regexp flags from their coerced string values */ + var reFlags = /\w*$/; + + /** Used to detect if a method is native */ + var reNative = RegExp('^' + + (objectRef.valueOf + '') + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/valueOf|for [^\]]+/g, '.+?') + '$' + ); + + /** + * Used to match ES6 template delimiters + * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6 + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match "interpolate" template delimiters */ + var reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to ensure capturing order of template delimiters */ + var reNoMatch = /($^)/; + + /** Used to match HTML characters */ + var reUnescapedHtml = /[&<>"']/g; + + /** Used to match unescaped characters in compiled string literals */ + var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g; + + /** Used to fix the JScript [[DontEnum]] bug */ + var shadowed = [ + 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', + 'toLocaleString', 'toString', 'valueOf' + ]; + + /** Used to make template sourceURLs easier to identify */ + var templateCounter = 0; + + /** Native method shortcuts */ + var ceil = Math.ceil, + concat = arrayRef.concat, + floor = Math.floor, + getPrototypeOf = reNative.test(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, + hasOwnProperty = objectRef.hasOwnProperty, + push = arrayRef.push, + toString = objectRef.toString; + + /* Native method shortcuts for methods with the same name as other `lodash` methods */ + var nativeBind = reNative.test(nativeBind = slice.bind) && nativeBind, + nativeIsArray = reNative.test(nativeIsArray = Array.isArray) && nativeIsArray, + nativeIsFinite = window.isFinite, + nativeIsNaN = window.isNaN, + nativeKeys = reNative.test(nativeKeys = Object.keys) && nativeKeys, + nativeMax = Math.max, + nativeMin = Math.min, + nativeRandom = Math.random; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + /** Detect various environments */ + var isIeOpera = !!window.attachEvent, + isV8 = nativeBind && !/\n|true/.test(nativeBind + isIeOpera); + + /* Detect if `Function#bind` exists and is inferred to be fast (all but V8) */ + var isBindFast = nativeBind && !isV8; + + /* Detect if `Object.keys` exists and is inferred to be fast (IE, Opera, V8) */ + var isKeysFast = nativeKeys && (isIeOpera || isV8); + + /** + * Detect the JScript [[DontEnum]] bug: + * + * In IE < 9 an objects own properties, shadowing non-enumerable ones, are + * made non-enumerable as well. + */ + var hasDontEnumBug; + + /** + * Detect if a `prototype` properties are enumerable by default: + * + * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1 + * (if the prototype or a property on the prototype has been set) + * incorrectly sets a function's `prototype` property [[Enumerable]] + * value to `true`. + */ + var hasEnumPrototype; + + /** Detect if own properties are iterated after inherited properties (IE < 9) */ + var iteratesOwnLast; + + /** + * Detect if `Array#shift` and `Array#splice` augment array-like objects + * incorrectly: + * + * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()` + * and `splice()` functions that fail to remove the last element, `value[0]`, + * of array-like objects even though the `length` property is set to `0`. + * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()` + * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9. + */ + var hasObjectSpliceBug = (hasObjectSpliceBug = { '0': 1, 'length': 1 }, + arrayRef.splice.call(hasObjectSpliceBug, 0, 1), hasObjectSpliceBug[0]); + + /** Detect if `arguments` object indexes are non-enumerable (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1) */ + var nonEnumArgs = true; + + (function() { + var props = []; + function ctor() { this.x = 1; } + ctor.prototype = { 'valueOf': 1, 'y': 1 }; + for (var prop in new ctor) { props.push(prop); } + for (prop in arguments) { nonEnumArgs = !prop; } + + hasDontEnumBug = !/valueOf/.test(props); + hasEnumPrototype = ctor.propertyIsEnumerable('prototype'); + iteratesOwnLast = props[0] != 'x'; + }(1)); + + /** Detect if `arguments` objects are `Object` objects (all but Opera < 10.5) */ + var argsAreObjects = arguments.constructor == Object; + + /** Detect if `arguments` objects [[Class]] is unresolvable (Firefox < 4, IE < 9) */ + var noArgsClass = !isArguments(arguments); + + /** + * Detect lack of support for accessing string characters by index: + * + * IE < 8 can't access characters by index and IE 8 can only access + * characters by index on string literals. + */ + var noCharByIndex = ('x'[0] + Object('x')[0]) != 'xx'; + + /** + * Detect if a DOM node's [[Class]] is unresolvable (IE < 9) + * and that the JS engine won't error when attempting to coerce an object to + * a string without a `toString` function. + */ + try { + var noNodeClass = toString.call(document) == objectClass && !({ 'toString': 0 } + ''); + } catch(e) { } + + /** Used to identify object classifications that `_.clone` supports */ + var cloneableClasses = {}; + cloneableClasses[funcClass] = false; + cloneableClasses[argsClass] = cloneableClasses[arrayClass] = + cloneableClasses[boolClass] = cloneableClasses[dateClass] = + cloneableClasses[numberClass] = cloneableClasses[objectClass] = + cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true; + + /** Used to lookup a built-in constructor by [[Class]] */ + var ctorByClass = {}; + ctorByClass[arrayClass] = Array; + ctorByClass[boolClass] = Boolean; + ctorByClass[dateClass] = Date; + ctorByClass[objectClass] = Object; + ctorByClass[numberClass] = Number; + ctorByClass[regexpClass] = RegExp; + ctorByClass[stringClass] = String; + + /** Used to determine if values are of the language type Object */ + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + /** Used to escape characters for inclusion in compiled string literals */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\t': 't', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object, that wraps the given `value`, to enable method + * chaining. + * + * In addition to Lo-Dash methods, wrappers also have the following `Array` methods: + * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`, + * and `unshift` + * + * The chainable wrapper functions are: + * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`, `compose`, + * `concat`, `countBy`, `debounce`, `defaults`, `defer`, `delay`, `difference`, + * `filter`, `flatten`, `forEach`, `forIn`, `forOwn`, `functions`, `groupBy`, + * `initial`, `intersection`, `invert`, `invoke`, `keys`, `map`, `max`, `memoize`, + * `merge`, `min`, `object`, `omit`, `once`, `pairs`, `partial`, `partialRight`, + * `pick`, `pluck`, `push`, `range`, `reject`, `rest`, `reverse`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, + * `union`, `uniq`, `unshift`, `values`, `where`, `without`, `wrap`, and `zip` + * + * The non-chainable wrapper functions are: + * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `has`, `identity`, + * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`, + * `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`, `isObject`, + * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`, `lastIndexOf`, + * `mixin`, `noConflict`, `pop`, `random`, `reduce`, `reduceRight`, `result`, + * `shift`, `size`, `some`, `sortedIndex`, `template`, `unescape`, and `uniqueId` + * + * The wrapper functions `first` and `last` return wrapped values when `n` is + * passed, otherwise they return unwrapped values. + * + * @name _ + * @constructor + * @category Chaining + * @param {Mixed} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns a `lodash` instance. + */ + function lodash(value) { + // exit early if already wrapped, even if wrapped by a different `lodash` constructor + if (value && typeof value == 'object' && value.__wrapped__) { + return value; + } + // allow invoking `lodash` without the `new` operator + if (!(this instanceof lodash)) { + return new lodash(value); + } + this.__wrapped__ = value; + } + + /** + * By default, the template delimiters used by Lo-Dash are similar to those in + * embedded Ruby (ERB). Change the following template settings to use alternative + * delimiters. + * + * @static + * @memberOf _ + * @type Object + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'escape': /<%-([\s\S]+?)%>/g, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'evaluate': /<%([\s\S]+?)%>/g, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type String + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type Object + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type Function + */ + '_': lodash + } + }; + + /*--------------------------------------------------------------------------*/ + + /** + * The template used to create iterator functions. + * + * @private + * @param {Obect} data The data object used to populate the text. + * @returns {String} Returns the interpolated text. + */ + var iteratorTemplate = function(obj) { + + var __p = 'var index, iterable = ' + + (obj.firstArg ) + + ', result = iterable;\nif (!iterable) return result;\n' + + (obj.top ) + + ';\n'; + if (obj.arrays) { + __p += 'var length = iterable.length; index = -1;\nif (' + + (obj.arrays ) + + ') { '; + if (obj.noCharByIndex) { + __p += '\n if (isString(iterable)) {\n iterable = iterable.split(\'\')\n } '; + } ; + __p += '\n while (++index < length) {\n ' + + (obj.loop ) + + '\n }\n}\nelse { '; + } else if (obj.nonEnumArgs) { + __p += '\n var length = iterable.length; index = -1;\n if (length && isArguments(iterable)) {\n while (++index < length) {\n index += \'\';\n ' + + (obj.loop ) + + '\n }\n } else { '; + } ; + + if (obj.hasEnumPrototype) { + __p += '\n var skipProto = typeof iterable == \'function\';\n '; + } ; + + if (obj.isKeysFast && obj.useHas) { + __p += '\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] ? nativeKeys(iterable) : [],\n length = ownProps.length;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n '; + if (obj.hasEnumPrototype) { + __p += 'if (!(skipProto && index == \'prototype\')) {\n '; + } ; + __p += + (obj.loop ) + + ''; + if (obj.hasEnumPrototype) { + __p += '}\n'; + } ; + __p += ' } '; + } else { + __p += '\n for (index in iterable) {'; + if (obj.hasEnumPrototype || obj.useHas) { + __p += '\n if ('; + if (obj.hasEnumPrototype) { + __p += '!(skipProto && index == \'prototype\')'; + } if (obj.hasEnumPrototype && obj.useHas) { + __p += ' && '; + } if (obj.useHas) { + __p += 'hasOwnProperty.call(iterable, index)'; + } ; + __p += ') { '; + } ; + __p += + (obj.loop ) + + '; '; + if (obj.hasEnumPrototype || obj.useHas) { + __p += '\n }'; + } ; + __p += '\n } '; + } ; + + if (obj.hasDontEnumBug) { + __p += '\n\n var ctor = iterable.constructor;\n '; + for (var k = 0; k < 7; k++) { + __p += '\n index = \'' + + (obj.shadowed[k] ) + + '\';\n if ('; + if (obj.shadowed[k] == 'constructor') { + __p += '!(ctor && ctor.prototype === iterable) && '; + } ; + __p += 'hasOwnProperty.call(iterable, index)) {\n ' + + (obj.loop ) + + '\n } '; + } ; + + } ; + + if (obj.arrays || obj.nonEnumArgs) { + __p += '\n}'; + } ; + __p += + (obj.bottom ) + + ';\nreturn result'; + + + return __p + }; + + /** Reusable iterator options for `assign` and `defaults` */ + var defaultsIteratorOptions = { + 'args': 'object, source, guard', + 'top': + 'var args = arguments,\n' + + ' argsIndex = 0,\n' + + " argsLength = typeof guard == 'number' ? 2 : args.length;\n" + + 'while (++argsIndex < argsLength) {\n' + + ' iterable = args[argsIndex];\n' + + ' if (iterable && objectTypes[typeof iterable]) {', + 'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]", + 'bottom': ' }\n}' + }; + + /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */ + var eachIteratorOptions = { + 'args': 'collection, callback, thisArg', + 'top': "callback = callback && typeof thisArg == 'undefined' ? callback : createCallback(callback, thisArg)", + 'arrays': "typeof length == 'number'", + 'loop': 'if (callback(iterable[index], index, collection) === false) return result' + }; + + /** Reusable iterator options for `forIn` and `forOwn` */ + var forOwnIteratorOptions = { + 'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top, + 'arrays': false + }; + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a function optimized to search large arrays for a given `value`, + * starting at `fromIndex`, using strict equality for comparisons, i.e. `===`. + * + * @private + * @param {Array} array The array to search. + * @param {Mixed} value The value to search for. + * @param {Number} [fromIndex=0] The index to search from. + * @param {Number} [largeSize=30] The length at which an array is considered large. + * @returns {Boolean} Returns `true`, if `value` is found, else `false`. + */ + function cachedContains(array, fromIndex, largeSize) { + fromIndex || (fromIndex = 0); + + var length = array.length, + isLarge = (length - fromIndex) >= (largeSize || largeArraySize); + + if (isLarge) { + var cache = {}, + index = fromIndex - 1; + + while (++index < length) { + // manually coerce `value` to a string because `hasOwnProperty`, in some + // older versions of Firefox, coerces objects incorrectly + var key = array[index] + ''; + (hasOwnProperty.call(cache, key) ? cache[key] : (cache[key] = [])).push(array[index]); + } + } + return function(value) { + if (isLarge) { + var key = value + ''; + return hasOwnProperty.call(cache, key) && indexOf(cache[key], value) > -1; + } + return indexOf(array, value, fromIndex) > -1; + } + } + + /** + * Used by `_.max` and `_.min` as the default `callback` when a given + * `collection` is a string value. + * + * @private + * @param {String} value The character to inspect. + * @returns {Number} Returns the code unit of given character. + */ + function charAtCallback(value) { + return value.charCodeAt(0); + } + + /** + * Used by `sortBy` to compare transformed `collection` values, stable sorting + * them in ascending order. + * + * @private + * @param {Object} a The object to compare to `b`. + * @param {Object} b The object to compare to `a`. + * @returns {Number} Returns the sort order indicator of `1` or `-1`. + */ + function compareAscending(a, b) { + var ai = a.index, + bi = b.index; + + a = a.criteria; + b = b.criteria; + + // ensure a stable sort in V8 and other engines + // http://code.google.com/p/v8/issues/detail?id=90 + if (a !== b) { + if (a > b || typeof a == 'undefined') { + return 1; + } + if (a < b || typeof b == 'undefined') { + return -1; + } + } + return ai < bi ? -1 : 1; + } + + /** + * Creates a function that, when called, invokes `func` with the `this` binding + * of `thisArg` and prepends any `partialArgs` to the arguments passed to the + * bound function. + * + * @private + * @param {Function|String} func The function to bind or the method name. + * @param {Mixed} [thisArg] The `this` binding of `func`. + * @param {Array} partialArgs An array of arguments to be partially applied. + * @param {Object} [rightIndicator] Used to indicate partially applying arguments from the right. + * @returns {Function} Returns the new bound function. + */ + function createBound(func, thisArg, partialArgs, rightIndicator) { + var isFunc = isFunction(func), + isPartial = !partialArgs, + key = thisArg; + + // juggle arguments + if (isPartial) { + partialArgs = thisArg; + } + if (!isFunc) { + thisArg = func; + } + + function bound() { + // `Function#bind` spec + // http://es5.github.com/#x15.3.4.5 + var args = arguments, + thisBinding = isPartial ? this : thisArg; + + if (!isFunc) { + func = thisArg[key]; + } + if (partialArgs.length) { + args = args.length + ? (args = slice(args), rightIndicator ? args.concat(partialArgs) : partialArgs.concat(args)) + : partialArgs; + } + if (this instanceof bound) { + // ensure `new bound` is an instance of `bound` and `func` + noop.prototype = func.prototype; + thisBinding = new noop; + noop.prototype = null; + + // mimic the constructor's `return` behavior + // http://es5.github.com/#x13.2.2 + var result = func.apply(thisBinding, args); + return isObject(result) ? result : thisBinding; + } + return func.apply(thisBinding, args); + } + return bound; + } + + /** + * Produces a callback bound to an optional `thisArg`. If `func` is a property + * name, the created callback will return the property value for a given element. + * If `func` is an object, the created callback will return `true` for elements + * that contain the equivalent object properties, otherwise it will return `false`. + * + * @private + * @param {Mixed} [func=identity] The value to convert to a callback. + * @param {Mixed} [thisArg] The `this` binding of the created callback. + * @param {Number} [argCount=3] The number of arguments the callback accepts. + * @returns {Function} Returns a callback function. + */ + function createCallback(func, thisArg, argCount) { + if (func == null) { + return identity; + } + var type = typeof func; + if (type != 'function') { + if (type != 'object') { + return function(object) { + return object[func]; + }; + } + var props = keys(func); + return function(object) { + var length = props.length, + result = false; + while (length--) { + if (!(result = isEqual(object[props[length]], func[props[length]], indicatorObject))) { + break; + } + } + return result; + }; + } + if (typeof thisArg != 'undefined') { + if (argCount === 1) { + return function(value) { + return func.call(thisArg, value); + }; + } + if (argCount === 2) { + return function(a, b) { + return func.call(thisArg, a, b); + }; + } + if (argCount === 4) { + return function(accumulator, value, index, object) { + return func.call(thisArg, accumulator, value, index, object); + }; + } + return function(value, index, object) { + return func.call(thisArg, value, index, object); + }; + } + return func; + } + + /** + * Creates compiled iteration functions. + * + * @private + * @param {Object} [options1, options2, ...] The compile options object(s). + * arrays - A string of code to determine if the iterable is an array or array-like. + * useHas - A boolean to specify using `hasOwnProperty` checks in the object loop. + * args - A string of comma separated arguments the iteration function will accept. + * top - A string of code to execute before the iteration branches. + * loop - A string of code to execute in the object loop. + * bottom - A string of code to execute after the iteration branches. + * + * @returns {Function} Returns the compiled function. + */ + function createIterator() { + var data = { + // support properties + 'hasDontEnumBug': hasDontEnumBug, + 'hasEnumPrototype': hasEnumPrototype, + 'isKeysFast': isKeysFast, + 'nonEnumArgs': nonEnumArgs, + 'noCharByIndex': noCharByIndex, + 'shadowed': shadowed, + + // iterator options + 'arrays': 'isArray(iterable)', + 'bottom': '', + 'loop': '', + 'top': '', + 'useHas': true + }; + + // merge options into a template data object + for (var object, index = 0; object = arguments[index]; index++) { + for (var key in object) { + data[key] = object[key]; + } + } + var args = data.args; + data.firstArg = /^[^,]+/.exec(args)[0]; + + // create the function factory + var factory = Function( + 'createCallback, hasOwnProperty, isArguments, isArray, isString, ' + + 'objectTypes, nativeKeys', + 'return function(' + args + ') {\n' + iteratorTemplate(data) + '\n}' + ); + // return the compiled function + return factory( + createCallback, hasOwnProperty, isArguments, isArray, isString, + objectTypes, nativeKeys + ); + } + + /** + * A function compiled to iterate `arguments` objects, arrays, objects, and + * strings consistenly across environments, executing the `callback` for each + * element in the `collection`. The `callback` is bound to `thisArg` and invoked + * with three arguments; (value, index|key, collection). Callbacks may exit + * iteration early by explicitly returning `false`. + * + * @private + * @type Function + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array|Object|String} Returns `collection`. + */ + var each = createIterator(eachIteratorOptions); + + /** + * Used by `template` to escape characters for inclusion in compiled + * string literals. + * + * @private + * @param {String} match The matched character to escape. + * @returns {String} Returns the escaped character. + */ + function escapeStringChar(match) { + return '\\' + stringEscapes[match]; + } + + /** + * Used by `escape` to convert characters to HTML entities. + * + * @private + * @param {String} match The matched character to escape. + * @returns {String} Returns the escaped character. + */ + function escapeHtmlChar(match) { + return htmlEscapes[match]; + } + + /** + * Checks if `value` is a DOM node in IE < 9. + * + * @private + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true` if the `value` is a DOM node, else `false`. + */ + function isNode(value) { + // IE < 9 presents DOM nodes as `Object` objects except they have `toString` + // methods that are `typeof` "string" and still can coerce nodes to strings + return typeof value.toString != 'function' && typeof (value + '') == 'string'; + } + + /** + * A no-operation function. + * + * @private + */ + function noop() { + // no operation performed + } + + /** + * Slices the `collection` from the `start` index up to, but not including, + * the `end` index. + * + * Note: This function is used, instead of `Array#slice`, to support node lists + * in IE < 9 and to ensure dense arrays are returned. + * + * @private + * @param {Array|Object|String} collection The collection to slice. + * @param {Number} start The start index. + * @param {Number} end The end index. + * @returns {Array} Returns the new array. + */ + function slice(array, start, end) { + start || (start = 0); + if (typeof end == 'undefined') { + end = array ? array.length : 0; + } + var index = -1, + length = end - start || 0, + result = Array(length < 0 ? 0 : length); + + while (++index < length) { + result[index] = array[start + index]; + } + return result; + } + + /** + * Used by `unescape` to convert HTML entities to characters. + * + * @private + * @param {String} match The matched character to unescape. + * @returns {String} Returns the unescaped character. + */ + function unescapeHtmlChar(match) { + return htmlUnescapes[match]; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Checks if `value` is an `arguments` object. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is an `arguments` object, else `false`. + * @example + * + * (function() { return _.isArguments(arguments); })(1, 2, 3); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + function isArguments(value) { + return toString.call(value) == argsClass; + } + // fallback for browsers that can't detect `arguments` objects by [[Class]] + if (noArgsClass) { + isArguments = function(value) { + return value ? hasOwnProperty.call(value, 'callee') : false; + }; + } + + /** + * Iterates over `object`'s own and inherited enumerable properties, executing + * the `callback` for each property. The `callback` is bound to `thisArg` and + * invoked with three arguments; (value, key, object). Callbacks may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @type Function + * @category Objects + * @param {Object} object The object to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns `object`. + * @example + * + * function Dog(name) { + * this.name = name; + * } + * + * Dog.prototype.bark = function() { + * alert('Woof, woof!'); + * }; + * + * _.forIn(new Dog('Dagny'), function(value, key) { + * alert(key); + * }); + * // => alerts 'name' and 'bark' (order is not guaranteed) + */ + var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, { + 'useHas': false + }); + + /** + * Iterates over an object's own enumerable properties, executing the `callback` + * for each property. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, key, object). Callbacks may exit iteration early by explicitly + * returning `false`. + * + * @static + * @memberOf _ + * @type Function + * @category Objects + * @param {Object} object The object to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns `object`. + * @example + * + * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) { + * alert(key); + * }); + * // => alerts '0', '1', and 'length' (order is not guaranteed) + */ + var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions); + + /** + * Checks if `value` is an array. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is an array, else `false`. + * @example + * + * (function() { return _.isArray(arguments); })(); + * // => false + * + * _.isArray([1, 2, 3]); + * // => true + */ + var isArray = nativeIsArray || function(value) { + // `instanceof` may cause a memory leak in IE 7 if `value` is a host object + // http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak + return (argsAreObjects && value instanceof Array) || toString.call(value) == arrayClass; + }; + + /** + * Creates an array composed of the own enumerable property names of `object`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The object to inspect. + * @returns {Array} Returns a new array of property names. + * @example + * + * _.keys({ 'one': 1, 'two': 2, 'three': 3 }); + * // => ['one', 'two', 'three'] (order is not guaranteed) + */ + var keys = !nativeKeys ? shimKeys : function(object) { + if (!isObject(object)) { + return []; + } + if ((hasEnumPrototype && typeof object == 'function') || + (nonEnumArgs && object.length && isArguments(object))) { + return shimKeys(object); + } + return nativeKeys(object); + }; + + /** + * A fallback implementation of `isPlainObject` that checks if a given `value` + * is an object created by the `Object` constructor, assuming objects created + * by the `Object` constructor have no inherited enumerable properties and that + * there are no `Object.prototype` extensions. + * + * @private + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if `value` is a plain object, else `false`. + */ + function shimIsPlainObject(value) { + // avoid non-objects and false positives for `arguments` objects + var result = false; + if (!(value && typeof value == 'object') || isArguments(value)) { + return result; + } + // check that the constructor is `Object` (i.e. `Object instanceof Object`) + var ctor = value.constructor; + if ((!isFunction(ctor) && (!noNodeClass || !isNode(value))) || ctor instanceof ctor) { + // IE < 9 iterates inherited properties before own properties. If the first + // iterated property is an object's own property then there are no inherited + // enumerable properties. + if (iteratesOwnLast) { + forIn(value, function(value, key, object) { + result = !hasOwnProperty.call(object, key); + return false; + }); + return result === false; + } + // In most environments an object's own properties are iterated before + // its inherited properties. If the last iterated property is an object's + // own property then there are no inherited enumerable properties. + forIn(value, function(value, key) { + result = key; + }); + return result === false || hasOwnProperty.call(value, result); + } + return result; + } + + /** + * A fallback implementation of `Object.keys` that produces an array of the + * given object's own enumerable property names. + * + * @private + * @param {Object} object The object to inspect. + * @returns {Array} Returns a new array of property names. + */ + function shimKeys(object) { + var result = []; + forOwn(object, function(value, key) { + result.push(key); + }); + return result; + } + + /** + * Used to convert characters to HTML entities: + * + * Though the `>` character is escaped for symmetry, characters like `>` and `/` + * don't require escaping in HTML and have no special meaning unless they're part + * of a tag or an unquoted attribute value. + * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact") + */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to convert HTML entities to characters */ + var htmlUnescapes = invert(htmlEscapes); + + /*--------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources will overwrite propery assignments of previous + * sources. If a `callback` function is passed, it will be executed to produce + * the assigned values. The `callback` is bound to `thisArg` and invoked with + * two arguments; (objectValue, sourceValue). + * + * @static + * @memberOf _ + * @type Function + * @alias extend + * @category Objects + * @param {Object} object The destination object. + * @param {Object} [source1, source2, ...] The source objects. + * @param {Function} [callback] The function to customize assigning values. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns the destination object. + * @example + * + * _.assign({ 'name': 'moe' }, { 'age': 40 }); + * // => { 'name': 'moe', 'age': 40 } + * + * var defaults = _.partialRight(_.assign, function(a, b) { + * return typeof a == 'undefined' ? b : a; + * }); + * + * var food = { 'name': 'apple' }; + * defaults(food, { 'name': 'banana', 'type': 'fruit' }); + * // => { 'name': 'apple', 'type': 'fruit' } + */ + var assign = createIterator(defaultsIteratorOptions, { + 'top': + defaultsIteratorOptions.top.replace(';', + ';\n' + + "if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n" + + ' var callback = createCallback(args[--argsLength - 1], args[argsLength--], 2);\n' + + "} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n" + + ' callback = args[--argsLength];\n' + + '}' + ), + 'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]' + }); + + /** + * Creates a clone of `value`. If `deep` is `true`, nested objects will also + * be cloned, otherwise they will be assigned by reference. If a `callback` + * function is passed, it will be executed to produce the cloned values. If + * `callback` returns `undefined`, cloning will be handled by the method instead. + * The `callback` is bound to `thisArg` and invoked with one argument; (value). + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to clone. + * @param {Boolean} [deep=false] A flag to indicate a deep clone. + * @param {Function} [callback] The function to customize cloning values. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @param- {Array} [stackA=[]] Internally used to track traversed source objects. + * @param- {Array} [stackB=[]] Internally used to associate clones with source counterparts. + * @returns {Mixed} Returns the cloned `value`. + * @example + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * var shallow = _.clone(stooges); + * shallow[0] === stooges[0]; + * // => true + * + * var deep = _.clone(stooges, true); + * deep[0] === stooges[0]; + * // => false + * + * _.mixin({ + * 'clone': _.partialRight(_.clone, function(value) { + * return _.isElement(value) ? value.cloneNode(false) : undefined; + * }) + * }); + * + * var clone = _.clone(document.body); + * clone.childNodes.length; + * // => 0 + */ + function clone(value, deep, callback, thisArg, stackA, stackB) { + var result = value; + + // allows working with "Collections" methods without using their `callback` + // argument, `index|key`, for this method's `callback` + if (typeof deep == 'function') { + thisArg = callback; + callback = deep; + deep = false; + } + if (typeof callback == 'function') { + callback = typeof thisArg == 'undefined' ? callback : createCallback(callback, thisArg, 1); + result = callback(result); + + var done = typeof result != 'undefined'; + if (!done) { + result = value; + } + } + // inspect [[Class]] + var isObj = isObject(result); + if (isObj) { + var className = toString.call(result); + if (!cloneableClasses[className] || (noNodeClass && isNode(result))) { + return result; + } + var isArr = isArray(result); + } + // shallow clone + if (!isObj || !deep) { + return isObj && !done + ? (isArr ? slice(result) : assign({}, result)) + : result; + } + var ctor = ctorByClass[className]; + switch (className) { + case boolClass: + case dateClass: + return done ? result : new ctor(+result); + + case numberClass: + case stringClass: + return done ? result : new ctor(result); + + case regexpClass: + return done ? result : ctor(result.source, reFlags.exec(result)); + } + // check for circular references and return corresponding clone + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == value) { + return stackB[length]; + } + } + // init cloned object + if (!done) { + result = isArr ? ctor(result.length) : {}; + + // add array properties assigned by `RegExp#exec` + if (isArr) { + if (hasOwnProperty.call(value, 'index')) { + result.index = value.index; + } + if (hasOwnProperty.call(value, 'input')) { + result.input = value.input; + } + } + } + // add the source value to the stack of traversed objects + // and associate it with its clone + stackA.push(value); + stackB.push(result); + + // recursively populate clone (susceptible to call stack limits) + (isArr ? forEach : forOwn)(done ? result : value, function(objValue, key) { + result[key] = clone(objValue, deep, callback, undefined, stackA, stackB); + }); + + return result; + } + + /** + * Creates a deep clone of `value`. If a `callback` function is passed, it will + * be executed to produce the cloned values. If `callback` returns the value it + * was passed, cloning will be handled by the method instead. The `callback` is + * bound to `thisArg` and invoked with one argument; (value). + * + * Note: This function is loosely based on the structured clone algorithm. Functions + * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and + * objects created by constructors other than `Object` are cloned to plain `Object` objects. + * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to deep clone. + * @param {Function} [callback] The function to customize cloning values. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the deep cloned `value`. + * @example + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * var deep = _.cloneDeep(stooges); + * deep[0] === stooges[0]; + * // => false + * + * var view = { + * 'label': 'docs', + * 'node': element + * }; + * + * var clone = _.cloneDeep(view, function(value) { + * return _.isElement(value) ? value.cloneNode(true) : value; + * }); + * + * clone.node == view.node; + * // => false + */ + function cloneDeep(value, callback, thisArg) { + return clone(value, true, callback, thisArg); + } + + /** + * Assigns own enumerable properties of source object(s) to the destination + * object for all destination properties that resolve to `undefined`. Once a + * property is set, additional defaults of the same property will be ignored. + * + * @static + * @memberOf _ + * @type Function + * @category Objects + * @param {Object} object The destination object. + * @param {Object} [source1, source2, ...] The source objects. + * @param- {Object} [guard] Internally used to allow working with `_.reduce` + * without using its callback's `key` and `object` arguments as sources. + * @returns {Object} Returns the destination object. + * @example + * + * var food = { 'name': 'apple' }; + * _.defaults(food, { 'name': 'banana', 'type': 'fruit' }); + * // => { 'name': 'apple', 'type': 'fruit' } + */ + var defaults = createIterator(defaultsIteratorOptions); + + /** + * Creates a sorted array of all enumerable properties, own and inherited, + * of `object` that have function values. + * + * @static + * @memberOf _ + * @alias methods + * @category Objects + * @param {Object} object The object to inspect. + * @returns {Array} Returns a new array of property names that have function values. + * @example + * + * _.functions(_); + * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...] + */ + function functions(object) { + var result = []; + forIn(object, function(value, key) { + if (isFunction(value)) { + result.push(key); + } + }); + return result.sort(); + } + + /** + * Checks if the specified object `property` exists and is a direct property, + * instead of an inherited property. + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The object to check. + * @param {String} property The property to check for. + * @returns {Boolean} Returns `true` if key is a direct property, else `false`. + * @example + * + * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b'); + * // => true + */ + function has(object, property) { + return object ? hasOwnProperty.call(object, property) : false; + } + + /** + * Creates an object composed of the inverted keys and values of the given `object`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The object to invert. + * @returns {Object} Returns the created inverted object. + * @example + * + * _.invert({ 'first': 'moe', 'second': 'larry' }); + * // => { 'moe': 'first', 'larry': 'second' } (order is not guaranteed) + */ + function invert(object) { + var index = -1, + props = keys(object), + length = props.length, + result = {}; + + while (++index < length) { + var key = props[index]; + result[object[key]] = key; + } + return result; + } + + /** + * Checks if `value` is a boolean value. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a boolean value, else `false`. + * @example + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || toString.call(value) == boolClass; + } + + /** + * Checks if `value` is a date. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a date, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + */ + function isDate(value) { + return value instanceof Date || toString.call(value) == dateClass; + } + + /** + * Checks if `value` is a DOM element. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + */ + function isElement(value) { + return value ? value.nodeType === 1 : false; + } + + /** + * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a + * length of `0` and objects with no own enumerable properties are considered + * "empty". + * + * @static + * @memberOf _ + * @category Objects + * @param {Array|Object|String} value The value to inspect. + * @returns {Boolean} Returns `true`, if the `value` is empty, else `false`. + * @example + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({}); + * // => true + * + * _.isEmpty(''); + * // => true + */ + function isEmpty(value) { + var result = true; + if (!value) { + return result; + } + var className = toString.call(value), + length = value.length; + + if ((className == arrayClass || className == stringClass || + className == argsClass || (noArgsClass && isArguments(value))) || + (className == objectClass && typeof length == 'number' && isFunction(value.splice))) { + return !length; + } + forOwn(value, function() { + return (result = false); + }); + return result; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent to each other. If `callback` is passed, it will be executed to + * compare values. If `callback` returns `undefined`, comparisons will be handled + * by the method instead. The `callback` is bound to `thisArg` and invoked with + * two arguments; (a, b). + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} a The value to compare. + * @param {Mixed} b The other value to compare. + * @param {Function} [callback] The function to customize comparing values. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @param- {Object} [stackA=[]] Internally used track traversed `a` objects. + * @param- {Object} [stackB=[]] Internally used track traversed `b` objects. + * @returns {Boolean} Returns `true`, if the values are equvalent, else `false`. + * @example + * + * var moe = { 'name': 'moe', 'age': 40 }; + * var copy = { 'name': 'moe', 'age': 40 }; + * + * moe == copy; + * // => false + * + * _.isEqual(moe, copy); + * // => true + * + * var words = ['hello', 'goodbye']; + * var otherWords = ['hi', 'goodbye']; + * + * _.isEqual(words, otherWords, function(a, b) { + * var reGreet = /^(?:hello|hi)$/i, + * aGreet = _.isString(a) && reGreet.test(a), + * bGreet = _.isString(b) && reGreet.test(b); + * + * return (aGreet || bGreet) ? (aGreet == bGreet) : undefined; + * }); + * // => true + */ + function isEqual(a, b, callback, thisArg, stackA, stackB) { + // used to indicate that when comparing objects, `a` has at least the properties of `b` + var whereIndicator = callback === indicatorObject; + if (callback && !whereIndicator) { + callback = typeof thisArg == 'undefined' ? callback : createCallback(callback, thisArg, 2); + var result = callback(a, b); + if (typeof result != 'undefined') { + return !!result; + } + } + // exit early for identical values + if (a === b) { + // treat `+0` vs. `-0` as not equal + return a !== 0 || (1 / a == 1 / b); + } + var type = typeof a, + otherType = typeof b; + + // exit early for unlike primitive values + if (a === a && + (!a || (type != 'function' && type != 'object')) && + (!b || (otherType != 'function' && otherType != 'object'))) { + return false; + } + // exit early for `null` and `undefined`, avoiding ES3's Function#call behavior + // http://es5.github.com/#x15.3.4.4 + if (a == null || b == null) { + return a === b; + } + // compare [[Class]] names + var className = toString.call(a), + otherClass = toString.call(b); + + if (className == argsClass) { + className = objectClass; + } + if (otherClass == argsClass) { + otherClass = objectClass; + } + if (className != otherClass) { + return false; + } + switch (className) { + case boolClass: + case dateClass: + // coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0`, treating invalid dates coerced to `NaN` as not equal + return +a == +b; + + case numberClass: + // treat `NaN` vs. `NaN` as equal + return a != +a + ? b != +b + // but treat `+0` vs. `-0` as not equal + : (a == 0 ? (1 / a == 1 / b) : a == +b); + + case regexpClass: + case stringClass: + // coerce regexes to strings (http://es5.github.com/#x15.10.6.4) + // treat string primitives and their corresponding object instances as equal + return a == b + ''; + } + var isArr = className == arrayClass; + if (!isArr) { + // unwrap any `lodash` wrapped values + if (a.__wrapped__ || b.__wrapped__) { + return isEqual(a.__wrapped__ || a, b.__wrapped__ || b, callback, thisArg, stackA, stackB); + } + // exit for functions and DOM nodes + if (className != objectClass || (noNodeClass && (isNode(a) || isNode(b)))) { + return false; + } + // in older versions of Opera, `arguments` objects have `Array` constructors + var ctorA = !argsAreObjects && isArguments(a) ? Object : a.constructor, + ctorB = !argsAreObjects && isArguments(b) ? Object : b.constructor; + + // non `Object` object instances with different constructors are not equal + if (ctorA != ctorB && !( + isFunction(ctorA) && ctorA instanceof ctorA && + isFunction(ctorB) && ctorB instanceof ctorB + )) { + return false; + } + } + // assume cyclic structures are equal + // the algorithm for detecting cyclic structures is adapted from ES 5.1 + // section 15.12.3, abstract operation `JO` (http://es5.github.com/#x15.12.3) + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == a) { + return stackB[length] == b; + } + } + var size = 0; + result = true; + + // add `a` and `b` to the stack of traversed objects + stackA.push(a); + stackB.push(b); + + // recursively compare objects and arrays (susceptible to call stack limits) + if (isArr) { + length = a.length; + size = b.length; + + // compare lengths to determine if a deep comparison is necessary + result = size == a.length; + if (!result && !whereIndicator) { + return result; + } + // deep compare the contents, ignoring non-numeric properties + while (size--) { + var index = length, + value = b[size]; + + if (whereIndicator) { + while (index--) { + if ((result = isEqual(a[index], value, callback, thisArg, stackA, stackB))) { + break; + } + } + } else if (!(result = isEqual(a[size], value, callback, thisArg, stackA, stackB))) { + break; + } + } + return result; + } + // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys` + // which, in this case, is more costly + forIn(b, function(value, key, b) { + if (hasOwnProperty.call(b, key)) { + // count the number of properties. + size++; + // deep compare each property value. + return (result = hasOwnProperty.call(a, key) && isEqual(a[key], value, callback, thisArg, stackA, stackB)); + } + }); + + if (result && !whereIndicator) { + // ensure both objects have the same number of properties + forIn(a, function(value, key, a) { + if (hasOwnProperty.call(a, key)) { + // `size` will be `-1` if `a` has more properties than `b` + return (result = --size > -1); + } + }); + } + return result; + } + + /** + * Checks if `value` is, or can be coerced to, a finite number. + * + * Note: This is not the same as native `isFinite`, which will return true for + * booleans and empty strings. See http://es5.github.com/#x15.1.2.5. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is finite, else `false`. + * @example + * + * _.isFinite(-101); + * // => true + * + * _.isFinite('10'); + * // => true + * + * _.isFinite(true); + * // => false + * + * _.isFinite(''); + * // => false + * + * _.isFinite(Infinity); + * // => false + */ + function isFinite(value) { + return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value)); + } + + /** + * Checks if `value` is a function. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + */ + function isFunction(value) { + return typeof value == 'function'; + } + // fallback for older versions of Chrome and Safari + if (isFunction(/x/)) { + isFunction = function(value) { + return value instanceof Function || toString.call(value) == funcClass; + }; + } + + /** + * Checks if `value` is the language type of Object. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ + function isObject(value) { + // check if the value is the ECMAScript language type of Object + // http://es5.github.com/#x8 + // and avoid a V8 bug + // http://code.google.com/p/v8/issues/detail?id=2291 + return value ? objectTypes[typeof value] : false; + } + + /** + * Checks if `value` is `NaN`. + * + * Note: This is not the same as native `isNaN`, which will return `true` for + * `undefined` and other values. See http://es5.github.com/#x15.1.2.4. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // `NaN` as a primitive is the only value that is not equal to itself + // (perform the [[Class]] check first to avoid errors with some host objects in IE) + return isNumber(value) && value != +value + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(undefined); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is a number. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a number, else `false`. + * @example + * + * _.isNumber(8.4 * 5); + * // => true + */ + function isNumber(value) { + return typeof value == 'number' || toString.call(value) == numberClass; + } + + /** + * Checks if a given `value` is an object created by the `Object` constructor. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if `value` is a plain object, else `false`. + * @example + * + * function Stooge(name, age) { + * this.name = name; + * this.age = age; + * } + * + * _.isPlainObject(new Stooge('moe', 40)); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'name': 'moe', 'age': 40 }); + * // => true + */ + var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) { + if (!(value && typeof value == 'object')) { + return false; + } + var valueOf = value.valueOf, + objProto = typeof valueOf == 'function' && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto); + + return objProto + ? value == objProto || (getPrototypeOf(value) == objProto && !isArguments(value)) + : shimIsPlainObject(value); + }; + + /** + * Checks if `value` is a regular expression. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a regular expression, else `false`. + * @example + * + * _.isRegExp(/moe/); + * // => true + */ + function isRegExp(value) { + return value instanceof RegExp || toString.call(value) == regexpClass; + } + + /** + * Checks if `value` is a string. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is a string, else `false`. + * @example + * + * _.isString('moe'); + * // => true + */ + function isString(value) { + return typeof value == 'string' || toString.call(value) == stringClass; + } + + /** + * Checks if `value` is `undefined`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Mixed} value The value to check. + * @returns {Boolean} Returns `true`, if the `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + */ + function isUndefined(value) { + return typeof value == 'undefined'; + } + + /** + * Recursively merges own enumerable properties of the source object(s), that + * don't resolve to `undefined`, into the destination object. Subsequent sources + * will overwrite propery assignments of previous sources. If a `callback` function + * is passed, it will be executed to produce the merged values of the destination + * and source properties. If `callback` returns `undefined`, merging will be + * handled by the method instead. The `callback` is bound to `thisArg` and + * invoked with two arguments; (objectValue, sourceValue). + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The destination object. + * @param {Object} [source1, source2, ...] The source objects. + * @param {Function} [callback] The function to customize merging properties. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @param- {Object} [deepIndicator] Internally used to indicate that `stackA` + * and `stackB` are arrays of traversed objects instead of source objects. + * @param- {Array} [stackA=[]] Internally used to track traversed source objects. + * @param- {Array} [stackB=[]] Internally used to associate values with their + * source counterparts. + * @returns {Object} Returns the destination object. + * @example + * + * var names = { + * 'stooges': [ + * { 'name': 'moe' }, + * { 'name': 'larry' } + * ] + * }; + * + * var ages = { + * 'stooges': [ + * { 'age': 40 }, + * { 'age': 50 } + * ] + * }; + * + * _.merge(names, ages); + * // => { 'stooges': [{ 'name': 'moe', 'age': 40 }, { 'name': 'larry', 'age': 50 }] } + * + * var food = { + * 'fruits': ['apple'], + * 'vegetables': ['beet'] + * }; + * + * var otherFood = { + * 'fruits': ['banana'], + * 'vegetables': ['carrot'] + * }; + * + * _.merge(food, otherFood, function(a, b) { + * return _.isArray(a) ? a.concat(b) : undefined; + * }); + * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] } + */ + function merge(object, source, deepIndicator) { + var args = arguments, + index = 0, + length = 2; + + if (!isObject(object)) { + return object; + } + if (deepIndicator === indicatorObject) { + var callback = args[3], + stackA = args[4], + stackB = args[5]; + } else { + stackA = []; + stackB = []; + + // allows working with `_.reduce` and `_.reduceRight` without + // using their `callback` arguments, `index|key` and `collection` + if (typeof deepIndicator != 'number') { + length = args.length; + } + if (length > 3 && typeof args[length - 2] == 'function') { + callback = createCallback(args[--length - 1], args[length--], 2); + } else if (length > 2 && typeof args[length - 1] == 'function') { + callback = args[--length]; + } + } + while (++index < length) { + (isArray(args[index]) ? forEach : forOwn)(args[index], function(source, key) { + var found, + isArr, + result = source, + value = object[key]; + + if (source && ((isArr = isArray(source)) || isPlainObject(source))) { + // avoid merging previously merged cyclic sources + var stackLength = stackA.length; + while (stackLength--) { + if ((found = stackA[stackLength] == source)) { + value = stackB[stackLength]; + break; + } + } + if (!found) { + value = isArr + ? (isArray(value) ? value : []) + : (isPlainObject(value) ? value : {}); + + if (callback) { + result = callback(value, source); + if (typeof result != 'undefined') { + value = result; + } + } + // add `source` and associated `value` to the stack of traversed objects + stackA.push(source); + stackB.push(value); + + // recursively merge objects and arrays (susceptible to call stack limits) + if (!callback) { + value = merge(value, source, indicatorObject, callback, stackA, stackB); + } + } + } + else { + if (callback) { + result = callback(value, source); + if (typeof result == 'undefined') { + result = source; + } + } + if (typeof result != 'undefined') { + value = result; + } + } + object[key] = value; + }); + } + return object; + } + + /** + * Creates a shallow clone of `object` excluding the specified properties. + * Property names may be specified as individual arguments or as arrays of + * property names. If a `callback` function is passed, it will be executed + * for each property in the `object`, omitting the properties `callback` + * returns truthy for. The `callback` is bound to `thisArg` and invoked + * with three arguments; (value, key, object). + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The source object. + * @param {Function|String} callback|[prop1, prop2, ...] The properties to omit + * or the function called per iteration. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns an object without the omitted properties. + * @example + * + * _.omit({ 'name': 'moe', 'age': 40 }, 'age'); + * // => { 'name': 'moe' } + * + * _.omit({ 'name': 'moe', 'age': 40 }, function(value) { + * return typeof value == 'number'; + * }); + * // => { 'name': 'moe' } + */ + function omit(object, callback, thisArg) { + var isFunc = typeof callback == 'function', + result = {}; + + if (isFunc) { + callback = createCallback(callback, thisArg); + } else { + var props = concat.apply(arrayRef, arguments); + } + forIn(object, function(value, key, object) { + if (isFunc + ? !callback(value, key, object) + : indexOf(props, key, 1) < 0 + ) { + result[key] = value; + } + }); + return result; + } + + /** + * Creates a two dimensional array of the given object's key-value pairs, + * i.e. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The object to inspect. + * @returns {Array} Returns new array of key-value pairs. + * @example + * + * _.pairs({ 'moe': 30, 'larry': 40 }); + * // => [['moe', 30], ['larry', 40]] (order is not guaranteed) + */ + function pairs(object) { + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; + } + + /** + * Creates a shallow clone of `object` composed of the specified properties. + * Property names may be specified as individual arguments or as arrays of property + * names. If `callback` is passed, it will be executed for each property in the + * `object`, picking the properties `callback` returns truthy for. The `callback` + * is bound to `thisArg` and invoked with three arguments; (value, key, object). + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The source object. + * @param {Array|Function|String} callback|[prop1, prop2, ...] The function called + * per iteration or properties to pick, either as individual arguments or arrays. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns an object composed of the picked properties. + * @example + * + * _.pick({ 'name': 'moe', '_userid': 'moe1' }, 'name'); + * // => { 'name': 'moe' } + * + * _.pick({ 'name': 'moe', '_userid': 'moe1' }, function(value, key) { + * return key.charAt(0) != '_'; + * }); + * // => { 'name': 'moe' } + */ + function pick(object, callback, thisArg) { + var result = {}; + if (typeof callback != 'function') { + var index = 0, + props = concat.apply(arrayRef, arguments), + length = isObject(object) ? props.length : 0; + + while (++index < length) { + var key = props[index]; + if (key in object) { + result[key] = object[key]; + } + } + } else { + callback = createCallback(callback, thisArg); + forIn(object, function(value, key, object) { + if (callback(value, key, object)) { + result[key] = value; + } + }); + } + return result; + } + + /** + * Creates an array composed of the own enumerable property values of `object`. + * + * @static + * @memberOf _ + * @category Objects + * @param {Object} object The object to inspect. + * @returns {Array} Returns a new array of property values. + * @example + * + * _.values({ 'one': 1, 'two': 2, 'three': 3 }); + * // => [1, 2, 3] + */ + function values(object) { + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + result[index] = object[props[index]]; + } + return result; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Creates an array of elements from the specified indexes, or keys, of the + * `collection`. Indexes may be specified as individual arguments or as arrays + * of indexes. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Array|Number|String} [index1, index2, ...] The indexes of + * `collection` to retrieve, either as individual arguments or arrays. + * @returns {Array} Returns a new array of elements corresponding to the + * provided indexes. + * @example + * + * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]); + * // => ['a', 'c', 'e'] + * + * _.at(['moe', 'larry', 'curly'], 0, 2); + * // => ['moe', 'curly'] + */ + function at(collection) { + var index = -1, + props = concat.apply(arrayRef, slice(arguments, 1)), + length = props.length, + result = Array(length); + + if (noCharByIndex && isString(collection)) { + collection = collection.split(''); + } + while(++index < length) { + result[index] = collection[props[index]]; + } + return result; + } + + /** + * Checks if a given `target` element is present in a `collection` using strict + * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used + * as the offset from the end of the collection. + * + * @static + * @memberOf _ + * @alias include + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Mixed} target The value to check for. + * @param {Number} [fromIndex=0] The index to search from. + * @returns {Boolean} Returns `true` if the `target` element is found, else `false`. + * @example + * + * _.contains([1, 2, 3], 1); + * // => true + * + * _.contains([1, 2, 3], 1, 2); + * // => false + * + * _.contains({ 'name': 'moe', 'age': 40 }, 'moe'); + * // => true + * + * _.contains('curly', 'ur'); + * // => true + */ + function contains(collection, target, fromIndex) { + var index = -1, + length = collection ? collection.length : 0, + result = false; + + fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0; + if (typeof length == 'number') { + result = (isString(collection) + ? collection.indexOf(target, fromIndex) + : indexOf(collection, target, fromIndex) + ) > -1; + } else { + each(collection, function(value) { + if (++index >= fromIndex) { + return !(result = value === target); + } + }); + } + return result; + } + + /** + * Creates an object composed of keys returned from running each element of the + * `collection` through the given `callback`. The corresponding value of each key + * is the number of times the key was returned by the `callback`. The `callback` + * is bound to `thisArg` and invoked with three arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); }); + * // => { '4': 1, '6': 2 } + * + * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math); + * // => { '4': 1, '6': 2 } + * + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + function countBy(collection, callback, thisArg) { + var result = {}; + callback = createCallback(callback, thisArg); + + forEach(collection, function(value, key, collection) { + key = callback(value, key, collection) + ''; + (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1); + }); + return result; + } + + /** + * Checks if the `callback` returns a truthy value for **all** elements of a + * `collection`. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Boolean} Returns `true` if all elements pass the callback check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * // using "_.pluck" callback shorthand + * _.every(stooges, 'age'); + * // => true + * + * // using "_.where" callback shorthand + * _.every(stooges, { 'age': 50 }); + * // => false + */ + function every(collection, callback, thisArg) { + var result = true; + callback = createCallback(callback, thisArg); + + if (isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + if (!(result = !!callback(collection[index], index, collection))) { + break; + } + } + } else { + each(collection, function(value, index, collection) { + return (result = !!callback(value, index, collection)); + }); + } + return result; + } + + /** + * Examines each element in a `collection`, returning an array of all elements + * the `callback` returns truthy for. The `callback` is bound to `thisArg` and + * invoked with three arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias select + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a new array of elements that passed the callback check. + * @example + * + * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); + * // => [2, 4, 6] + * + * var food = [ + * { 'name': 'apple', 'organic': false, 'type': 'fruit' }, + * { 'name': 'carrot', 'organic': true, 'type': 'vegetable' } + * ]; + * + * // using "_.pluck" callback shorthand + * _.filter(food, 'organic'); + * // => [{ 'name': 'carrot', 'organic': true, 'type': 'vegetable' }] + * + * // using "_.where" callback shorthand + * _.filter(food, { 'type': 'fruit' }); + * // => [{ 'name': 'apple', 'organic': false, 'type': 'fruit' }] + */ + function filter(collection, callback, thisArg) { + var result = []; + callback = createCallback(callback, thisArg); + + if (isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + var value = collection[index]; + if (callback(value, index, collection)) { + result.push(value); + } + } + } else { + each(collection, function(value, index, collection) { + if (callback(value, index, collection)) { + result.push(value); + } + }); + } + return result; + } + + /** + * Examines each element in a `collection`, returning the first that the `callback` + * returns truthy for. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias detect + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the element that passed the callback check, + * else `undefined`. + * @example + * + * var even = _.find([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); + * // => 2 + * + * var food = [ + * { 'name': 'apple', 'organic': false, 'type': 'fruit' }, + * { 'name': 'banana', 'organic': true, 'type': 'fruit' }, + * { 'name': 'beet', 'organic': false, 'type': 'vegetable' }, + * { 'name': 'carrot', 'organic': true, 'type': 'vegetable' } + * ]; + * + * // using "_.where" callback shorthand + * var veggie = _.find(food, { 'type': 'vegetable' }); + * // => { 'name': 'beet', 'organic': false, 'type': 'vegetable' } + * + * // using "_.pluck" callback shorthand + * var healthy = _.find(food, 'organic'); + * // => { 'name': 'banana', 'organic': true, 'type': 'fruit' } + */ + function find(collection, callback, thisArg) { + var result; + callback = createCallback(callback, thisArg); + + forEach(collection, function(value, index, collection) { + if (callback(value, index, collection)) { + result = value; + return false; + } + }); + return result; + } + + /** + * Iterates over a `collection`, executing the `callback` for each element in + * the `collection`. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, index|key, collection). Callbacks may exit iteration early + * by explicitly returning `false`. + * + * @static + * @memberOf _ + * @alias each + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array|Object|String} Returns `collection`. + * @example + * + * _([1, 2, 3]).forEach(alert).join(','); + * // => alerts each number and returns '1,2,3' + * + * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, alert); + * // => alerts each number value (order is not guaranteed) + */ + function forEach(collection, callback, thisArg) { + if (callback && typeof thisArg == 'undefined' && isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + if (callback(collection[index], index, collection) === false) { + break; + } + } + } else { + each(collection, callback, thisArg); + } + return collection; + } + + /** + * Creates an object composed of keys returned from running each element of the + * `collection` through the `callback`. The corresponding value of each key is + * an array of elements passed to `callback` that returned the key. The `callback` + * is bound to `thisArg` and invoked with three arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false` + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); }); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * // using "_.pluck" callback shorthand + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + function groupBy(collection, callback, thisArg) { + var result = {}; + callback = createCallback(callback, thisArg); + + forEach(collection, function(value, key, collection) { + key = callback(value, key, collection) + ''; + (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value); + }); + return result; + } + + /** + * Invokes the method named by `methodName` on each element in the `collection`, + * returning an array of the results of each invoked method. Additional arguments + * will be passed to each invoked method. If `methodName` is a function, it will + * be invoked for, and `this` bound to, each element in the `collection`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|String} methodName The name of the method to invoke or + * the function invoked per iteration. + * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with. + * @returns {Array} Returns a new array of the results of each invoked method. + * @example + * + * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invoke([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + function invoke(collection, methodName) { + var args = slice(arguments, 2), + index = -1, + isFunc = typeof methodName == 'function', + length = collection ? collection.length : 0, + result = Array(typeof length == 'number' ? length : 0); + + forEach(collection, function(value) { + result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args); + }); + return result; + } + + /** + * Creates an array of values by running each element in the `collection` + * through the `callback`. The `callback` is bound to `thisArg` and invoked with + * three arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias collect + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a new array of the results of each `callback` execution. + * @example + * + * _.map([1, 2, 3], function(num) { return num * 3; }); + * // => [3, 6, 9] + * + * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; }); + * // => [3, 6, 9] (order is not guaranteed) + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * // using "_.pluck" callback shorthand + * _.map(stooges, 'name'); + * // => ['moe', 'larry'] + */ + function map(collection, callback, thisArg) { + var index = -1, + length = collection ? collection.length : 0, + result = Array(typeof length == 'number' ? length : 0); + + callback = createCallback(callback, thisArg); + if (isArray(collection)) { + while (++index < length) { + result[index] = callback(collection[index], index, collection); + } + } else { + each(collection, function(value, key, collection) { + result[++index] = callback(value, key, collection); + }); + } + return result; + } + + /** + * Retrieves the maximum value of an `array`. If `callback` is passed, + * it will be executed for each value in the `array` to generate the + * criterion by which the value is ranked. The `callback` is bound to + * `thisArg` and invoked with three arguments; (value, index, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the maximum value. + * @example + * + * _.max([4, 2, 8, 6]); + * // => 8 + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * _.max(stooges, function(stooge) { return stooge.age; }); + * // => { 'name': 'larry', 'age': 50 }; + * + * // using "_.pluck" callback shorthand + * _.max(stooges, 'age'); + * // => { 'name': 'larry', 'age': 50 }; + */ + function max(collection, callback, thisArg) { + var computed = -Infinity, + result = computed; + + if (!callback && isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + var value = collection[index]; + if (value > result) { + result = value; + } + } + } else { + callback = !callback && isString(collection) + ? charAtCallback + : createCallback(callback, thisArg); + + each(collection, function(value, index, collection) { + var current = callback(value, index, collection); + if (current > computed) { + computed = current; + result = value; + } + }); + } + return result; + } + + /** + * Retrieves the minimum value of an `array`. If `callback` is passed, + * it will be executed for each value in the `array` to generate the + * criterion by which the value is ranked. The `callback` is bound to `thisArg` + * and invoked with three arguments; (value, index, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the minimum value. + * @example + * + * _.min([4, 2, 8, 6]); + * // => 2 + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * _.min(stooges, function(stooge) { return stooge.age; }); + * // => { 'name': 'moe', 'age': 40 }; + * + * // using "_.pluck" callback shorthand + * _.min(stooges, 'age'); + * // => { 'name': 'moe', 'age': 40 }; + */ + function min(collection, callback, thisArg) { + var computed = Infinity, + result = computed; + + if (!callback && isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + var value = collection[index]; + if (value < result) { + result = value; + } + } + } else { + callback = !callback && isString(collection) + ? charAtCallback + : createCallback(callback, thisArg); + + each(collection, function(value, index, collection) { + var current = callback(value, index, collection); + if (current < computed) { + computed = current; + result = value; + } + }); + } + return result; + } + + /** + * Retrieves the value of a specified property from all elements in the `collection`. + * + * @static + * @memberOf _ + * @type Function + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {String} property The property to pluck. + * @returns {Array} Returns a new array of property values. + * @example + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * _.pluck(stooges, 'name'); + * // => ['moe', 'larry'] + */ + var pluck = map; + + /** + * Reduces a `collection` to a value that is the accumulated result of running + * each element in the `collection` through the `callback`, where each successive + * `callback` execution consumes the return value of the previous execution. + * If `accumulator` is not passed, the first element of the `collection` will be + * used as the initial `accumulator` value. The `callback` is bound to `thisArg` + * and invoked with four arguments; (accumulator, value, index|key, collection). + * + * @static + * @memberOf _ + * @alias foldl, inject + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [accumulator] Initial value of the accumulator. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the accumulated value. + * @example + * + * var sum = _.reduce([1, 2, 3], function(sum, num) { + * return sum + num; + * }); + * // => 6 + * + * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) { + * result[key] = num * 3; + * return result; + * }, {}); + * // => { 'a': 3, 'b': 6, 'c': 9 } + */ + function reduce(collection, callback, accumulator, thisArg) { + var noaccum = arguments.length < 3; + callback = createCallback(callback, thisArg, 4); + + if (isArray(collection)) { + var index = -1, + length = collection.length; + + if (noaccum) { + accumulator = collection[++index]; + } + while (++index < length) { + accumulator = callback(accumulator, collection[index], index, collection); + } + } else { + each(collection, function(value, index, collection) { + accumulator = noaccum + ? (noaccum = false, value) + : callback(accumulator, value, index, collection) + }); + } + return accumulator; + } + + /** + * This method is similar to `_.reduce`, except that it iterates over a + * `collection` from right to left. + * + * @static + * @memberOf _ + * @alias foldr + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function} [callback=identity] The function called per iteration. + * @param {Mixed} [accumulator] Initial value of the accumulator. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the accumulated value. + * @example + * + * var list = [[0, 1], [2, 3], [4, 5]]; + * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, callback, accumulator, thisArg) { + var iterable = collection, + length = collection ? collection.length : 0, + noaccum = arguments.length < 3; + + if (typeof length != 'number') { + var props = keys(collection); + length = props.length; + } else if (noCharByIndex && isString(collection)) { + iterable = collection.split(''); + } + callback = createCallback(callback, thisArg, 4); + forEach(collection, function(value, index, collection) { + index = props ? props[--length] : --length; + accumulator = noaccum + ? (noaccum = false, iterable[index]) + : callback(accumulator, iterable[index], index, collection); + }); + return accumulator; + } + + /** + * The opposite of `_.filter`, this method returns the elements of a + * `collection` that `callback` does **not** return truthy for. + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a new array of elements that did **not** pass the + * callback check. + * @example + * + * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); + * // => [1, 3, 5] + * + * var food = [ + * { 'name': 'apple', 'organic': false, 'type': 'fruit' }, + * { 'name': 'carrot', 'organic': true, 'type': 'vegetable' } + * ]; + * + * // using "_.pluck" callback shorthand + * _.reject(food, 'organic'); + * // => [{ 'name': 'apple', 'organic': false, 'type': 'fruit' }] + * + * // using "_.where" callback shorthand + * _.reject(food, { 'type': 'fruit' }); + * // => [{ 'name': 'carrot', 'organic': true, 'type': 'vegetable' }] + */ + function reject(collection, callback, thisArg) { + callback = createCallback(callback, thisArg); + return filter(collection, function(value, index, collection) { + return !callback(value, index, collection); + }); + } + + /** + * Creates an array of shuffled `array` values, using a version of the + * Fisher-Yates shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to shuffle. + * @returns {Array} Returns a new shuffled collection. + * @example + * + * _.shuffle([1, 2, 3, 4, 5, 6]); + * // => [4, 1, 6, 3, 5, 2] + */ + function shuffle(collection) { + var index = -1, + length = collection ? collection.length : 0, + result = Array(typeof length == 'number' ? length : 0); + + forEach(collection, function(value) { + var rand = floor(nativeRandom() * (++index + 1)); + result[index] = result[rand]; + result[rand] = value; + }); + return result; + } + + /** + * Gets the size of the `collection` by returning `collection.length` for arrays + * and array-like objects or the number of own enumerable properties for objects. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to inspect. + * @returns {Number} Returns `collection.length` or number of own enumerable properties. + * @example + * + * _.size([1, 2]); + * // => 2 + * + * _.size({ 'one': 1, 'two': 2, 'three': 3 }); + * // => 3 + * + * _.size('curly'); + * // => 5 + */ + function size(collection) { + var length = collection ? collection.length : 0; + return typeof length == 'number' ? length : keys(collection).length; + } + + /** + * Checks if the `callback` returns a truthy value for **any** element of a + * `collection`. The function returns as soon as it finds passing value, and + * does not iterate over the entire `collection`. The `callback` is bound to + * `thisArg` and invoked with three arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias any + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Boolean} Returns `true` if any element passes the callback check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var food = [ + * { 'name': 'apple', 'organic': false, 'type': 'fruit' }, + * { 'name': 'carrot', 'organic': true, 'type': 'vegetable' } + * ]; + * + * // using "_.pluck" callback shorthand + * _.some(food, 'organic'); + * // => true + * + * // using "_.where" callback shorthand + * _.some(food, { 'type': 'meat' }); + * // => false + */ + function some(collection, callback, thisArg) { + var result; + callback = createCallback(callback, thisArg); + + if (isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + if ((result = callback(collection[index], index, collection))) { + break; + } + } + } else { + each(collection, function(value, index, collection) { + return !(result = callback(value, index, collection)); + }); + } + return !!result; + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in the `collection` through the `callback`. This method + * performs a stable sort, that is, it will preserve the original sort order of + * equal elements. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, index|key, collection). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a new array of sorted elements. + * @example + * + * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); }); + * // => [3, 1, 2] + * + * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math); + * // => [3, 1, 2] + * + * // using "_.pluck" callback shorthand + * _.sortBy(['banana', 'strawberry', 'apple'], 'length'); + * // => ['apple', 'banana', 'strawberry'] + */ + function sortBy(collection, callback, thisArg) { + var index = -1, + length = collection ? collection.length : 0, + result = Array(typeof length == 'number' ? length : 0); + + callback = createCallback(callback, thisArg); + forEach(collection, function(value, key, collection) { + result[++index] = { + 'criteria': callback(value, key, collection), + 'index': index, + 'value': value + }; + }); + + length = result.length; + result.sort(compareAscending); + while (length--) { + result[length] = result[length].value; + } + return result; + } + + /** + * Converts the `collection` to an array. + * + * @static + * @memberOf _ + * @category Collections + * @param {Array|Object|String} collection The collection to convert. + * @returns {Array} Returns the new converted array. + * @example + * + * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4); + * // => [2, 3, 4] + */ + function toArray(collection) { + if (collection && typeof collection.length == 'number') { + return noCharByIndex && isString(collection) + ? collection.split('') + : slice(collection); + } + return values(collection); + } + + /** + * Examines each element in a `collection`, returning an array of all elements + * that have the given `properties`. When checking `properties`, this method + * performs a deep comparison between values to determine if they are equivalent + * to each other. + * + * @static + * @memberOf _ + * @type Function + * @category Collections + * @param {Array|Object|String} collection The collection to iterate over. + * @param {Object} properties The object of property values to filter by. + * @returns {Array} Returns a new array of elements that have the given `properties`. + * @example + * + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * _.where(stooges, { 'age': 40 }); + * // => [{ 'name': 'moe', 'age': 40 }] + */ + var where = filter; + + /*--------------------------------------------------------------------------*/ + + /** + * Creates an array with all falsey values of `array` removed. The values + * `false`, `null`, `0`, `""`, `undefined` and `NaN` are all falsey. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to compact. + * @returns {Array} Returns a new filtered array. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array ? array.length : 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result.push(value); + } + } + return result; + } + + /** + * Creates an array of `array` elements not present in the other arrays + * using strict equality for comparisons, i.e. `===`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to process. + * @param {Array} [array1, array2, ...] Arrays to check. + * @returns {Array} Returns a new array of `array` elements not present in the + * other arrays. + * @example + * + * _.difference([1, 2, 3, 4, 5], [5, 2, 10]); + * // => [1, 3, 4] + */ + function difference(array) { + var index = -1, + length = array ? array.length : 0, + flattened = concat.apply(arrayRef, arguments), + contains = cachedContains(flattened, length), + result = []; + + while (++index < length) { + var value = array[index]; + if (!contains(value)) { + result.push(value); + } + } + return result; + } + + /** + * Gets the first element of the `array`. If a number `n` is passed, the first + * `n` elements of the `array` are returned. If a `callback` function is passed, + * the first elements the `callback` returns truthy for are returned. The `callback` + * is bound to `thisArg` and invoked with three arguments; (value, index, array). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias head, take + * @category Arrays + * @param {Array} array The array to query. + * @param {Function|Object|Number|String} [callback|n] The function called + * per element or the number of elements to return. If a property name or + * object is passed, it will be used to create a "_.pluck" or "_.where" + * style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the first element(s) of `array`. + * @example + * + * _.first([1, 2, 3]); + * // => 1 + * + * _.first([1, 2, 3], 2); + * // => [1, 2] + * + * _.first([1, 2, 3], function(num) { + * return num < 3; + * }); + * // => [1, 2] + * + * var food = [ + * { 'name': 'banana', 'organic': true }, + * { 'name': 'beet', 'organic': false }, + * ]; + * + * // using "_.pluck" callback shorthand + * _.first(food, 'organic'); + * // => [{ 'name': 'banana', 'organic': true }] + * + * var food = [ + * { 'name': 'apple', 'type': 'fruit' }, + * { 'name': 'banana', 'type': 'fruit' }, + * { 'name': 'beet', 'type': 'vegetable' } + * ]; + * + * // using "_.where" callback shorthand + * _.first(food, { 'type': 'fruit' }); + * // => [{ 'name': 'apple', 'type': 'fruit' }, { 'name': 'banana', 'type': 'fruit' }] + */ + function first(array, callback, thisArg) { + if (array) { + var n = 0, + length = array.length; + + if (typeof callback != 'number' && callback != null) { + var index = -1; + callback = createCallback(callback, thisArg); + while (++index < length && callback(array[index], index, array)) { + n++; + } + } else { + n = callback; + if (n == null || thisArg) { + return array[0]; + } + } + return slice(array, 0, nativeMin(nativeMax(0, n), length)); + } + } + + /** + * Flattens a nested array (the nesting can be to any depth). If `shallow` is + * truthy, `array` will only be flattened a single level. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to compact. + * @param {Boolean} shallow A flag to indicate only flattening a single level. + * @returns {Array} Returns a new flattened array. + * @example + * + * _.flatten([1, [2], [3, [[4]]]]); + * // => [1, 2, 3, 4]; + * + * _.flatten([1, [2], [3, [[4]]]], true); + * // => [1, 2, 3, [[4]]]; + */ + function flatten(array, shallow) { + var index = -1, + length = array ? array.length : 0, + result = []; + + while (++index < length) { + var value = array[index]; + + // recursively flatten arrays (susceptible to call stack limits) + if (isArray(value)) { + push.apply(result, shallow ? value : flatten(value)); + } else { + result.push(value); + } + } + return result; + } + + /** + * Gets the index at which the first occurrence of `value` is found using + * strict equality for comparisons, i.e. `===`. If the `array` is already + * sorted, passing `true` for `fromIndex` will run a faster binary search. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to search. + * @param {Mixed} value The value to search for. + * @param {Boolean|Number} [fromIndex=0] The index to search from or `true` to + * perform a binary search on a sorted `array`. + * @returns {Number} Returns the index of the matched value or `-1`. + * @example + * + * _.indexOf([1, 2, 3, 1, 2, 3], 2); + * // => 1 + * + * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3); + * // => 4 + * + * _.indexOf([1, 1, 2, 2, 3, 3], 2, true); + * // => 2 + */ + function indexOf(array, value, fromIndex) { + var index = -1, + length = array ? array.length : 0; + + if (typeof fromIndex == 'number') { + index = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0) - 1; + } else if (fromIndex) { + index = sortedIndex(array, value); + return array[index] === value ? index : -1; + } + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * Gets all but the last element of `array`. If a number `n` is passed, the + * last `n` elements are excluded from the result. If a `callback` function + * is passed, the last elements the `callback` returns truthy for are excluded + * from the result. The `callback` is bound to `thisArg` and invoked with three + * arguments; (value, index, array). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to query. + * @param {Function|Object|Number|String} [callback|n=1] The function called + * per element or the number of elements to exclude. If a property name or + * object is passed, it will be used to create a "_.pluck" or "_.where" + * style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + * + * _.initial([1, 2, 3], 2); + * // => [1] + * + * _.initial([1, 2, 3], function(num) { + * return num > 1; + * }); + * // => [1] + * + * var food = [ + * { 'name': 'beet', 'organic': false }, + * { 'name': 'carrot', 'organic': true } + * ]; + * + * // using "_.pluck" callback shorthand + * _.initial(food, 'organic'); + * // => [{ 'name': 'beet', 'organic': false }] + * + * var food = [ + * { 'name': 'banana', 'type': 'fruit' }, + * { 'name': 'beet', 'type': 'vegetable' }, + * { 'name': 'carrot', 'type': 'vegetable' } + * ]; + * + * // using "_.where" callback shorthand + * _.initial(food, { 'type': 'vegetable' }); + * // => [{ 'name': 'banana', 'type': 'fruit' }] + */ + function initial(array, callback, thisArg) { + if (!array) { + return []; + } + var n = 0, + length = array.length; + + if (typeof callback != 'number' && callback != null) { + var index = length; + callback = createCallback(callback, thisArg); + while (index-- && callback(array[index], index, array)) { + n++; + } + } else { + n = (callback == null || thisArg) ? 1 : callback || n; + } + return slice(array, 0, nativeMin(nativeMax(0, length - n), length)); + } + + /** + * Computes the intersection of all the passed-in arrays using strict equality + * for comparisons, i.e. `===`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} [array1, array2, ...] Arrays to process. + * @returns {Array} Returns a new array of unique elements that are present + * in **all** of the arrays. + * @example + * + * _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); + * // => [1, 2] + */ + function intersection(array) { + var args = arguments, + argsLength = args.length, + cache = { '0': {} }, + index = -1, + length = array ? array.length : 0, + isLarge = length >= 100, + result = [], + seen = result; + + outer: + while (++index < length) { + var value = array[index]; + if (isLarge) { + var key = value + ''; + var inited = hasOwnProperty.call(cache[0], key) + ? !(seen = cache[0][key]) + : (seen = cache[0][key] = []); + } + if (inited || indexOf(seen, value) < 0) { + if (isLarge) { + seen.push(value); + } + var argsIndex = argsLength; + while (--argsIndex) { + if (!(cache[argsIndex] || (cache[argsIndex] = cachedContains(args[argsIndex], 0, 100)))(value)) { + continue outer; + } + } + result.push(value); + } + } + return result; + } + + /** + * Gets the last element of the `array`. If a number `n` is passed, the last + * `n` elements of the `array` are returned. If a `callback` function is passed, + * the last elements the `callback` returns truthy for are returned. The `callback` + * is bound to `thisArg` and invoked with three arguments; (value, index, array). + * + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to query. + * @param {Function|Object|Number|String} [callback|n] The function called + * per element or the number of elements to return. If a property name or + * object is passed, it will be used to create a "_.pluck" or "_.where" + * style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Mixed} Returns the last element(s) of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + * + * _.last([1, 2, 3], 2); + * // => [2, 3] + * + * _.last([1, 2, 3], function(num) { + * return num > 1; + * }); + * // => [2, 3] + * + * var food = [ + * { 'name': 'beet', 'organic': false }, + * { 'name': 'carrot', 'organic': true } + * ]; + * + * // using "_.pluck" callback shorthand + * _.last(food, 'organic'); + * // => [{ 'name': 'carrot', 'organic': true }] + * + * var food = [ + * { 'name': 'banana', 'type': 'fruit' }, + * { 'name': 'beet', 'type': 'vegetable' }, + * { 'name': 'carrot', 'type': 'vegetable' } + * ]; + * + * // using "_.where" callback shorthand + * _.last(food, { 'type': 'vegetable' }); + * // => [{ 'name': 'beet', 'type': 'vegetable' }, { 'name': 'carrot', 'type': 'vegetable' }] + */ + function last(array, callback, thisArg) { + if (array) { + var n = 0, + length = array.length; + + if (typeof callback != 'number' && callback != null) { + var index = length; + callback = createCallback(callback, thisArg); + while (index-- && callback(array[index], index, array)) { + n++; + } + } else { + n = callback; + if (n == null || thisArg) { + return array[length - 1]; + } + } + return slice(array, nativeMax(0, length - n)); + } + } + + /** + * Gets the index at which the last occurrence of `value` is found using strict + * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used + * as the offset from the end of the collection. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to search. + * @param {Mixed} value The value to search for. + * @param {Number} [fromIndex=array.length-1] The index to search from. + * @returns {Number} Returns the index of the matched value or `-1`. + * @example + * + * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2); + * // => 4 + * + * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var index = array ? array.length : 0; + if (typeof fromIndex == 'number') { + index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1; + } + while (index--) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * Creates an object composed from arrays of `keys` and `values`. Pass either + * a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`, or + * two arrays, one of `keys` and one of corresponding `values`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} keys The array of keys. + * @param {Array} [values=[]] The array of values. + * @returns {Object} Returns an object composed of the given keys and + * corresponding values. + * @example + * + * _.object(['moe', 'larry'], [30, 40]); + * // => { 'moe': 30, 'larry': 40 } + */ + function object(keys, values) { + var index = -1, + length = keys ? keys.length : 0, + result = {}; + + while (++index < length) { + var key = keys[index]; + if (values) { + result[key] = values[index]; + } else { + result[key[0]] = key[1]; + } + } + return result; + } + + /** + * Creates an array of numbers (positive and/or negative) progressing from + * `start` up to but not including `end`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Number} [start=0] The start of the range. + * @param {Number} end The end of the range. + * @param {Number} [step=1] The value to increment or descrement by. + * @returns {Array} Returns a new range array. + * @example + * + * _.range(10); + * // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + * + * _.range(1, 11); + * // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + * + * _.range(0, 30, 5); + * // => [0, 5, 10, 15, 20, 25] + * + * _.range(0, -10, -1); + * // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] + * + * _.range(0); + * // => [] + */ + function range(start, end, step) { + start = +start || 0; + step = +step || 1; + + if (end == null) { + end = start; + start = 0; + } + // use `Array(length)` so V8 will avoid the slower "dictionary" mode + // http://youtu.be/XAqIpGU8ZZk#t=17m25s + var index = -1, + length = nativeMax(0, ceil((end - start) / step)), + result = Array(length); + + while (++index < length) { + result[index] = start; + start += step; + } + return result; + } + + /** + * The opposite of `_.initial`, this method gets all but the first value of `array`. + * If a number `n` is passed, the first `n` values are excluded from the result. + * If a `callback` function is passed, the first elements the `callback` returns + * truthy for are excluded from the result. The `callback` is bound to `thisArg` + * and invoked with three arguments; (value, index, array). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias drop, tail + * @category Arrays + * @param {Array} array The array to query. + * @param {Function|Object|Number|String} [callback|n=1] The function called + * per element or the number of elements to exclude. If a property name or + * object is passed, it will be used to create a "_.pluck" or "_.where" + * style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a slice of `array`. + * @example + * + * _.rest([1, 2, 3]); + * // => [2, 3] + * + * _.rest([1, 2, 3], 2); + * // => [3] + * + * _.rest([1, 2, 3], function(num) { + * return num < 3; + * }); + * // => [3] + * + * var food = [ + * { 'name': 'banana', 'organic': true }, + * { 'name': 'beet', 'organic': false }, + * ]; + * + * // using "_.pluck" callback shorthand + * _.rest(food, 'organic'); + * // => [{ 'name': 'beet', 'organic': false }] + * + * var food = [ + * { 'name': 'apple', 'type': 'fruit' }, + * { 'name': 'banana', 'type': 'fruit' }, + * { 'name': 'beet', 'type': 'vegetable' } + * ]; + * + * // using "_.where" callback shorthand + * _.rest(food, { 'type': 'fruit' }); + * // => [{ 'name': 'beet', 'type': 'vegetable' }] + */ + function rest(array, callback, thisArg) { + if (typeof callback != 'number' && callback != null) { + var n = 0, + index = -1, + length = array ? array.length : 0; + + callback = createCallback(callback, thisArg); + while (++index < length && callback(array[index], index, array)) { + n++; + } + } else { + n = (callback == null || thisArg) ? 1 : nativeMax(0, callback); + } + return slice(array, n); + } + + /** + * Uses a binary search to determine the smallest index at which the `value` + * should be inserted into `array` in order to maintain the sort order of the + * sorted `array`. If `callback` is passed, it will be executed for `value` and + * each element in `array` to compute their sort ranking. The `callback` is + * bound to `thisArg` and invoked with one argument; (value). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to iterate over. + * @param {Mixed} value The value to evaluate. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Number} Returns the index at which the value should be inserted + * into `array`. + * @example + * + * _.sortedIndex([20, 30, 50], 40); + * // => 2 + * + * // using "_.pluck" callback shorthand + * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); + * // => 2 + * + * var dict = { + * 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 } + * }; + * + * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) { + * return dict.wordToNumber[word]; + * }); + * // => 2 + * + * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) { + * return this.wordToNumber[word]; + * }, dict); + * // => 2 + */ + function sortedIndex(array, value, callback, thisArg) { + var low = 0, + high = array ? array.length : low; + + // explicitly reference `identity` for better inlining in Firefox + callback = callback ? createCallback(callback, thisArg, 1) : identity; + value = callback(value); + + while (low < high) { + var mid = (low + high) >>> 1; + callback(array[mid]) < value + ? low = mid + 1 + : high = mid; + } + return low; + } + + /** + * Computes the union of the passed-in arrays using strict equality for + * comparisons, i.e. `===`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} [array1, array2, ...] Arrays to process. + * @returns {Array} Returns a new array of unique values, in order, that are + * present in one or more of the arrays. + * @example + * + * _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); + * // => [1, 2, 3, 101, 10] + */ + function union() { + return uniq(concat.apply(arrayRef, arguments)); + } + + /** + * Creates a duplicate-value-free version of the `array` using strict equality + * for comparisons, i.e. `===`. If the `array` is already sorted, passing `true` + * for `isSorted` will run a faster algorithm. If `callback` is passed, each + * element of `array` is passed through a callback` before uniqueness is computed. + * The `callback` is bound to `thisArg` and invoked with three arguments; (value, index, array). + * + * If a property name is passed for `callback`, the created "_.pluck" style + * callback will return the property value of the given element. + * + * If an object is passed for `callback`, the created "_.where" style callback + * will return `true` for elements that have the propeties of the given object, + * else `false`. + * + * @static + * @memberOf _ + * @alias unique + * @category Arrays + * @param {Array} array The array to process. + * @param {Boolean} [isSorted=false] A flag to indicate that the `array` is already sorted. + * @param {Function|Object|String} [callback=identity] The function called per + * iteration. If a property name or object is passed, it will be used to create + * a "_.pluck" or "_.where" style callback, respectively. + * @param {Mixed} [thisArg] The `this` binding of `callback`. + * @returns {Array} Returns a duplicate-value-free array. + * @example + * + * _.uniq([1, 2, 1, 3, 1]); + * // => [1, 2, 3] + * + * _.uniq([1, 1, 2, 2, 3], true); + * // => [1, 2, 3] + * + * _.uniq([1, 2, 1.5, 3, 2.5], function(num) { return Math.floor(num); }); + * // => [1, 2, 3] + * + * _.uniq([1, 2, 1.5, 3, 2.5], function(num) { return this.floor(num); }, Math); + * // => [1, 2, 3] + * + * // using "_.pluck" callback shorthand + * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniq(array, isSorted, callback, thisArg) { + var index = -1, + length = array ? array.length : 0, + result = [], + seen = result; + + // juggle arguments + if (typeof isSorted == 'function') { + thisArg = callback; + callback = isSorted; + isSorted = false; + } + // init value cache for large arrays + var isLarge = !isSorted && length >= 75; + if (isLarge) { + var cache = {}; + } + if (callback) { + seen = []; + callback = createCallback(callback, thisArg); + } + while (++index < length) { + var value = array[index], + computed = callback ? callback(value, index, array) : value; + + if (isLarge) { + var key = computed + ''; + var inited = hasOwnProperty.call(cache, key) + ? !(seen = cache[key]) + : (seen = cache[key] = []); + } + if (isSorted + ? !index || seen[seen.length - 1] !== computed + : inited || indexOf(seen, computed) < 0 + ) { + if (callback || isLarge) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * Creates an array with all occurrences of the passed values removed using + * strict equality for comparisons, i.e. `===`. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} array The array to filter. + * @param {Mixed} [value1, value2, ...] Values to remove. + * @returns {Array} Returns a new filtered array. + * @example + * + * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); + * // => [2, 3, 4] + */ + function without(array) { + var index = -1, + length = array ? array.length : 0, + contains = cachedContains(arguments, 1), + result = []; + + while (++index < length) { + var value = array[index]; + if (!contains(value)) { + result.push(value); + } + } + return result; + } + + /** + * Groups the elements of each array at their corresponding indexes. Useful for + * separate data sources that are coordinated through matching array indexes. + * For a matrix of nested arrays, `_.zip.apply(...)` can transpose the matrix + * in a similar fashion. + * + * @static + * @memberOf _ + * @category Arrays + * @param {Array} [array1, array2, ...] Arrays to process. + * @returns {Array} Returns a new array of grouped elements. + * @example + * + * _.zip(['moe', 'larry'], [30, 40], [true, false]); + * // => [['moe', 30, true], ['larry', 40, false]] + */ + function zip(array) { + var index = -1, + length = array ? max(pluck(arguments, 'length')) : 0, + result = Array(length); + + while (++index < length) { + result[index] = pluck(arguments, index); + } + return result; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a function that is restricted to executing `func` only after it is + * called `n` times. The `func` is executed with the `this` binding of the + * created function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Number} n The number of times the function must be called before + * it is executed. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var renderNotes = _.after(notes.length, render); + * _.forEach(notes, function(note) { + * note.asyncSave({ 'success': renderNotes }); + * }); + * // `renderNotes` is run once, after all notes have saved + */ + function after(n, func) { + if (n < 1) { + return func(); + } + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that, when called, invokes `func` with the `this` + * binding of `thisArg` and prepends any additional `bind` arguments to those + * passed to the bound function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to bind. + * @param {Mixed} [thisArg] The `this` binding of `func`. + * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var func = function(greeting) { + * return greeting + ' ' + this.name; + * }; + * + * func = _.bind(func, { 'name': 'moe' }, 'hi'); + * func(); + * // => 'hi moe' + */ + function bind(func, thisArg) { + // use `Function#bind` if it exists and is fast + // (in V8 `Function#bind` is slower except when partially applied) + return isBindFast || (nativeBind && arguments.length > 2) + ? nativeBind.call.apply(nativeBind, arguments) + : createBound(func, thisArg, slice(arguments, 2)); + } + + /** + * Binds methods on `object` to `object`, overwriting the existing method. + * Method names may be specified as individual arguments or as arrays of method + * names. If no method names are provided, all the function properties of `object` + * will be bound. + * + * @static + * @memberOf _ + * @category Functions + * @param {Object} object The object to bind and assign the bound methods to. + * @param {String} [methodName1, methodName2, ...] Method names on the object to bind. + * @returns {Object} Returns `object`. + * @example + * + * var view = { + * 'label': 'docs', + * 'onClick': function() { alert('clicked ' + this.label); } + * }; + * + * _.bindAll(view); + * jQuery('#docs').on('click', view.onClick); + * // => alerts 'clicked docs', when the button is clicked + */ + function bindAll(object) { + var funcs = concat.apply(arrayRef, arguments), + index = funcs.length > 1 ? 0 : (funcs = functions(object), -1), + length = funcs.length; + + while (++index < length) { + var key = funcs[index]; + object[key] = bind(object[key], object); + } + return object; + } + + /** + * Creates a function that, when called, invokes the method at `object[key]` + * and prepends any additional `bindKey` arguments to those passed to the bound + * function. This method differs from `_.bind` by allowing bound functions to + * reference methods that will be redefined or don't yet exist. + * See http://michaux.ca/articles/lazy-function-definition-pattern. + * + * @static + * @memberOf _ + * @category Functions + * @param {Object} object The object the method belongs to. + * @param {String} key The key of the method. + * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'name': 'moe', + * 'greet': function(greeting) { + * return greeting + ' ' + this.name; + * } + * }; + * + * var func = _.bindKey(object, 'greet', 'hi'); + * func(); + * // => 'hi moe' + * + * object.greet = function(greeting) { + * return greeting + ', ' + this.name + '!'; + * }; + * + * func(); + * // => 'hi, moe!' + */ + function bindKey(object, key) { + return createBound(object, key, slice(arguments, 2)); + } + + /** + * Creates a function that is the composition of the passed functions, + * where each function consumes the return value of the function that follows. + * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`. + * Each function is executed with the `this` binding of the composed function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} [func1, func2, ...] Functions to compose. + * @returns {Function} Returns the new composed function. + * @example + * + * var greet = function(name) { return 'hi ' + name; }; + * var exclaim = function(statement) { return statement + '!'; }; + * var welcome = _.compose(exclaim, greet); + * welcome('moe'); + * // => 'hi moe!' + */ + function compose() { + var funcs = arguments; + return function() { + var args = arguments, + length = funcs.length; + + while (length--) { + args = [funcs[length].apply(this, args)]; + } + return args[0]; + }; + } + + /** + * Creates a function that will delay the execution of `func` until after + * `wait` milliseconds have elapsed since the last time it was invoked. Pass + * `true` for `immediate` to cause debounce to invoke `func` on the leading, + * instead of the trailing, edge of the `wait` timeout. Subsequent calls to + * the debounced function will return the result of the last `func` call. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to debounce. + * @param {Number} wait The number of milliseconds to delay. + * @param {Boolean} immediate A flag to indicate execution is on the leading + * edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * var lazyLayout = _.debounce(calculateLayout, 300); + * jQuery(window).on('resize', lazyLayout); + */ + function debounce(func, wait, immediate) { + var args, + result, + thisArg, + timeoutId; + + function delayed() { + timeoutId = null; + if (!immediate) { + result = func.apply(thisArg, args); + } + } + return function() { + var isImmediate = immediate && !timeoutId; + args = arguments; + thisArg = this; + + clearTimeout(timeoutId); + timeoutId = setTimeout(delayed, wait); + + if (isImmediate) { + result = func.apply(thisArg, args); + } + return result; + }; + } + + /** + * Executes the `func` function after `wait` milliseconds. Additional arguments + * will be passed to `func` when it is invoked. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to delay. + * @param {Number} wait The number of milliseconds to delay execution. + * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the function with. + * @returns {Number} Returns the `setTimeout` timeout id. + * @example + * + * var log = _.bind(console.log, console); + * _.delay(log, 1000, 'logged later'); + * // => 'logged later' (Appears after one second.) + */ + function delay(func, wait) { + var args = slice(arguments, 2); + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * Defers executing the `func` function until the current call stack has cleared. + * Additional arguments will be passed to `func` when it is invoked. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to defer. + * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the function with. + * @returns {Number} Returns the `setTimeout` timeout id. + * @example + * + * _.defer(function() { alert('deferred'); }); + * // returns from the function before `alert` is called + */ + function defer(func) { + var args = slice(arguments, 1); + return setTimeout(function() { func.apply(undefined, args); }, 1); + } + // use `setImmediate` if it's available in Node.js + if (isV8 && freeModule && typeof setImmediate == 'function') { + defer = bind(setImmediate, window); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * passed, it will be used to determine the cache key for storing the result + * based on the arguments passed to the memoized function. By default, the first + * argument passed to the memoized function is used as the cache key. The `func` + * is executed with the `this` binding of the memoized function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] A function used to resolve the cache key. + * @returns {Function} Returns the new memoizing function. + * @example + * + * var fibonacci = _.memoize(function(n) { + * return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); + * }); + */ + function memoize(func, resolver) { + var cache = {}; + return function() { + var key = (resolver ? resolver.apply(this, arguments) : arguments[0]) + ''; + return hasOwnProperty.call(cache, key) + ? cache[key] + : (cache[key] = func.apply(this, arguments)); + }; + } + + /** + * Creates a function that is restricted to execute `func` once. Repeat calls to + * the function will return the value of the first call. The `func` is executed + * with the `this` binding of the created function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // `initialize` executes `createApplication` once + */ + function once(func) { + var ran, + result; + + return function() { + if (ran) { + return result; + } + ran = true; + result = func.apply(this, arguments); + + // clear the `func` variable so the function may be garbage collected + func = null; + return result; + }; + } + + /** + * Creates a function that, when called, invokes `func` with any additional + * `partial` arguments prepended to those passed to the new function. This + * method is similar to `_.bind`, except it does **not** alter the `this` binding. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to partially apply arguments to. + * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var greet = function(greeting, name) { return greeting + ' ' + name; }; + * var hi = _.partial(greet, 'hi'); + * hi('moe'); + * // => 'hi moe' + */ + function partial(func) { + return createBound(func, slice(arguments, 1)); + } + + /** + * This method is similar to `_.partial`, except that `partial` arguments are + * appended to those passed to the new function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to partially apply arguments to. + * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var defaultsDeep = _.partialRight(_.merge, _.defaults); + * + * var options = { + * 'variable': 'data', + * 'imports': { 'jq': $ } + * }; + * + * defaultsDeep(options, _.templateSettings); + * + * options.variable + * // => 'data' + * + * options.imports + * // => { '_': _, 'jq': $ } + */ + function partialRight(func) { + return createBound(func, slice(arguments, 1), null, indicatorObject); + } + + /** + * Creates a function that, when executed, will only call the `func` + * function at most once per every `wait` milliseconds. If the throttled + * function is invoked more than once during the `wait` timeout, `func` will + * also be called on the trailing edge of the timeout. Subsequent calls to the + * throttled function will return the result of the last `func` call. + * + * @static + * @memberOf _ + * @category Functions + * @param {Function} func The function to throttle. + * @param {Number} wait The number of milliseconds to throttle executions to. + * @returns {Function} Returns the new throttled function. + * @example + * + * var throttled = _.throttle(updatePosition, 100); + * jQuery(window).on('scroll', throttled); + */ + function throttle(func, wait) { + var args, + result, + thisArg, + timeoutId, + lastCalled = 0; + + function trailingCall() { + lastCalled = new Date; + timeoutId = null; + result = func.apply(thisArg, args); + } + return function() { + var now = new Date, + remaining = wait - (now - lastCalled); + + args = arguments; + thisArg = this; + + if (remaining <= 0) { + clearTimeout(timeoutId); + timeoutId = null; + lastCalled = now; + result = func.apply(thisArg, args); + } + else if (!timeoutId) { + timeoutId = setTimeout(trailingCall, remaining); + } + return result; + }; + } + + /** + * Creates a function that passes `value` to the `wrapper` function as its + * first argument. Additional arguments passed to the function are appended + * to those passed to the `wrapper` function. The `wrapper` is executed with + * the `this` binding of the created function. + * + * @static + * @memberOf _ + * @category Functions + * @param {Mixed} value The value to wrap. + * @param {Function} wrapper The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var hello = function(name) { return 'hello ' + name; }; + * hello = _.wrap(hello, function(func) { + * return 'before, ' + func('moe') + ', after'; + * }); + * hello(); + * // => 'before, hello moe, after' + */ + function wrap(value, wrapper) { + return function() { + var args = [value]; + push.apply(args, arguments); + return wrapper.apply(this, args); + }; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their + * corresponding HTML entities. + * + * @static + * @memberOf _ + * @category Utilities + * @param {String} string The string to escape. + * @returns {String} Returns the escaped string. + * @example + * + * _.escape('Moe, Larry & Curly'); + * // => 'Moe, Larry & Curly' + */ + function escape(string) { + return string == null ? '' : (string + '').replace(reUnescapedHtml, escapeHtmlChar); + } + + /** + * This function returns the first argument passed to it. + * + * @static + * @memberOf _ + * @category Utilities + * @param {Mixed} value Any value. + * @returns {Mixed} Returns `value`. + * @example + * + * var moe = { 'name': 'moe' }; + * moe === _.identity(moe); + * // => true + */ + function identity(value) { + return value; + } + + /** + * Adds functions properties of `object` to the `lodash` function and chainable + * wrapper. + * + * @static + * @memberOf _ + * @category Utilities + * @param {Object} object The object of function properties to add to `lodash`. + * @example + * + * _.mixin({ + * 'capitalize': function(string) { + * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase(); + * } + * }); + * + * _.capitalize('moe'); + * // => 'Moe' + * + * _('moe').capitalize(); + * // => 'Moe' + */ + function mixin(object) { + forEach(functions(object), function(methodName) { + var func = lodash[methodName] = object[methodName]; + + lodash.prototype[methodName] = function() { + var args = [this.__wrapped__]; + push.apply(args, arguments); + return new lodash(func.apply(lodash, args)); + }; + }); + } + + /** + * Reverts the '_' variable to its previous value and returns a reference to + * the `lodash` function. + * + * @static + * @memberOf _ + * @category Utilities + * @returns {Function} Returns the `lodash` function. + * @example + * + * var lodash = _.noConflict(); + */ + function noConflict() { + window._ = oldDash; + return this; + } + + /** + * Produces a random number between `min` and `max` (inclusive). If only one + * argument is passed, a number between `0` and the given number will be returned. + * + * @static + * @memberOf _ + * @category Utilities + * @param {Number} [min=0] The minimum possible value. + * @param {Number} [max=1] The maximum possible value. + * @returns {Number} Returns a random number. + * @example + * + * _.random(0, 5); + * // => a number between 0 and 5 + * + * _.random(5); + * // => also a number between 0 and 5 + */ + function random(min, max) { + if (min == null && max == null) { + max = 1; + } + min = +min || 0; + if (max == null) { + max = min; + min = 0; + } + return min + floor(nativeRandom() * ((+max || 0) - min + 1)); + } + + /** + * Resolves the value of `property` on `object`. If `property` is a function, + * it will be invoked and its result returned, else the property value is + * returned. If `object` is falsey, then `null` is returned. + * + * @static + * @memberOf _ + * @category Utilities + * @param {Object} object The object to inspect. + * @param {String} property The property to get the value of. + * @returns {Mixed} Returns the resolved value. + * @example + * + * var object = { + * 'cheese': 'crumpets', + * 'stuff': function() { + * return 'nonsense'; + * } + * }; + * + * _.result(object, 'cheese'); + * // => 'crumpets' + * + * _.result(object, 'stuff'); + * // => 'nonsense' + */ + function result(object, property) { + var value = object ? object[property] : undefined; + return isFunction(value) ? object[property]() : value; + } + + /** + * A micro-templating method that handles arbitrary delimiters, preserves + * whitespace, and correctly escapes quotes within interpolated code. + * + * Note: In the development build, `_.template` utilizes sourceURLs for easier + * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl + * + * Note: Lo-Dash may be used in Chrome extensions by either creating a `lodash csp` + * build and using precompiled templates, or loading Lo-Dash in a sandbox. + * + * For more information on precompiling templates see: + * http://lodash.com/#custom-builds + * + * For more information on Chrome extension sandboxes see: + * http://developer.chrome.com/stable/extensions/sandboxingEval.html + * + * @static + * @memberOf _ + * @category Utilities + * @param {String} text The template text. + * @param {Obect} data The data object used to populate the text. + * @param {Object} options The options object. + * escape - The "escape" delimiter regexp. + * evaluate - The "evaluate" delimiter regexp. + * interpolate - The "interpolate" delimiter regexp. + * sourceURL - The sourceURL of the template's compiled source. + * variable - The data object variable name. + * + * @returns {Function|String} Returns a compiled function when no `data` object + * is given, else it returns the interpolated text. + * @example + * + * // using a compiled template + * var compiled = _.template('hello <%= name %>'); + * compiled({ 'name': 'moe' }); + * // => 'hello moe' + * + * var list = '<% _.forEach(people, function(name) { %>
    • <%= name %>
    • <% }); %>'; + * _.template(list, { 'people': ['moe', 'larry'] }); + * // => '
    • moe
    • larry
    • ' + * + * // using the "escape" delimiter to escape HTML in data property values + * _.template('<%- value %>', { 'value': '\n```\n\nUsing [`npm`](http://npmjs.org/):\n\n```bash\nnpm install lodash\n\nnpm install -g lodash\nnpm link lodash\n```\n\nTo avoid potential issues, update `npm` before installing Lo-Dash:\n\n```bash\nnpm install npm -g\n```\n\nIn [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n\n// or as a drop-in replacement for Underscore\nvar _ = require('lodash/lodash.underscore');\n```\n\n**Note:** If Lo-Dash is installed globally, run [`npm link lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory before requiring it.\n\nIn [RingoJS v0.7.0-](http://ringojs.org/):\n\n```js\nvar _ = require('lodash')._;\n```\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader like [RequireJS](http://requirejs.org/):\n\n```js\nrequire({\n 'paths': {\n 'underscore': 'path/to/lodash'\n }\n},\n['underscore'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Release Notes\n\n### v1.0.1\n\n * Add support for specifying source map URLs in `-p`/`--source-map` build options\n * Ensured the second argument passed to `_.assign` is not treated as a `callback`\n * Ensured `-p`/`--source-map` build options correctly set the `sourceMappingURL`\n * Made `-p`/`--source-map` build options set source map *“sources”* keys based on the builds performed\n * Made `_.defer` use `setImmediate`, in Node.js, when available\n * Made `_.where` search arrays for values regardless of their index position\n * Removed dead code from `_.template`\n\nThe full changelog is available [here](https://github.com/lodash/lodash/wiki/Changelog).\n\n## BestieJS\n\nLo-Dash is part of the [BestieJS](https://github.com/bestiejs) *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](http://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://iceddev.com/) | [Kit Cambridge](http://kitcambridge.github.io/) | [Mathias Bynens](http://mathiasbynens.be/) |\n", + "readmeFilename": "README.md", + "_id": "lodash@1.0.1", + "_from": "lodash@~1.0.1" +} diff --git a/node_modules/gulp/node_modules/findup-sync/package.json b/node_modules/gulp/node_modules/findup-sync/package.json new file mode 100644 index 00000000..7940868b --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/package.json @@ -0,0 +1,48 @@ +{ + "name": "findup-sync", + "description": "Find the first file matching a given pattern in the current directory or the nearest ancestor directory.", + "version": "0.1.2", + "homepage": "https://github.com/cowboy/node-findup-sync", + "author": { + "name": "\"Cowboy\" Ben Alman", + "url": "http://benalman.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/cowboy/node-findup-sync.git" + }, + "bugs": { + "url": "https://github.com/cowboy/node-findup-sync/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/cowboy/node-findup-sync/blob/master/LICENSE-MIT" + } + ], + "main": "lib/findup-sync", + "engines": { + "node": ">= 0.6.0" + }, + "scripts": { + "test": "grunt nodeunit" + }, + "dependencies": { + "glob": "~3.1.21", + "lodash": "~1.0.1" + }, + "devDependencies": { + "grunt": "~0.4.0", + "grunt-contrib-jshint": "~0.2.0", + "grunt-contrib-nodeunit": "~0.1.2" + }, + "keywords": [ + "find", + "glob", + "file" + ], + "readme": "# findup-sync\n\nFind the first file matching a given pattern in the current directory or the nearest ancestor directory.\n\n## Getting Started\nInstall the module with: `npm install findup-sync`\n\n```js\nvar findup = require('findup-sync');\n\n// Start looking in the CWD.\nvar filepath1 = findup('{a,b}*.txt');\n\n// Start looking somewhere else, and ignore case (probably a good idea).\nvar filepath2 = findup('{a,b}*.txt', {cwd: '/some/path', nocase: true});\n```\n\n## Usage\n\n```js\nfindup(patternOrPatterns [, minimatchOptions])\n```\n\n### patternOrPatterns\nType: `String` or `Array` \nDefault: none\n\nOne or more wildcard glob patterns. Or just filenames.\n\n### minimatchOptions\nType: `Object` \nDefault: `{}`\n\nOptions to be passed to [minimatch](https://github.com/isaacs/minimatch).\n\nNote that if you want to start in a different directory than the current working directory, specify a `cwd` property here.\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n2013-03-08 - v0.1.2 - Updated dependencies. Fixed a Node 0.9.x bug. Updated unit tests to work cross-platform. \n2012-11-15 - v0.1.1 - Now works without an options object. \n2012-11-01 - v0.1.0 - Initial release.\n", + "readmeFilename": "README.md", + "_id": "findup-sync@0.1.2", + "_from": "findup-sync@~0.1.2" +} diff --git a/node_modules/gulp/node_modules/findup-sync/test/findup-sync_test.js b/node_modules/gulp/node_modules/findup-sync/test/findup-sync_test.js new file mode 100644 index 00000000..f8baf9ef --- /dev/null +++ b/node_modules/gulp/node_modules/findup-sync/test/findup-sync_test.js @@ -0,0 +1,48 @@ +'use strict'; + +// Nodejs lib. +var path = require('path'); + +var findup = require('../lib/findup-sync.js'); + +// Get a relative path. +var rel = function(abspath) { + return typeof abspath === 'string' ? path.relative('.', abspath) : abspath; +}; + +exports['findup'] = { + setUp: function(done) { + this.cwd = process.cwd(); + done(); + }, + tearDown: function(done) { + process.chdir(this.cwd); + done(); + }, + 'simple': function(test) { + test.expect(8); + var opts = {cwd: 'test/fixtures/a/b'}; + test.equal(rel(findup('foo.txt', opts)), path.normalize('test/fixtures/a/foo.txt'), 'should find files'); + test.equal(rel(findup('bar.txt', opts)), path.normalize('test/fixtures/a/b/bar.txt'), 'should find files'); + test.equal(rel(findup('a.txt', opts)), path.normalize('test/fixtures/a.txt'), 'should find files'); + test.equal(rel(findup('?.txt', opts)), path.normalize('test/fixtures/a.txt'), 'should support glob patterns'); + test.equal(rel(findup('*.txt', opts)), path.normalize('test/fixtures/a/b/bar.txt'), 'should find the first thing that matches the glob pattern'); + test.equal(rel(findup(['b*.txt', 'f*.txt'], opts)), path.normalize('test/fixtures/a/b/bar.txt'), 'should find the first thing that matches any of the glob patterns'); + test.equal(rel(findup(['f*.txt', 'b*.txt'], opts)), path.normalize('test/fixtures/a/b/bar.txt'), 'should find the first thing that matches any of the glob patterns'); + test.equal(findup('not-gonna-exist-i-hope.txt', opts), null, 'should returning null if no files found'); + test.done(); + }, + 'cwd': function(test) { + test.expect(8); + process.chdir('test/fixtures/a/b'); + test.equal(rel(findup('foo.txt')), path.normalize('../foo.txt'), 'should find files'); + test.equal(rel(findup('bar.txt')), 'bar.txt', 'should find files'); + test.equal(rel(findup('a.txt')), path.normalize('../../a.txt'), 'should find files'); + test.equal(rel(findup('?.txt')), path.normalize('../../a.txt'), 'should support glob patterns'); + test.equal(rel(findup('*.txt')), 'bar.txt', 'should find the first thing that matches the glob pattern'); + test.equal(rel(findup(['b*.txt', 'f*.txt'])), 'bar.txt', 'should find the first thing that matches any of the glob patterns'); + test.equal(rel(findup(['f*.txt', 'b*.txt'])), 'bar.txt', 'should find the first thing that matches any of the glob patterns'); + test.equal(findup('not-gonna-exist-i-hope.txt'), null, 'should returning null if no files found'); + test.done(); + }, +}; diff --git a/node_modules/gulp/node_modules/findup-sync/test/fixtures/a.txt b/node_modules/gulp/node_modules/findup-sync/test/fixtures/a.txt new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/gulp/node_modules/findup-sync/test/fixtures/a/b/bar.txt b/node_modules/gulp/node_modules/findup-sync/test/fixtures/a/b/bar.txt new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/gulp/node_modules/findup-sync/test/fixtures/a/foo.txt b/node_modules/gulp/node_modules/findup-sync/test/fixtures/a/foo.txt new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/gulp/node_modules/findup-sync/test/fixtures/aaa.txt b/node_modules/gulp/node_modules/findup-sync/test/fixtures/aaa.txt new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/gulp/node_modules/gulp-util/.npmignore b/node_modules/gulp/node_modules/gulp-util/.npmignore new file mode 100644 index 00000000..b5ef13a3 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/.npmignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +node_modules +build +*.node +components \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/.travis.yml b/node_modules/gulp/node_modules/gulp-util/.travis.yml new file mode 100644 index 00000000..33ad9f8c --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.9" + - "0.10" +after_script: + - npm run coveralls \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/LICENSE b/node_modules/gulp/node_modules/gulp-util/LICENSE new file mode 100755 index 00000000..7cbe012c --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Fractal + +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/gulp/node_modules/gulp-util/README.md b/node_modules/gulp/node_modules/gulp-util/README.md new file mode 100644 index 00000000..fd0e506e --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/README.md @@ -0,0 +1,166 @@ +# gulp-util [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status](https://david-dm.org/gulpjs/gulp-util.png?theme=shields.io)](https://david-dm.org/gulpjs/gulp-util) + +## Information + + + + + + + + + + + + + +
      Packagegulp-util
      DescriptionUtility functions for gulp plugins
      Node Version>= 0.9
      + +## Usage + +```javascript +var gutil = require('gulp-util'); + +gutil.log('stuff happened', 'Really it did', gutil.colors.cyan('123')); +gutil.beep(); + +gutil.replaceExtension('file.coffee', '.js'); // file.js + +var opt = { + name: 'todd', + file: someGulpFile +}; +gutil.template('test <%= name %> <%= file.path %>', opt) // test todd /js/hi.js +``` + +### log(msg...) + +Logs stuff. Already prefixed with [gulp] and all that. Use the right colors for values. If you pass in multiple arguments it will join them by a space. + +``` +values (files, module names, etc.) = magenta +numbers (times, counts, etc) = cyan +``` + +### colors + +This is an instance of [chalk](https://github.com/sindresorhus/chalk) + +### date + +This is an instance of [node-dateformat](https://github.com/felixge/node-dateformat). + +### linefeed + +Just `\n`. Use this. + +### replaceExtension(path, newExtension) + +Replaces a file extension in a path. Returns the new path. + +### isStream(obj) + +Returns true or false if an object is a stream. + +### isBuffer(obj) + +Returns true or false if an object is a Buffer. + +### template(string[, data]) + +This is a lodash.template function wrapper. You must pass in a valid gulp file object so it is available to the user or it will error. You can not configure any of the delimiters. Look at the [lodash docs](http://lodash.com/docs#template) for more info. + +## new File(obj) + +This is just [vinyl](https://github.com/wearefractal/vinyl) + +```javascript +var file = new gutil.File({ + base: join(__dirname, './fixtures/'), + cwd: __dirname, + path: join(__dirname, './fixtures/test.coffee') +}); +``` + +## noop() + +Returns a stream that does nothing but pass data straight through. + +```javascript +gulp.task('scripts', function() { + gulp.src('src/**/*.js') + .pipe(concat('script.js')) + .pipe(gulp.env.production ? uglify() : gutil.noop()) + .pipe(gulp.dest('dist/'); +}); +``` + +## combine(streams...) + +Argument may also be an array of streams. Returns a function that returns the combined stream. Useful for keeping things DRY. This is a simple wrapper around event-stream's `.pipeline` + +```javascript +var scripts = gutil.combine( + coffee({bare: true}), + uglify(), + concat('script.js'), + gulp.dest('dist/') +); + +gulp.task('default', function() { + gulp.src('*.coffee').pipe(scripts()); +}); +``` + +## buffer(cb) + +This is similar to es.wait but instead of buffering text into one string it buffers anything into an array (so very useful for file objects). + +Returns a stream that can be piped to. + +The stream will emit one data event after the stream piped to it has ended. The data will be the same array passed to the callback. + +Callback is optional and receives two arguments: error and data + +```javascript +gulp.src('stuff/*.js') + .pipe(gutil.buffer(function(err, files){ + + }); +``` + +## new PluginError(pluginName, message[, options]) + +- pluginName should be the module name of your plugin +- message can be a string or an existing error +- By default the stack will not be shown. Set `options.showStack` to true if you think the stack is important for your error. +- If you pass an error in as the message the stack will be pulled from that, otherwise one will be created. + +These are all acceptable forms of instantiation: + +```javascript +var err = new gutil.PluginError('test', { + message: 'something broke' +}); + +var err = new gutil.PluginError({ + plugin: 'test', + message: 'something broke' +}); + +var err = new gutil.PluginError('test', 'something broke'); + +var err = new gutil.PluginError('test', 'something broke', {showStack: true}); + +var existingError = new Error('OMG'); +var err = new gutil.PluginError('test', existingError, {showStack: true}); +``` + +[npm-url]: https://npmjs.org/package/gulp-util +[npm-image]: https://badge.fury.io/js/gulp-util.png +[travis-url]: https://travis-ci.org/gulpjs/gulp-util +[travis-image]: https://travis-ci.org/gulpjs/gulp-util.png?branch=master +[coveralls-url]: https://coveralls.io/r/gulpjs/gulp-util +[coveralls-image]: https://coveralls.io/repos/gulpjs/gulp-util/badge.png +[depstat-url]: https://david-dm.org/gulpjs/gulp-util +[depstat-image]: https://david-dm.org/gulpjs/gulp-util.png diff --git a/node_modules/gulp/node_modules/gulp-util/index.js b/node_modules/gulp/node_modules/gulp-util/index.js new file mode 100644 index 00000000..6746ee4b --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/index.js @@ -0,0 +1,18 @@ +module.exports = { + File: require('./lib/File'), + replaceExtension: require('./lib/replaceExtension'), + colors: require('./lib/colors'), + date: require('./lib/date'), + log: require('./lib/log'), + template: require('./lib/template'), + env: require('./lib/env'), + beep: require('./lib/beep'), + noop: require('./lib/noop'), + isStream: require('./lib/isStream'), + isBuffer: require('./lib/isBuffer'), + isNull: require('./lib/isNull'), + linefeed: require('./lib/linefeed'), + combine: require('./lib/combine'), + buffer: require('./lib/buffer'), + PluginError: require('./lib/PluginError') +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/File.js b/node_modules/gulp/node_modules/gulp-util/lib/File.js new file mode 100644 index 00000000..690a508a --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/File.js @@ -0,0 +1 @@ +module.exports = require('vinyl'); \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/PluginError.js b/node_modules/gulp/node_modules/gulp-util/lib/PluginError.js new file mode 100644 index 00000000..96555672 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/PluginError.js @@ -0,0 +1,65 @@ +var util = require('util'); +var colors = require('./colors'); + +// wow what a clusterfuck +var parseOptions = function(plugin, message, opt) { + if (!opt) opt = {}; + if (typeof plugin === 'object') { + opt = plugin; + } else if (message instanceof Error) { + opt.message = message; + opt.plugin = plugin; + } else if (typeof message === 'object') { + opt = message; + opt.plugin = plugin; + } else if (typeof opt === 'object') { + opt.plugin = plugin; + opt.message = message; + } + return opt; +}; + +function PluginError(plugin, message, opt) { + if (!(this instanceof PluginError)) throw new Error('Call PluginError using new'); + + Error.call(this); + + var options = parseOptions(plugin, message, opt); + + this.plugin = options.plugin; + this.showStack = options.showStack; + + // if message is an Error grab crap off it + if (options.message instanceof Error) { + this.name = options.message.name; + this.message = options.message.message; + this.fileName = options.message.fileName; + this.lineNumber = options.message.lineNumber; + this.stack = options.message.stack; + } else { // else check options obj + this.name = options.name; + this.message = options.message; + this.fileName = options.fileName; + this.lineNumber = options.lineNumber; + this.stack = options.stack; + } + + // defaults + if (!this.name) this.name = 'Error'; + + // TODO: figure out why this explodes mocha + if (!this.stack) Error.captureStackTrace(this, arguments.callee || this.constructor); + + if (!this.plugin) throw new Error('Missing plugin name'); + if (!this.message) throw new Error('Missing error message'); +} + +util.inherits(PluginError, Error); + +PluginError.prototype.toString = function () { + var sig = '['+colors.green('gulp')+'] '+this.name+' in plugin \''+colors.cyan(this.plugin)+'\''; + var msg = this.showStack ? (this._stack || this.stack) : this.message; + return sig+': '+msg; +}; + +module.exports = PluginError; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/beep.js b/node_modules/gulp/node_modules/gulp-util/lib/beep.js new file mode 100644 index 00000000..5473d754 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/beep.js @@ -0,0 +1,3 @@ +module.exports = function() { + process.stdout.write('\x07'); +}; diff --git a/node_modules/gulp/node_modules/gulp-util/lib/buffer.js b/node_modules/gulp/node_modules/gulp-util/lib/buffer.js new file mode 100644 index 00000000..4cb064ac --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/buffer.js @@ -0,0 +1,15 @@ +var through = require('through2'); + +module.exports = function(fn) { + var buf = []; + var end = function(cb) { + this.push(buf); + cb(); + if(fn) fn(null, buf); + }; + var push = function(data, enc, cb) { + buf.push(data); + cb(); + }; + return through.obj(push, end); +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/colors.js b/node_modules/gulp/node_modules/gulp-util/lib/colors.js new file mode 100644 index 00000000..bc804940 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/colors.js @@ -0,0 +1 @@ +module.exports = require('chalk'); \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/combine.js b/node_modules/gulp/node_modules/gulp-util/lib/combine.js new file mode 100644 index 00000000..f20712d2 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/combine.js @@ -0,0 +1,11 @@ +var pipeline = require('multipipe'); + +module.exports = function(){ + var args = arguments; + if (args.length === 1 && Array.isArray(args[0])) { + args = args[0]; + } + return function(){ + return pipeline.apply(pipeline, args); + }; +}; diff --git a/node_modules/gulp/node_modules/gulp-util/lib/date.js b/node_modules/gulp/node_modules/gulp-util/lib/date.js new file mode 100644 index 00000000..935793cc --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/date.js @@ -0,0 +1 @@ +module.exports = require('dateformat'); \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/env.js b/node_modules/gulp/node_modules/gulp-util/lib/env.js new file mode 100644 index 00000000..ea1e03e4 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/env.js @@ -0,0 +1,4 @@ +var parseArgs = require('minimist'); +var argv = parseArgs(process.argv.slice(2)); + +module.exports = argv; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/isBuffer.js b/node_modules/gulp/node_modules/gulp-util/lib/isBuffer.js new file mode 100644 index 00000000..0e23782c --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/isBuffer.js @@ -0,0 +1,7 @@ +var buf = require('buffer'); +var Buffer = buf.Buffer; + +// could use Buffer.isBuffer but this is the same exact thing... +module.exports = function(o) { + return typeof o === 'object' && o instanceof Buffer; +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/isNull.js b/node_modules/gulp/node_modules/gulp-util/lib/isNull.js new file mode 100644 index 00000000..403bb30e --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/isNull.js @@ -0,0 +1,3 @@ +module.exports = function(v) { + return v === null; +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/isStream.js b/node_modules/gulp/node_modules/gulp-util/lib/isStream.js new file mode 100644 index 00000000..9ce0929b --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/isStream.js @@ -0,0 +1,5 @@ +var Stream = require('stream').Stream; + +module.exports = function(o) { + return !!o && o instanceof Stream; +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/linefeed.js b/node_modules/gulp/node_modules/gulp-util/lib/linefeed.js new file mode 100644 index 00000000..5b0dfa4b --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/linefeed.js @@ -0,0 +1 @@ +module.exports = '\n'; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/log.js b/node_modules/gulp/node_modules/gulp-util/lib/log.js new file mode 100644 index 00000000..cdbb22fc --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/log.js @@ -0,0 +1,9 @@ +var colors = require('./colors'); + +module.exports = function(){ + var sig = '['+colors.green('gulp')+']'; + var args = Array.prototype.slice.call(arguments); + args.unshift(sig); + console.log.apply(console, args); + return this; +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/noop.js b/node_modules/gulp/node_modules/gulp-util/lib/noop.js new file mode 100644 index 00000000..7862cb16 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/noop.js @@ -0,0 +1,5 @@ +var through = require('through2'); + +module.exports = function () { + return through.obj(); +}; diff --git a/node_modules/gulp/node_modules/gulp-util/lib/replaceExtension.js b/node_modules/gulp/node_modules/gulp-util/lib/replaceExtension.js new file mode 100644 index 00000000..3f76938e --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/replaceExtension.js @@ -0,0 +1,9 @@ +var path = require('path'); + +module.exports = function(npath, ext) { + if (typeof npath !== 'string') return npath; + if (npath.length === 0) return npath; + + var nFileName = path.basename(npath, path.extname(npath))+ext; + return path.join(path.dirname(npath), nFileName); +}; \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/lib/template.js b/node_modules/gulp/node_modules/gulp-util/lib/template.js new file mode 100644 index 00000000..c467820f --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/lib/template.js @@ -0,0 +1,19 @@ +var template = require('lodash.template'); +var reInterpolate = require('lodash._reinterpolate'); + +var forcedSettings = { + escape: /<%-([\s\S]+?)%>/g, + evaluate: /<%([\s\S]+?)%>/g, + interpolate: reInterpolate +}; + +module.exports = function(tmpl, data){ + var fn = template(tmpl, null, forcedSettings); + + var wrapped = function(o) { + if (typeof o === 'undefined' || typeof o.file === 'undefined') throw new Error('Failed to provide the current file as "file" to the template'); + return fn(o); + }; + + return (data ? wrapped(data) : wrapped); +}; diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/index.js b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/index.js new file mode 100644 index 00000000..a21f7022 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/index.js @@ -0,0 +1,63 @@ +'use strict'; +var ansi = require('ansi-styles'); +var stripAnsi = require('strip-ansi'); +var hasColor = require('has-color'); +var defineProps = Object.defineProperties; +var chalk = module.exports; + +var styles = (function () { + var ret = {}; + + ansi.grey = ansi.gray; + + Object.keys(ansi).forEach(function (key) { + ret[key] = { + get: function () { + this._styles.push(key); + return this; + } + }; + }); + + return ret; +})(); + +function init() { + var ret = {}; + + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + var obj = defineProps(function self() { + var str = [].slice.call(arguments).join(' '); + + if (!chalk.enabled) { + return str; + } + + return self._styles.reduce(function (str, name) { + var code = ansi[name]; + return str ? code.open + str + code.close : ''; + }, str); + }, styles); + + obj._styles = []; + + return obj[name]; + } + } + }); + + return ret; +} + +defineProps(chalk, init()); + +chalk.styles = ansi; +chalk.stripColor = stripAnsi; +chalk.supportsColor = hasColor; + +// detect mode if not set manually +if (chalk.enabled === undefined) { + chalk.enabled = chalk.supportsColor; +} diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi new file mode 120000 index 00000000..b65c9f81 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/.bin/strip-ansi @@ -0,0 +1 @@ +../strip-ansi/cli.js \ No newline at end of file diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js new file mode 100644 index 00000000..3da548c4 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js @@ -0,0 +1,38 @@ +'use strict'; +var styles = module.exports; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49] +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = {}; + style.open = '\x1b[' + val[0] + 'm'; + style.close = '\x1b[' + val[1] + 'm'; +}); diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json new file mode 100644 index 00000000..633d5e9b --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/package.json @@ -0,0 +1,62 @@ +{ + "name": "ansi-styles", + "version": "1.0.0", + "description": "ANSI escape codes for colorizing strings in the terminal", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "homepage": "https://github.com/sindresorhus/ansi-styles", + "bugs": { + "url": "https://github.com/sindresorhus/ansi-styles/issues" + }, + "license": "MIT", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "files": [ + "ansi-styles.js" + ], + "main": "ansi-styles", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/ansi-styles.git" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "~1.12.0" + }, + "engines": { + "node": ">=0.8.0" + }, + "readme": "# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles)\n\n> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for colorizing strings in the terminal.\n\nYou probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.\n\n![screenshot](screenshot.png)\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles`\n\n\n## Example\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green.open + 'Hello world!' + ansi.green.close);\n```\n\n## API\n\nEach style has an `open` and `close` property.\n\n\n## Styles\n\n### General\n\n- reset\n- bold\n- italic\n- underline\n- inverse\n- strikethrough\n\n### Text colors\n\n- black\n- red\n- green\n- yellow\n- blue\n- magenta\n- cyan\n- white\n- gray\n\n### Background colors\n\n- bgBlack\n- bgRed\n- bgGreen\n- bgYellow\n- bgBlue\n- bgMagenta\n- bgCyan\n- bgWhite\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "_id": "ansi-styles@1.0.0", + "dist": { + "shasum": "cb102df1c56f5123eab8b67cd7b98027a0279178" + }, + "_from": "ansi-styles@~1.0.0", + "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" +} diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md new file mode 100644 index 00000000..4ac8cbd0 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/ansi-styles/readme.md @@ -0,0 +1,65 @@ +# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for colorizing strings in the terminal. + +You probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings. + +![screenshot](screenshot.png) + + +## Install + +Install with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles` + + +## Example + +```js +var ansi = require('ansi-styles'); + +console.log(ansi.green.open + 'Hello world!' + ansi.green.close); +``` + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### General + +- reset +- bold +- italic +- underline +- inverse +- strikethrough + +### Text colors + +- black +- red +- green +- yellow +- blue +- magenta +- cyan +- white +- gray + +### Background colors + +- bgBlack +- bgRed +- bgGreen +- bgYellow +- bgBlue +- bgMagenta +- bgCyan +- bgWhite + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js new file mode 100644 index 00000000..27316b1f --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/has-color.js @@ -0,0 +1,24 @@ +'use strict'; +module.exports = (function () { + if (process.argv.indexOf('--no-color') !== -1) { + return false; + } + + if (process.argv.indexOf('--color') !== -1) { + return true; + } + + if (!process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + return /^screen|^xterm|color|ansi|cygwin|linux/i.test(process.env.TERM); +})(); diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json new file mode 100644 index 00000000..d60b2d0a --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/package.json @@ -0,0 +1,59 @@ +{ + "name": "has-color", + "version": "0.1.4", + "description": "Detect whether a terminal supports color", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "capability", + "detect" + ], + "homepage": "https://github.com/sindresorhus/has-color", + "bugs": { + "url": "https://github.com/sindresorhus/has-color/issues" + }, + "license": "MIT", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "files": [ + "has-color.js" + ], + "main": "has-color", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/has-color.git" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "~1.12.0" + }, + "engines": { + "node": ">=0.8.0" + }, + "readme": "# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color)\n\n> Detect whether a terminal supports color.\n\nUsed in the terminal color module [chalk](https://github.com/sindresorhus/chalk).\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/has-color): `npm install --save has-color`\n\n\n## Example\n\n```js\nvar hasColor = require('has-color');\n\nif (hasColor) {\n\tconsole.log('Terminal supports color.');\n}\n```\n\nIt obeys the CLI flags `--color` and `--no-color`.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "_id": "has-color@0.1.4", + "dist": { + "shasum": "d1dadeea5b9e8b446bf08603532333710c95a290" + }, + "_from": "has-color@~0.1.0", + "_resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" +} diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md new file mode 100644 index 00000000..0918c851 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/has-color/readme.md @@ -0,0 +1,28 @@ +# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color) + +> Detect whether a terminal supports color. + +Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk). + + +## Install + +Install with [npm](https://npmjs.org/package/has-color): `npm install --save has-color` + + +## Example + +```js +var hasColor = require('has-color'); + +if (hasColor) { + console.log('Terminal supports color.'); +} +``` + +It obeys the CLI flags `--color` and `--no-color`. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js new file mode 100755 index 00000000..f8019cda --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/cli.js @@ -0,0 +1,27 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var strip = require('./index'); +var input = process.argv[2]; + +if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) { + console.log('strip-ansi > '); + console.log('or'); + console.log('cat | strip-ansi > '); + return; +} + +if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) { + console.log(require('./package').version); + return; +} + +if (input) { + process.stdout.write(strip(fs.readFileSync(input, 'utf8'))); + return; +} + +process.stdin.setEncoding('utf8'); +process.stdin.on('data', function (data) { + process.stdout.write(strip(data)); +}); diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js new file mode 100644 index 00000000..62320c59 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = function (str) { + return typeof str === 'string' ? str.replace(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/g, '') : str; +}; diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json new file mode 100644 index 00000000..459be932 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/package.json @@ -0,0 +1,68 @@ +{ + "name": "strip-ansi", + "version": "0.1.1", + "description": "Strip ANSI escape codes (used for colorizing strings in the terminal)", + "license": "MIT", + "bin": { + "strip-ansi": "cli.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/strip-ansi" + }, + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.8.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js", + "cli.js" + ], + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "devDependencies": { + "mocha": "~1.x" + }, + "readme": "# strip-ansi [![Build Status](https://secure.travis-ci.org/sindresorhus/strip-ansi.png?branch=master)](http://travis-ci.org/sindresorhus/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) (used for colorizing strings in the terminal)\n\nUsed in the terminal color module [chalk](https://github.com/sindresorhus/chalk).\n\n\n## Install\n\nInstall locally with [npm](https://npmjs.org/package/strip-ansi):\n\n```\nnpm install --save strip-ansi\n```\n\nOr globally if you want to use it as a CLI app:\n\n```\nnpm install --global strip-ansi\n```\n\nYou can then use it in your Terminal like:\n\n```\nstrip-ansi file-with-color-codes\n```\n\nOr pipe something to it:\n\n```\nls | strip-ansi\n```\n\n\n## Example\n\n```js\nvar stripAnsi = require('strip-ansi');\nstripAnsi('\\x1b[4mcake\\x1b[0m');\n//=> cake\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n", + "readmeFilename": "readme.md", + "bugs": { + "url": "https://github.com/sindresorhus/strip-ansi/issues" + }, + "homepage": "https://github.com/sindresorhus/strip-ansi", + "_id": "strip-ansi@0.1.1", + "dist": { + "shasum": "39e8a98d044d150660abe4a6808acf70bb7bc991" + }, + "_from": "strip-ansi@~0.1.0", + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" +} diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md new file mode 100644 index 00000000..eb661b3d --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/node_modules/strip-ansi/readme.md @@ -0,0 +1,46 @@ +# strip-ansi [![Build Status](https://secure.travis-ci.org/sindresorhus/strip-ansi.png?branch=master)](http://travis-ci.org/sindresorhus/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) (used for colorizing strings in the terminal) + +Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk). + + +## Install + +Install locally with [npm](https://npmjs.org/package/strip-ansi): + +``` +npm install --save strip-ansi +``` + +Or globally if you want to use it as a CLI app: + +``` +npm install --global strip-ansi +``` + +You can then use it in your Terminal like: + +``` +strip-ansi file-with-color-codes +``` + +Or pipe something to it: + +``` +ls | strip-ansi +``` + + +## Example + +```js +var stripAnsi = require('strip-ansi'); +stripAnsi('\x1b[4mcake\x1b[0m'); +//=> cake +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/package.json b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/package.json new file mode 100644 index 00000000..5ed4c5d5 --- /dev/null +++ b/node_modules/gulp/node_modules/gulp-util/node_modules/chalk/package.json @@ -0,0 +1,65 @@ +{ + "name": "chalk", + "version": "0.4.0", + "description": "Terminal string styling done right. Created because the `colors` module does some really horrible things.", + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/chalk" + }, + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.8.0" + }, + "scripts": { + "test": "mocha" + }, + "files": [ + "index.js" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "ansi", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "has-color": "~0.1.0", + "ansi-styles": "~1.0.0", + "strip-ansi": "~0.1.0" + }, + "devDependencies": { + "mocha": "~1.x" + }, + "readme": "# \"chalk\"\n\n> Terminal string styling done right\n\n[![Build Status](https://secure.travis-ci.org/sindresorhus/chalk.png?branch=master)](http://travis-ci.org/sindresorhus/chalk)\n\n[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![screenshot](screenshot.png)\n\n\n## Why\n\n- **Doesn't extend String.prototype**\n- Expressive API\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n- [Used by 150+ modules](https://npmjs.org/browse/depended/chalk)\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/chalk): `npm install --save chalk`\n\n\n## Example\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nconsole.log( chalk.blue('Hello world!') );\n\n// combine styled and normal strings\nconsole.log( chalk.blue('Hello'), 'World' + chalk.red('!') );\n\n// compose multiple styles using the chainable API\nconsole.log( chalk.blue.bgRed.bold('Hello world!') );\n\n// nest styles\nconsole.log( chalk.red('Hello', chalk.underline.bgBlue('world') + '!') );\n\n// pass in multiple arguments\nconsole.log( chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz') );\n```\n\nYou can easily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\n\n## API\n\n### chalk.` \ No newline at end of file diff --git a/node_modules/mocha/lib/reporters/xunit.js b/node_modules/mocha/lib/reporters/xunit.js new file mode 100644 index 00000000..e956380d --- /dev/null +++ b/node_modules/mocha/lib/reporters/xunit.js @@ -0,0 +1,119 @@ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pending', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +XUnit.prototype.__proto__ = Base.prototype; + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: (test.duration / 1000) || 0 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} diff --git a/node_modules/mocha/lib/runnable.js b/node_modules/mocha/lib/runnable.js new file mode 100644 index 00000000..03b8792b --- /dev/null +++ b/node_modules/mocha/lib/runnable.js @@ -0,0 +1,227 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Runnable.prototype.__proto__ = EventEmitter.prototype; + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Whitelist these globals for this test run + * + * @api private + */ +Runnable.prototype.globals = function(arr){ + var self = this; + this._allowedGlobals = arr; +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; diff --git a/node_modules/mocha/lib/runner.js b/node_modules/mocha/lib/runner.js new file mode 100644 index 00000000..deb442e1 --- /dev/null +++ b/node_modules/mocha/lib/runner.js @@ -0,0 +1,661 @@ +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this._abort = false; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(extraGlobals())); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Runner.prototype.__proto__ = EventEmitter.prototype; + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + this._globals = this._globals.concat(arr); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if(this.prevGlobalsLength == globals.length) return; + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures work in the following pattern: + * - If bail, then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter + * execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + if (this.suite.bail()) { + this.emit('end'); + } +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) { + self.failHook(hook, err); + + // stop executing hooks, notify callee of hook err + return fn(err); + } + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + + function hookErr(err, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + // call hookUp afterEach + self.hookUp('afterEach', function(err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) return hookErr(err2, errSuite2, true); + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + if (self._abort) return fn(); + + if (err) return hookErr(err, errSuite, true); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(err, errSuite){ + + if (err) return hookErr(err, errSuite, false); + + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite == suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } else { + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + } + + if (self._abort) return done(); + + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done(errSuite) { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(errSuite); + }); + } + + this.hook('beforeAll', function(err){ + if (err) return done(); + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Cleanly abort execution + * + * @return {Runner} for chaining + * @api public + */ +Runner.prototype.abort = function(){ + debug('aborting'); + this._abort = true; +} + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method not init at first + // it is assigned in some seconds + if (global.navigator && /^getInterface/.test(key)) return false; + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && /^\d+/.test(key)) return false; + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return false; + + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} + +/** + * Array of globals dependent on the environment. + * + * @return {Array} + * @api private + */ + + function extraGlobals() { + if (typeof(process) === 'object' && + typeof(process.version) === 'string') { + + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); + + // 'errno' was renamed to process._errno in v0.9.11. + + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } + + return []; + } diff --git a/node_modules/mocha/lib/suite.js b/node_modules/mocha/lib/suite.js new file mode 100644 index 00000000..869bb88d --- /dev/null +++ b/node_modules/mocha/lib/suite.js @@ -0,0 +1,296 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , debug = require('debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Suite.prototype.__proto__ = EventEmitter.prototype; + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; diff --git a/node_modules/mocha/lib/template.html b/node_modules/mocha/lib/template.html new file mode 100644 index 00000000..0590d4aa --- /dev/null +++ b/node_modules/mocha/lib/template.html @@ -0,0 +1,18 @@ + + + + Mocha + + + + + +
      + + + + + + diff --git a/node_modules/mocha/lib/test.js b/node_modules/mocha/lib/test.js new file mode 100644 index 00000000..11773e0c --- /dev/null +++ b/node_modules/mocha/lib/test.js @@ -0,0 +1,32 @@ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +Test.prototype.__proto__ = Runnable.prototype; diff --git a/node_modules/mocha/lib/utils.js b/node_modules/mocha/lib/utils.js new file mode 100644 index 00000000..37fd5d7e --- /dev/null +++ b/node_modules/mocha/lib/utils.js @@ -0,0 +1,299 @@ +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , join = path.join + , debug = require('debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#map (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.map = function(arr, fn, scope){ + var result = []; + for (var i = 0, l = arr.length; i < l; i++) + result.push(fn.call(scope, arr[i], i)); + return result; +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee|litcoffee|coffee.md)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var spaces = str.match(/^\n?( *)/)[1].length + , tabs = str.match(/^\n?(\t*)/)[1].length + , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; diff --git a/node_modules/mocha/mocha.css b/node_modules/mocha/mocha.css new file mode 100644 index 00000000..42b9798f --- /dev/null +++ b/node_modules/mocha/mocha.css @@ -0,0 +1,270 @@ +@charset "utf-8"; + +body { + margin:0; +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, +#mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, +#mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: #c09853; +} + +#mocha .test.pass.slow .duration { + background: #b94a48; +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #00d6b2; +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: #fff; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: #0b97c4; +} + +#mocha .test.pending::before { + content: '◦'; + color: #0b97c4; +} + +#mocha .test.fail { + color: #c00; +} + +#mocha .test.fail pre { + color: black; +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #c00; +} + +#mocha .test pre.error { + color: #c00; + max-height: 300px; + overflow: auto; +} + +/** + * (1): approximate for browsers not supporting calc + * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) + * ^^ seriously + */ +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: calc(100% - 42px); /*(2)*/ + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-border-radius: 3px; + -moz-box-shadow: 0 1px 3px #eee; + border-radius: 3px; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: #eee; + font-size: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition: opacity 200ms; + -moz-transition: opacity 200ms; + transition: opacity 200ms; + opacity: 0.3; + color: #888; +} + +#mocha .test:hover a.replay { + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-report.pending .test.pass, +#mocha-report.pending .test.fail { + display: none; +} +#mocha-report.pending .test.pass.pending { + display: block; +} + +#mocha-error { + color: #c00; + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + position: fixed; + top: 15px; + right: 10px; + font-size: 12px; + margin: 0; + color: #888; + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; +} + +#mocha-stats em { + color: black; +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid #eee; +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: #ddd; } +#mocha code .init { color: #2f6fad; } +#mocha code .string { color: #5890ad; } +#mocha code .keyword { color: #8a6343; } +#mocha code .number { color: #2f6fad; } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/node_modules/mocha/mocha.js b/node_modules/mocha/mocha.js new file mode 100644 index 00000000..3dcdae6c --- /dev/null +++ b/node_modules/mocha/mocha.js @@ -0,0 +1,5812 @@ +;(function(){ + +// CommonJS require() + +function require(p){ + var path = require.resolve(p) + , mod = require.modules[path]; + if (!mod) throw new Error('failed to require "' + p + '"'); + if (!mod.exports) { + mod.exports = {}; + mod.call(mod.exports, mod, mod.exports, require.relative(path)); + } + return mod.exports; + } + +require.modules = {}; + +require.resolve = function (path){ + var orig = path + , reg = path + '.js' + , index = path + '/index.js'; + return require.modules[reg] && reg + || require.modules[index] && index + || orig; + }; + +require.register = function (path, fn){ + require.modules[path] = fn; + }; + +require.relative = function (parent) { + return function(p){ + if ('.' != p.charAt(0)) return require(p); + + var path = parent.split('/') + , segs = p.split('/'); + path.pop(); + + for (var i = 0; i < segs.length; i++) { + var seg = segs[i]; + if ('..' == seg) path.pop(); + else if ('.' != seg) path.push(seg); + } + + return require(path.join('/')); + }; + }; + + +require.register("browser/debug.js", function(module, exports, require){ + +module.exports = function(type){ + return function(){ + } +}; + +}); // module: browser/debug.js + +require.register("browser/diff.js", function(module, exports, require){ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + /*jshint maxparams: 5*/ + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + var Diff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + Diff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left === right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + Diff: Diff, + + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push('Index: ' + fileName); + ret.push('==================================================================='); + ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize) + + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'); + var diff = []; + var remEOFNL = false, + addEOFNL = false; + + for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) { + if(diffstr[i][0] === '@') { + var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + diff.unshift({ + start:meh[3], + oldlength:meh[2], + oldlines:[], + newlength:meh[4], + newlines:[] + }); + } else if(diffstr[i][0] === '+') { + diff[0].newlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '-') { + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === ' ') { + diff[0].newlines.push(diffstr[i].substr(1)); + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '\\') { + if (diffstr[i-1][0] === '+') { + remEOFNL = true; + } else if(diffstr[i-1][0] === '-') { + addEOFNL = true; + } + } + } + + var str = oldStr.split('\n'); + for (var i = diff.length - 1; i >= 0; i--) { + var d = diff[i]; + for (var j = 0; j < d.oldlength; j++) { + if(str[d.start-1+j] !== d.oldlines[j]) { + return false; + } + } + Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines)); + } + + if (remEOFNL) { + while (!str[str.length-1]) { + str.pop(); + } + } else if (addEOFNL) { + str.push(''); + } + return str.join('\n'); + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes){ + var ret = [], change; + for ( var i = 0; i < changes.length; i++) { + change = changes[i]; + ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); + } + return ret; + } + }; +})(); + +if (typeof module !== 'undefined') { + module.exports = JsDiff; +} + +}); // module: browser/diff.js + +require.register("browser/events.js", function(module, exports, require){ + +/** + * Module exports. + */ + +exports.EventEmitter = EventEmitter; + +/** + * Check if `obj` is an array. + */ + +function isArray(obj) { + return '[object Array]' == {}.toString.call(obj); +} + +/** + * Event emitter constructor. + * + * @api public + */ + +function EventEmitter(){}; + +/** + * Adds a listener. + * + * @api public + */ + +EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; +}; + +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +/** + * Adds a volatile listener. + * + * @api public + */ + +EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; +}; + +/** + * Removes a listener. + * + * @api public + */ + +EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; +}; + +/** + * Removes all listeners for an event. + * + * @api public + */ + +EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; +}; + +/** + * Gets all listeners for a certain event. + * + * @api public + */ + +EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; +}; + +/** + * Emits an event. + * + * @api public + */ + +EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = [].slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; +}; +}); // module: browser/events.js + +require.register("browser/fs.js", function(module, exports, require){ + +}); // module: browser/fs.js + +require.register("browser/path.js", function(module, exports, require){ + +}); // module: browser/path.js + +require.register("browser/progress.js", function(module, exports, require){ +/** + * Expose `Progress`. + */ + +module.exports = Progress; + +/** + * Initialize a new `Progress` indicator. + */ + +function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); +} + +/** + * Set progress size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.size = function(n){ + this._size = n; + return this; +}; + +/** + * Set text to `str`. + * + * @param {String} str + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.text = function(str){ + this._text = str; + return this; +}; + +/** + * Set font size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.fontSize = function(n){ + this._fontSize = n; + return this; +}; + +/** + * Set font `family`. + * + * @param {String} family + * @return {Progress} for chaining + */ + +Progress.prototype.font = function(family){ + this._font = family; + return this; +}; + +/** + * Update percentage to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + */ + +Progress.prototype.update = function(n){ + this.percent = n; + return this; +}; + +/** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} for chaining + */ + +Progress.prototype.draw = function(ctx){ + try { + var percent = Math.min(this.percent, 100) + , size = this._size + , half = size / 2 + , x = half + , y = half + , rad = half - 1 + , fontSize = this._fontSize; + + ctx.font = fontSize + 'px ' + this._font; + + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); + + // outer circle + ctx.strokeStyle = '#9f9f9f'; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); + + // inner circle + ctx.strokeStyle = '#eee'; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); + + // text + var text = this._text || (percent | 0) + '%' + , w = ctx.measureText(text).width; + + ctx.fillText( + text + , x - w / 2 + 1 + , y + fontSize / 2 - 1); + } catch (ex) {} //don't fail if we can't render progress + return this; +}; + +}); // module: browser/progress.js + +require.register("browser/tty.js", function(module, exports, require){ + +exports.isatty = function(){ + return true; +}; + +exports.getWindowSize = function(){ + if ('innerHeight' in global) { + return [global.innerHeight, global.innerWidth]; + } else { + // In a Web Worker, the DOM Window is not available. + return [640, 480]; + } +}; + +}); // module: browser/tty.js + +require.register("context.js", function(module, exports, require){ + +/** + * Expose `Context`. + */ + +module.exports = Context; + +/** + * Initialize a new `Context`. + * + * @api private + */ + +function Context(){} + +/** + * Set or get the context `Runnable` to `runnable`. + * + * @param {Runnable} runnable + * @return {Context} + * @api private + */ + +Context.prototype.runnable = function(runnable){ + if (0 == arguments.length) return this._runnable; + this.test = this._runnable = runnable; + return this; +}; + +/** + * Set test timeout `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.timeout = function(ms){ + this.runnable().timeout(ms); + return this; +}; + +/** + * Set test slowness threshold `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.slow = function(ms){ + this.runnable().slow(ms); + return this; +}; + +/** + * Inspect the context void of `._runnable`. + * + * @return {String} + * @api private + */ + +Context.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_runnable' == key) return; + if ('test' == key) return; + return val; + }, 2); +}; + +}); // module: context.js + +require.register("hook.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Hook`. + */ + +module.exports = Hook; + +/** + * Initialize a new `Hook` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Hook(title, fn) { + Runnable.call(this, title, fn); + this.type = 'hook'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Hook.prototype = new F; +Hook.prototype.constructor = Hook; + + +/** + * Get or set the test `err`. + * + * @param {Error} err + * @return {Error} + * @api public + */ + +Hook.prototype.error = function(err){ + if (0 == arguments.length) { + var err = this._error; + this._error = null; + return err; + } + + this._error = err; +}; + +}); // module: hook.js + +require.register("interfaces/bdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils'); + +/** + * BDD-style interface: + * + * describe('Array', function(){ + * describe('#indexOf()', function(){ + * it('should return -1 when not present', function(){ + * + * }); + * + * it('should return the index when present', function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.describe = context.context = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending describe. + */ + + context.xdescribe = + context.xcontext = + context.describe.skip = function(title, fn){ + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive suite. + */ + + context.describe.only = function(title, fn){ + var suite = context.describe(title, fn); + mocha.grep(suite.fullTitle()); + return suite; + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.it = context.specify = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.it.only = function(title, fn){ + var test = context.it(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + return test; + }; + + /** + * Pending test case. + */ + + context.xit = + context.xspecify = + context.it.skip = function(title){ + context.it(title); + }; + }); +}; + +}); // module: interfaces/bdd.js + +require.register("interfaces/exports.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * TDD-style interface: + * + * exports.Array = { + * '#indexOf()': { + * 'should return -1 when the value is not present': function(){ + * + * }, + * + * 'should return the correct index when the value is present': function(){ + * + * } + * } + * }; + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('require', visit); + + function visit(obj) { + var suite; + for (var key in obj) { + if ('function' == typeof obj[key]) { + var fn = obj[key]; + switch (key) { + case 'before': + suites[0].beforeAll(fn); + break; + case 'after': + suites[0].afterAll(fn); + break; + case 'beforeEach': + suites[0].beforeEach(fn); + break; + case 'afterEach': + suites[0].afterEach(fn); + break; + default: + suites[0].addTest(new Test(key, fn)); + } + } else { + var suite = Suite.create(suites[0], key); + suites.unshift(suite); + visit(obj[key]); + suites.shift(); + } + } + } +}; + +}); // module: interfaces/exports.js + +require.register("interfaces/index.js", function(module, exports, require){ + +exports.bdd = require('./bdd'); +exports.tdd = require('./tdd'); +exports.qunit = require('./qunit'); +exports.exports = require('./exports'); + +}); // module: interfaces/index.js + +require.register("interfaces/qunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils'); + +/** + * QUnit-style interface: + * + * suite('Array'); + * + * test('#length', function(){ + * var arr = [1,2,3]; + * ok(arr.length == 3); + * }); + * + * test('#indexOf()', function(){ + * var arr = [1,2,3]; + * ok(arr.indexOf(1) == 0); + * ok(arr.indexOf(2) == 1); + * ok(arr.indexOf(3) == 2); + * }); + * + * suite('String'); + * + * test('#length', function(){ + * ok('foo'.length == 3); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title`. + */ + + context.suite = function(title){ + if (suites.length > 1) suites.shift(); + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + return suite; + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var test = new Test(title, fn); + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/qunit.js + +require.register("interfaces/tdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test') + , utils = require('../utils');; + +/** + * TDD-style interface: + * + * suite('Array', function(){ + * suite('#indexOf()', function(){ + * suiteSetup(function(){ + * + * }); + * + * test('should return -1 when not present', function(){ + * + * }); + * + * test('should return the index when present', function(){ + * + * }); + * + * suiteTeardown(function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before each test case. + */ + + context.setup = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.teardown = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Execute before the suite. + */ + + context.suiteSetup = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after the suite. + */ + + context.suiteTeardown = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.suite = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending suite. + */ + context.suite.skip = function(title, fn) { + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; + mocha.grep(new RegExp(reString)); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/tdd.js + +require.register("mocha.js", function(module, exports, require){ +/*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var path = require('browser/path') + , utils = require('./utils'); + +/** + * Expose `Mocha`. + */ + +exports = module.exports = Mocha; + +/** + * Expose internals. + */ + +exports.utils = utils; +exports.interfaces = require('./interfaces'); +exports.reporters = require('./reporters'); +exports.Runnable = require('./runnable'); +exports.Context = require('./context'); +exports.Runner = require('./runner'); +exports.Suite = require('./suite'); +exports.Hook = require('./hook'); +exports.Test = require('./test'); + +/** + * Return image `name` path. + * + * @param {String} name + * @return {String} + * @api private + */ + +function image(name) { + return __dirname + '/../images/' + name + '.png'; +} + +/** + * Setup mocha with `options`. + * + * Options: + * + * - `ui` name "bdd", "tdd", "exports" etc + * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` + * - `globals` array of accepted globals + * - `timeout` timeout in milliseconds + * - `bail` bail on the first test failure + * - `slow` milliseconds to wait before considering a test slow + * - `ignoreLeaks` ignore global leaks + * - `grep` string or regexp to filter tests with + * + * @param {Object} options + * @api public + */ + +function Mocha(options) { + options = options || {}; + this.files = []; + this.options = options; + this.grep(options.grep); + this.suite = new exports.Suite('', new exports.Context); + this.ui(options.ui); + this.bail(options.bail); + this.reporter(options.reporter); + if (null != options.timeout) this.timeout(options.timeout); + this.useColors(options.useColors) + if (options.slow) this.slow(options.slow); + + this.suite.on('pre-require', function (context) { + exports.afterEach = context.afterEach || context.teardown; + exports.after = context.after || context.suiteTeardown; + exports.beforeEach = context.beforeEach || context.setup; + exports.before = context.before || context.suiteSetup; + exports.describe = context.describe || context.suite; + exports.it = context.it || context.test; + exports.setup = context.setup || context.beforeEach; + exports.suiteSetup = context.suiteSetup || context.before; + exports.suiteTeardown = context.suiteTeardown || context.after; + exports.suite = context.suite || context.describe; + exports.teardown = context.teardown || context.afterEach; + exports.test = context.test || context.it; + }); +} + +/** + * Enable or disable bailing on the first failure. + * + * @param {Boolean} [bail] + * @api public + */ + +Mocha.prototype.bail = function(bail){ + if (0 == arguments.length) bail = true; + this.suite.bail(bail); + return this; +}; + +/** + * Add test `file`. + * + * @param {String} file + * @api public + */ + +Mocha.prototype.addFile = function(file){ + this.files.push(file); + return this; +}; + +/** + * Set reporter to `reporter`, defaults to "dot". + * + * @param {String|Function} reporter name or constructor + * @api public + */ + +Mocha.prototype.reporter = function(reporter){ + if ('function' == typeof reporter) { + this._reporter = reporter; + } else { + reporter = reporter || 'dot'; + var _reporter; + try { _reporter = require('./reporters/' + reporter); } catch (err) {}; + if (!_reporter) try { _reporter = require(reporter); } catch (err) {}; + if (!_reporter && reporter === 'teamcity') + console.warn('The Teamcity reporter was moved to a package named ' + + 'mocha-teamcity-reporter ' + + '(https://npmjs.org/package/mocha-teamcity-reporter).'); + if (!_reporter) throw new Error('invalid reporter "' + reporter + '"'); + this._reporter = _reporter; + } + return this; +}; + +/** + * Set test UI `name`, defaults to "bdd". + * + * @param {String} bdd + * @api public + */ + +Mocha.prototype.ui = function(name){ + name = name || 'bdd'; + this._ui = exports.interfaces[name]; + if (!this._ui) try { this._ui = require(name); } catch (err) {}; + if (!this._ui) throw new Error('invalid interface "' + name + '"'); + this._ui = this._ui(this.suite); + return this; +}; + +/** + * Load registered files. + * + * @api private + */ + +Mocha.prototype.loadFiles = function(fn){ + var self = this; + var suite = this.suite; + var pending = this.files.length; + this.files.forEach(function(file){ + file = path.resolve(file); + suite.emit('pre-require', global, file, self); + suite.emit('require', require(file), file, self); + suite.emit('post-require', global, file, self); + --pending || (fn && fn()); + }); +}; + +/** + * Enable growl support. + * + * @api private + */ + +Mocha.prototype._growl = function(runner, reporter) { + var notify = require('growl'); + + runner.on('end', function(){ + var stats = reporter.stats; + if (stats.failures) { + var msg = stats.failures + ' of ' + runner.total + ' tests failed'; + notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); + } else { + notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { + name: 'mocha' + , title: 'Passed' + , image: image('ok') + }); + } + }); +}; + +/** + * Add regexp to grep, if `re` is a string it is escaped. + * + * @param {RegExp|String} re + * @return {Mocha} + * @api public + */ + +Mocha.prototype.grep = function(re){ + this.options.grep = 'string' == typeof re + ? new RegExp(utils.escapeRegexp(re)) + : re; + return this; +}; + +/** + * Invert `.grep()` matches. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.invert = function(){ + this.options.invert = true; + return this; +}; + +/** + * Ignore global leaks. + * + * @param {Boolean} ignore + * @return {Mocha} + * @api public + */ + +Mocha.prototype.ignoreLeaks = function(ignore){ + this.options.ignoreLeaks = !!ignore; + return this; +}; + +/** + * Enable global leak checking. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.checkLeaks = function(){ + this.options.ignoreLeaks = false; + return this; +}; + +/** + * Enable growl support. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.growl = function(){ + this.options.growl = true; + return this; +}; + +/** + * Ignore `globals` array or string. + * + * @param {Array|String} globals + * @return {Mocha} + * @api public + */ + +Mocha.prototype.globals = function(globals){ + this.options.globals = (this.options.globals || []).concat(globals); + return this; +}; + +/** + * Emit color output. + * + * @param {Boolean} colors + * @return {Mocha} + * @api public + */ + +Mocha.prototype.useColors = function(colors){ + this.options.useColors = arguments.length && colors != undefined + ? colors + : true; + return this; +}; + +/** + * Use inline diffs rather than +/-. + * + * @param {Boolean} inlineDiffs + * @return {Mocha} + * @api public + */ + +Mocha.prototype.useInlineDiffs = function(inlineDiffs) { + this.options.useInlineDiffs = arguments.length && inlineDiffs != undefined + ? inlineDiffs + : false; + return this; +}; + +/** + * Set the timeout in milliseconds. + * + * @param {Number} timeout + * @return {Mocha} + * @api public + */ + +Mocha.prototype.timeout = function(timeout){ + this.suite.timeout(timeout); + return this; +}; + +/** + * Set slowness threshold in milliseconds. + * + * @param {Number} slow + * @return {Mocha} + * @api public + */ + +Mocha.prototype.slow = function(slow){ + this.suite.slow(slow); + return this; +}; + +/** + * Makes all tests async (accepting a callback) + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.asyncOnly = function(){ + this.options.asyncOnly = true; + return this; +}; + +/** + * Run tests and invoke `fn()` when complete. + * + * @param {Function} fn + * @return {Runner} + * @api public + */ + +Mocha.prototype.run = function(fn){ + if (this.files.length) this.loadFiles(); + var suite = this.suite; + var options = this.options; + var runner = new exports.Runner(suite); + var reporter = new this._reporter(runner); + runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.asyncOnly = options.asyncOnly; + if (options.grep) runner.grep(options.grep, options.invert); + if (options.globals) runner.globals(options.globals); + if (options.growl) this._growl(runner, reporter); + exports.reporters.Base.useColors = options.useColors; + exports.reporters.Base.inlineDiffs = options.useInlineDiffs; + return runner.run(fn); +}; + +}); // module: mocha.js + +require.register("ms.js", function(module, exports, require){ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} options + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options){ + options = options || {}; + if ('string' == typeof val) return parse(val); + return options.long ? longFormat(val) : shortFormat(val); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|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 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 's': + return n * s; + case 'ms': + return n; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function shortFormat(ms) { + if (ms >= d) return Math.round(ms / d) + 'd'; + if (ms >= h) return Math.round(ms / h) + 'h'; + if (ms >= m) return Math.round(ms / m) + 'm'; + if (ms >= s) return Math.round(ms / s) + 's'; + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function longFormat(ms) { + return plural(ms, d, 'day') + || plural(ms, h, 'hour') + || plural(ms, m, 'minute') + || plural(ms, s, 'second') + || ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) return; + if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; + return Math.ceil(ms / n) + ' ' + name + 's'; +} + +}); // module: ms.js + +require.register("reporters/base.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var tty = require('browser/tty') + , diff = require('browser/diff') + , ms = require('../ms') + , utils = require('../utils'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Check if both stdio streams are associated with a tty. + */ + +var isatty = tty.isatty(1) && tty.isatty(2); + +/** + * Expose `Base`. + */ + +exports = module.exports = Base; + +/** + * Enable coloring by default. + */ + +exports.useColors = isatty || (process.env.MOCHA_COLORS !== undefined); + +/** + * Inline diffs instead of +/- + */ + +exports.inlineDiffs = false; + +/** + * Default color map. + */ + +exports.colors = { + 'pass': 90 + , 'fail': 31 + , 'bright pass': 92 + , 'bright fail': 91 + , 'bright yellow': 93 + , 'pending': 36 + , 'suite': 0 + , 'error title': 0 + , 'error message': 31 + , 'error stack': 90 + , 'checkmark': 32 + , 'fast': 90 + , 'medium': 33 + , 'slow': 31 + , 'green': 32 + , 'light': 90 + , 'diff gutter': 90 + , 'diff added': 42 + , 'diff removed': 41 +}; + +/** + * Default symbol map. + */ + +exports.symbols = { + ok: '✓', + err: '✖', + dot: '․' +}; + +// With node.js on Windows: use symbols available in terminal default fonts +if ('win32' == process.platform) { + exports.symbols.ok = '\u221A'; + exports.symbols.err = '\u00D7'; + exports.symbols.dot = '.'; +} + +/** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @param {String} type + * @param {String} str + * @return {String} + * @api private + */ + +var color = exports.color = function(type, str) { + if (!exports.useColors) return str; + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; +}; + +/** + * Expose term window size, with some + * defaults for when stderr is not a tty. + */ + +exports.window = { + width: isatty + ? process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1] + : 75 +}; + +/** + * Expose some basic cursor interactions + * that are common among reporters. + */ + +exports.cursor = { + hide: function(){ + isatty && process.stdout.write('\u001b[?25l'); + }, + + show: function(){ + isatty && process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function(){ + isatty && process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function(){ + isatty && process.stdout.write('\u001b[0G'); + }, + + CR: function(){ + if (isatty) { + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } else { + process.stdout.write('\r'); + } + } +}; + +/** + * Outut the given `failures` as a list. + * + * @param {Array} failures + * @api public + */ + +exports.list = function(failures){ + console.error(); + failures.forEach(function(test, i){ + // format + var fmt = color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var err = test.err + , message = err.message || '' + , stack = err.stack || message + , index = stack.indexOf(message) + message.length + , msg = stack.slice(0, index) + , actual = err.actual + , expected = err.expected + , escape = true; + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + + // explicitly show diff + if (err.showDiff && sameType(actual, expected)) { + escape = false; + err.actual = actual = stringify(canonicalize(actual)); + err.expected = expected = stringify(canonicalize(expected)); + } + + // actual / expected diff + if ('string' == typeof actual && 'string' == typeof expected) { + fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); + var match = message.match(/^([^:]+): expected/); + msg = '\n ' + color('error message', match ? match[1] : msg); + + if (exports.inlineDiffs) { + msg += inlineDiff(err, escape); + } else { + msg += unifiedDiff(err, escape); + } + } + + // indent stack trace without msg + stack = stack.slice(index ? index + 1 : index) + .replace(/^/gm, ' '); + + console.error(fmt, (i + 1), test.fullTitle(), msg, stack); + }); +}; + +/** + * Initialize a new `Base` reporter. + * + * All other reporters generally + * inherit from this reporter, providing + * stats such as test duration, number + * of tests passed / failed etc. + * + * @param {Runner} runner + * @api public + */ + +function Base(runner) { + var self = this + , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } + , failures = this.failures = []; + + if (!runner) return; + this.runner = runner; + + runner.stats = stats; + + runner.on('start', function(){ + stats.start = new Date; + }); + + runner.on('suite', function(suite){ + stats.suites = stats.suites || 0; + suite.root || stats.suites++; + }); + + runner.on('test end', function(test){ + stats.tests = stats.tests || 0; + stats.tests++; + }); + + runner.on('pass', function(test){ + stats.passes = stats.passes || 0; + + var medium = test.slow() / 2; + test.speed = test.duration > test.slow() + ? 'slow' + : test.duration > medium + ? 'medium' + : 'fast'; + + stats.passes++; + }); + + runner.on('fail', function(test, err){ + stats.failures = stats.failures || 0; + stats.failures++; + test.err = err; + failures.push(test); + }); + + runner.on('end', function(){ + stats.end = new Date; + stats.duration = new Date - stats.start; + }); + + runner.on('pending', function(){ + stats.pending++; + }); +} + +/** + * Output common epilogue used by many of + * the bundled reporters. + * + * @api public + */ + +Base.prototype.epilogue = function(){ + var stats = this.stats; + var tests; + var fmt; + + console.log(); + + // passes + fmt = color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + console.log(fmt, + stats.passes || 0, + ms(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + + color('pending', ' %d pending'); + + console.log(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + console.error(fmt, + stats.failures); + + Base.list(this.failures); + console.error(); + } + + console.log(); +}; + +/** + * Pad the given `str` to `len`. + * + * @param {String} str + * @param {String} len + * @return {String} + * @api private + */ + +function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; +} + + +/** + * Returns an inline diff between 2 strings with coloured ANSI output + * + * @param {Error} Error with actual/expected + * @return {String} Diff + * @api private + */ + +function inlineDiff(err, escape) { + var msg = errorDiff(err, 'WordsWithSpace', escape); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines.map(function(str, i){ + return pad(++i, width) + ' |' + ' ' + str; + }).join('\n'); + } + + // legend + msg = '\n' + + color('diff removed', 'actual') + + ' ' + + color('diff added', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + return msg; +} + +/** + * Returns a unified diff between 2 strings + * + * @param {Error} Error with actual/expected + * @return {String} Diff + * @api private + */ + +function unifiedDiff(err, escape) { + var indent = ' '; + function cleanUp(line) { + if (escape) { + line = escapeInvisibles(line); + } + if (line[0] === '+') return indent + colorLines('diff added', line); + if (line[0] === '-') return indent + colorLines('diff removed', line); + if (line.match(/\@\@/)) return null; + if (line.match(/\\ No newline/)) return null; + else return indent + line; + } + function notBlank(line) { + return line != null; + } + msg = diff.createPatch('string', err.actual, err.expected); + var lines = msg.split('\n').splice(4); + return '\n ' + + colorLines('diff added', '+ expected') + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n'); +} + +/** + * Return a character diff for `err`. + * + * @param {Error} err + * @return {String} + * @api private + */ + +function errorDiff(err, type, escape) { + var actual = escape ? escapeInvisibles(err.actual) : err.actual; + var expected = escape ? escapeInvisibles(err.expected) : err.expected; + return diff['diff' + type](actual, expected).map(function(str){ + if (str.added) return colorLines('diff added', str.value); + if (str.removed) return colorLines('diff removed', str.value); + return str.value; + }).join(''); +} + +/** + * Returns a string with all invisible characters in plain text + * + * @param {String} line + * @return {String} + * @api private + */ +function escapeInvisibles(line) { + return line.replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); +} + +/** + * Color lines for `str`, using the color `name`. + * + * @param {String} name + * @param {String} str + * @return {String} + * @api private + */ + +function colorLines(name, str) { + return str.split('\n').map(function(str){ + return color(name, str); + }).join('\n'); +} + +/** + * Stringify `obj`. + * + * @param {Object} obj + * @return {String} + * @api private + */ + +function stringify(obj) { + if (obj instanceof RegExp) return obj.toString(); + return JSON.stringify(obj, null, 2); +} + +/** + * Return a new object that has the keys in sorted order. + * @param {Object} obj + * @return {Object} + * @api private + */ + + function canonicalize(obj, stack) { + stack = stack || []; + + if (utils.indexOf(stack, obj) !== -1) return obj; + + var canonicalizedObj; + + if ('[object Array]' == {}.toString.call(obj)) { + stack.push(obj); + canonicalizedObj = utils.map(obj, function(item) { + return canonicalize(item, stack); + }); + stack.pop(); + } else if (typeof obj === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + utils.forEach(utils.keys(obj).sort(), function(key) { + canonicalizedObj[key] = canonicalize(obj[key], stack); + }); + stack.pop(); + } else { + canonicalizedObj = obj; + } + + return canonicalizedObj; + } + +/** + * Check that a / b have the same type. + * + * @param {Object} a + * @param {Object} b + * @return {Boolean} + * @api private + */ + +function sameType(a, b) { + a = Object.prototype.toString.call(a); + b = Object.prototype.toString.call(b); + return a == b; +} + + +}); // module: reporters/base.js + +require.register("reporters/doc.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Doc`. + */ + +exports = module.exports = Doc; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Doc(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('suite', function(suite){ + if (suite.root) return; + ++indents; + console.log('%s
      ', indent()); + ++indents; + console.log('%s

      %s

      ', indent(), utils.escape(suite.title)); + console.log('%s
      ', indent()); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + console.log('%s
      ', indent()); + --indents; + console.log('%s
      ', indent()); + --indents; + }); + + runner.on('pass', function(test){ + console.log('%s
      %s
      ', indent(), utils.escape(test.title)); + var code = utils.escape(utils.clean(test.fn.toString())); + console.log('%s
      %s
      ', indent(), code); + }); +} + +}); // module: reporters/doc.js + +require.register("reporters/dot.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = Dot; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Dot(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , n = 0; + + runner.on('start', function(){ + process.stdout.write('\n '); + }); + + runner.on('pending', function(test){ + process.stdout.write(color('pending', Base.symbols.dot)); + }); + + runner.on('pass', function(test){ + if (++n % width == 0) process.stdout.write('\n '); + if ('slow' == test.speed) { + process.stdout.write(color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(color(test.speed, Base.symbols.dot)); + } + }); + + runner.on('fail', function(test, err){ + if (++n % width == 0) process.stdout.write('\n '); + process.stdout.write(color('fail', Base.symbols.dot)); + }); + + runner.on('end', function(){ + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Dot.prototype = new F; +Dot.prototype.constructor = Dot; + +}); // module: reporters/dot.js + +require.register("reporters/html-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var JSONCov = require('./json-cov') + , fs = require('browser/fs'); + +/** + * Expose `HTMLCov`. + */ + +exports = module.exports = HTMLCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTMLCov(runner) { + var jade = require('jade') + , file = __dirname + '/templates/coverage.jade' + , str = fs.readFileSync(file, 'utf8') + , fn = jade.compile(str, { filename: file }) + , self = this; + + JSONCov.call(this, runner, false); + + runner.on('end', function(){ + process.stdout.write(fn({ + cov: self.cov + , coverageClass: coverageClass + })); + }); +} + +/** + * Return coverage class for `n`. + * + * @return {String} + * @api private + */ + +function coverageClass(n) { + if (n >= 75) return 'high'; + if (n >= 50) return 'medium'; + if (n >= 25) return 'low'; + return 'terrible'; +} +}); // module: reporters/html-cov.js + +require.register("reporters/html.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , Progress = require('../browser/progress') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `HTML`. + */ + +exports = module.exports = HTML; + +/** + * Stats template. + */ + +var statsTemplate = ''; + +/** + * Initialize a new `HTML` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTML(runner, root) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , stat = fragment(statsTemplate) + , items = stat.getElementsByTagName('li') + , passes = items[1].getElementsByTagName('em')[0] + , passesLink = items[1].getElementsByTagName('a')[0] + , failures = items[2].getElementsByTagName('em')[0] + , failuresLink = items[2].getElementsByTagName('a')[0] + , duration = items[3].getElementsByTagName('em')[0] + , canvas = stat.getElementsByTagName('canvas')[0] + , report = fragment('
        ') + , stack = [report] + , progress + , ctx + + root = root || document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress; + } + + if (!root) return error('#mocha div missing, add it to your document'); + + // pass toggle + on(passesLink, 'click', function(){ + unhide(); + var name = /pass/.test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test pass'); + }); + + // failure toggle + on(failuresLink, 'click', function(){ + unhide(); + var name = /fail/.test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test fail'); + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) progress.size(40); + + runner.on('suite', function(suite){ + if (suite.root) return; + + // suite + var url = self.suiteURL(suite); + var el = fragment('
      • %s

      • ', url, escape(suite.title)); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + stack.shift(); + }); + + runner.on('fail', function(test, err){ + if ('hook' == test.type) runner.emit('test end', test); + }); + + runner.on('test end', function(test){ + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) progress.update(percent).draw(ctx); + + // update stats + var ms = new Date - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + + // test + if ('passed' == test.state) { + var url = self.testURL(test); + var el = fragment('
      • %e%ems ‣

      • ', test.speed, test.title, test.duration, url); + } else if (test.pending) { + var el = fragment('
      • %e

      • ', test.title); + } else { + var el = fragment('
      • %e ‣

      • ', test.title, encodeURIComponent(test.fullTitle())); + var str = test.err.stack || test.err.toString(); + + // FF / Opera do not add the message + if (!~str.indexOf(test.err.message)) { + str = test.err.message + '\n' + str; + } + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if ('[object Error]' == str) str = test.err.message; + + // Safari doesn't give you a stack. Let's at least provide a source line. + if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { + str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + } + + el.appendChild(fragment('
        %e
        ', str)); + } + + // toggle code + // TODO: defer + if (!test.pending) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function(){ + pre.style.display = 'none' == pre.style.display + ? 'block' + : 'none'; + }); + + var pre = fragment('
        %e
        ', utils.clean(test.fn.toString())); + el.appendChild(pre); + pre.style.display = 'none'; + } + + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) stack[0].appendChild(el); + }); +} + +/** + * Provide suite URL + * + * @param {Object} [suite] + */ + +HTML.prototype.suiteURL = function(suite){ + return '?grep=' + encodeURIComponent(suite.fullTitle()); +}; + +/** + * Provide test URL + * + * @param {Object} [test] + */ + +HTML.prototype.testURL = function(test){ + return '?grep=' + encodeURIComponent(test.fullTitle()); +}; + +/** + * Display error `msg`. + */ + +function error(msg) { + document.body.appendChild(fragment('
        %s
        ', msg)); +} + +/** + * Return a DOM fragment from `html`. + */ + +function fragment(html) { + var args = arguments + , div = document.createElement('div') + , i = 1; + + div.innerHTML = html.replace(/%([se])/g, function(_, type){ + switch (type) { + case 's': return String(args[i++]); + case 'e': return escape(args[i++]); + } + }); + + return div.firstChild; +} + +/** + * Check for suites that do not have elements + * with `classname`, and hide them. + */ + +function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (0 == els.length) suites[i].className += ' hidden'; + } +} + +/** + * Unhide .hidden suites. + */ + +function unhide() { + var els = document.getElementsByClassName('suite hidden'); + for (var i = 0; i < els.length; ++i) { + els[i].className = els[i].className.replace('suite hidden', 'suite'); + } +} + +/** + * Set `el` text to `str`. + */ + +function text(el, str) { + if (el.textContent) { + el.textContent = str; + } else { + el.innerText = str; + } +} + +/** + * Listen on `event` with callback `fn`. + */ + +function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } +} + +}); // module: reporters/html.js + +require.register("reporters/index.js", function(module, exports, require){ + +exports.Base = require('./base'); +exports.Dot = require('./dot'); +exports.Doc = require('./doc'); +exports.TAP = require('./tap'); +exports.JSON = require('./json'); +exports.HTML = require('./html'); +exports.List = require('./list'); +exports.Min = require('./min'); +exports.Spec = require('./spec'); +exports.Nyan = require('./nyan'); +exports.XUnit = require('./xunit'); +exports.Markdown = require('./markdown'); +exports.Progress = require('./progress'); +exports.Landing = require('./landing'); +exports.JSONCov = require('./json-cov'); +exports.HTMLCov = require('./html-cov'); +exports.JSONStream = require('./json-stream'); + +}); // module: reporters/index.js + +require.register("reporters/json-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `JSONCov`. + */ + +exports = module.exports = JSONCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @param {Boolean} output + * @api public + */ + +function JSONCov(runner, output) { + var self = this + , output = 1 == arguments.length ? true : output; + + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var cov = global._$jscoverage || {}; + var result = self.cov = map(cov); + result.stats = self.stats; + result.tests = tests.map(clean); + result.failures = failures.map(clean); + result.passes = passes.map(clean); + if (!output) return; + process.stdout.write(JSON.stringify(result, null, 2 )); + }); +} + +/** + * Map jscoverage data to a JSON structure + * suitable for reporting. + * + * @param {Object} cov + * @return {Object} + * @api private + */ + +function map(cov) { + var ret = { + instrumentation: 'node-jscoverage' + , sloc: 0 + , hits: 0 + , misses: 0 + , coverage: 0 + , files: [] + }; + + for (var filename in cov) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } + + ret.files.sort(function(a, b) { + return a.filename.localeCompare(b.filename); + }); + + if (ret.sloc > 0) { + ret.coverage = (ret.hits / ret.sloc) * 100; + } + + return ret; +}; + +/** + * Map jscoverage data for a single source file + * to a JSON structure suitable for reporting. + * + * @param {String} filename name of the source file + * @param {Object} data jscoverage coverage data + * @return {Object} + * @api private + */ + +function coverage(filename, data) { + var ret = { + filename: filename, + coverage: 0, + hits: 0, + misses: 0, + sloc: 0, + source: {} + }; + + data.source.forEach(function(line, num){ + num++; + + if (data[num] === 0) { + ret.misses++; + ret.sloc++; + } else if (data[num] !== undefined) { + ret.hits++; + ret.sloc++; + } + + ret.source[num] = { + source: line + , coverage: data[num] === undefined + ? '' + : data[num] + }; + }); + + ret.coverage = ret.hits / ret.sloc * 100; + + return ret; +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} + +}); // module: reporters/json-cov.js + +require.register("reporters/json-stream.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total; + + runner.on('start', function(){ + console.log(JSON.stringify(['start', { total: total }])); + }); + + runner.on('pass', function(test){ + console.log(JSON.stringify(['pass', clean(test)])); + }); + + runner.on('fail', function(test, err){ + console.log(JSON.stringify(['fail', clean(test)])); + }); + + runner.on('end', function(){ + process.stdout.write(JSON.stringify(['end', self.stats])); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json-stream.js + +require.register("reporters/json.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `JSON`. + */ + +exports = module.exports = JSONReporter; + +/** + * Initialize a new `JSON` reporter. + * + * @param {Runner} runner + * @api public + */ + +function JSONReporter(runner) { + var self = this; + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var obj = { + stats: self.stats + , tests: tests.map(clean) + , failures: failures.map(clean) + , passes: passes.map(clean) + }; + + process.stdout.write(JSON.stringify(obj, null, 2)); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json.js + +require.register("reporters/landing.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Landing`. + */ + +exports = module.exports = Landing; + +/** + * Airplane color. + */ + +Base.colors.plane = 0; + +/** + * Airplane crash color. + */ + +Base.colors['plane crash'] = 31; + +/** + * Runway color. + */ + +Base.colors.runway = 90; + +/** + * Initialize a new `Landing` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Landing(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , total = runner.total + , stream = process.stdout + , plane = color('plane', '✈') + , crashed = -1 + , n = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on('start', function(){ + stream.write('\n '); + cursor.hide(); + }); + + runner.on('test end', function(test){ + // check if the plane crashed + var col = -1 == crashed + ? width * ++n / total | 0 + : crashed; + + // show the crash + if ('failed' == test.state) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[4F\n\n'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane) + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Landing.prototype = new F; +Landing.prototype.constructor = Landing; + +}); // module: reporters/landing.js + +require.register("reporters/list.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 0; + + runner.on('start', function(){ + console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = color('checkmark', ' -') + + color('pending', ' %s'); + console.log(fmt, test.fullTitle()); + }); + + runner.on('pass', function(test){ + var fmt = color('checkmark', ' '+Base.symbols.dot) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + console.log(fmt, test.fullTitle(), test.duration); + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +List.prototype = new F; +List.prototype.constructor = List; + + +}); // module: reporters/list.js + +require.register("reporters/markdown.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Markdown`. + */ + +exports = module.exports = Markdown; + +/** + * Initialize a new `Markdown` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Markdown(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , level = 0 + , buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function indent() { + return Array(level).join(' '); + } + + function mapTOC(suite, obj) { + var ret = obj; + obj = obj[suite.title] = obj[suite.title] || { suite: suite }; + suite.suites.forEach(function(suite){ + mapTOC(suite, obj); + }); + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if ('suite' == key) continue; + if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + if (key) buf += Array(level).join(' ') + link; + buf += stringifyTOC(obj[key], level); + } + --level; + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on('suite', function(suite){ + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on('suite end', function(suite){ + --level; + }); + + runner.on('pass', function(test){ + var code = utils.clean(test.fn.toString()); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.on('end', function(){ + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); +} +}); // module: reporters/markdown.js + +require.register("reporters/min.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Min`. + */ + +exports = module.exports = Min; + +/** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @param {Runner} runner + * @api public + */ + +function Min(runner) { + Base.call(this, runner); + + runner.on('start', function(){ + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.on('end', this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Min.prototype = new F; +Min.prototype.constructor = Min; + + +}); // module: reporters/min.js + +require.register("reporters/nyan.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = NyanCat; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function NyanCat(runner) { + Base.call(this, runner); + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , rainbowColors = this.rainbowColors = self.generateColors() + , colorIndex = this.colorIndex = 0 + , numerOfLines = this.numberOfLines = 4 + , trajectories = this.trajectories = [[], [], [], []] + , nyanCatWidth = this.nyanCatWidth = 11 + , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) + , scoreboardWidth = this.scoreboardWidth = 5 + , tick = this.tick = 0 + , n = 0; + + runner.on('start', function(){ + Base.cursor.hide(); + self.draw(); + }); + + runner.on('pending', function(test){ + self.draw(); + }); + + runner.on('pass', function(test){ + self.draw(); + }); + + runner.on('fail', function(test, err){ + self.draw(); + }); + + runner.on('end', function(){ + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) write('\n'); + self.epilogue(); + }); +} + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.draw = function(){ + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; +}; + +/** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @api private + */ + +NyanCat.prototype.drawScoreboard = function(){ + var stats = this.stats; + var colors = Base.colors; + + function draw(color, n) { + write(' '); + write('\u001b[' + color + 'm' + n + '\u001b[0m'); + write('\n'); + } + + draw(colors.green, stats.passes); + draw(colors.fail, stats.failures); + draw(colors.pending, stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Append the rainbow. + * + * @api private + */ + +NyanCat.prototype.appendRainbow = function(){ + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + trajectory.push(rainbowified); + } +}; + +/** + * Draw the rainbow. + * + * @api private + */ + +NyanCat.prototype.drawRainbow = function(){ + var self = this; + + this.trajectories.forEach(function(line, index) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.drawNyanCat = function() { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var color = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(color); + write('_,------,'); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(color); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + var face; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw nyan cat face. + * + * @return {String} + * @api private + */ + +NyanCat.prototype.face = function() { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if(stats.passes) { + return '( ^ .^)'; + } else { + return '( - .-)'; + } +} + +/** + * Move cursor up `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorUp = function(n) { + write('\u001b[' + n + 'A'); +}; + +/** + * Move cursor down `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorDown = function(n) { + write('\u001b[' + n + 'B'); +}; + +/** + * Generate rainbow colors. + * + * @return {Array} + * @api private + */ + +NyanCat.prototype.generateColors = function(){ + var colors = []; + + for (var i = 0; i < (6 * 7); i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = (i * (1.0 / 6)); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; +}; + +/** + * Apply rainbow to the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +NyanCat.prototype.rainbowify = function(str){ + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; +}; + +/** + * Stdout helper. + */ + +function write(string) { + process.stdout.write(string); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +NyanCat.prototype = new F; +NyanCat.prototype.constructor = NyanCat; + + +}); // module: reporters/nyan.js + +require.register("reporters/progress.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Progress`. + */ + +exports = module.exports = Progress; + +/** + * General progress bar color. + */ + +Base.colors.progress = 90; + +/** + * Initialize a new `Progress` bar test reporter. + * + * @param {Runner} runner + * @param {Object} options + * @api public + */ + +function Progress(runner, options) { + Base.call(this, runner); + + var self = this + , options = options || {} + , stats = this.stats + , width = Base.window.width * .50 | 0 + , total = runner.total + , complete = 0 + , max = Math.max; + + // default chars + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; + + // tests started + runner.on('start', function(){ + console.log(); + cursor.hide(); + }); + + // tests complete + runner.on('test end', function(){ + complete++; + var incomplete = total - complete + , percent = complete / total + , n = width * percent | 0 + , i = width - n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Progress.prototype = new F; +Progress.prototype.constructor = Progress; + + +}); // module: reporters/progress.js + +require.register("reporters/spec.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Spec`. + */ + +exports = module.exports = Spec; + +/** + * Initialize a new `Spec` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Spec(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , indents = 0 + , n = 0; + + function indent() { + return Array(indents).join(' ') + } + + runner.on('start', function(){ + console.log(); + }); + + runner.on('suite', function(suite){ + ++indents; + console.log(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on('suite end', function(suite){ + --indents; + if (1 == indents) console.log(); + }); + + runner.on('pending', function(test){ + var fmt = indent() + color('pending', ' - %s'); + console.log(fmt, test.title); + }); + + runner.on('pass', function(test){ + if ('fast' == test.speed) { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s '); + cursor.CR(); + console.log(fmt, test.title); + } else { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s ') + + color(test.speed, '(%dms)'); + cursor.CR(); + console.log(fmt, test.title, test.duration); + } + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Spec.prototype = new F; +Spec.prototype.constructor = Spec; + + +}); // module: reporters/spec.js + +require.register("reporters/tap.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `TAP`. + */ + +exports = module.exports = TAP; + +/** + * Initialize a new `TAP` reporter. + * + * @param {Runner} runner + * @api public + */ + +function TAP(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 1 + , passes = 0 + , failures = 0; + + runner.on('start', function(){ + var total = runner.grepTotal(runner.suite); + console.log('%d..%d', 1, total); + }); + + runner.on('test end', function(){ + ++n; + }); + + runner.on('pending', function(test){ + console.log('ok %d %s # SKIP -', n, title(test)); + }); + + runner.on('pass', function(test){ + passes++; + console.log('ok %d %s', n, title(test)); + }); + + runner.on('fail', function(test, err){ + failures++; + console.log('not ok %d %s', n, title(test)); + if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + }); + + runner.on('end', function(){ + console.log('# tests ' + (passes + failures)); + console.log('# pass ' + passes); + console.log('# fail ' + failures); + }); +} + +/** + * Return a TAP-safe title of `test` + * + * @param {Object} test + * @return {String} + * @api private + */ + +function title(test) { + return test.fullTitle().replace(/#/g, ''); +} + +}); // module: reporters/tap.js + +require.register("reporters/xunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pending', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +XUnit.prototype = new F; +XUnit.prototype.constructor = XUnit; + + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: (test.duration / 1000) || 0 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} + +}); // module: reporters/xunit.js + +require.register("runnable.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runnable.prototype = new F; +Runnable.prototype.constructor = Runnable; + + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Whitelist these globals for this test run + * + * @api private + */ +Runnable.prototype.globals = function(arr){ + var self = this; + this._allowedGlobals = arr; +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; + +}); // module: runnable.js + +require.register("runner.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this._abort = false; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(extraGlobals())); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runner.prototype = new F; +Runner.prototype.constructor = Runner; + + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + this._globals = this._globals.concat(arr); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if(this.prevGlobalsLength == globals.length) return; + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures work in the following pattern: + * - If bail, then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter + * execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + if (this.suite.bail()) { + this.emit('end'); + } +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) { + self.failHook(hook, err); + + // stop executing hooks, notify callee of hook err + return fn(err); + } + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + + function hookErr(err, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + // call hookUp afterEach + self.hookUp('afterEach', function(err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) return hookErr(err2, errSuite2, true); + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + if (self._abort) return fn(); + + if (err) return hookErr(err, errSuite, true); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(err, errSuite){ + + if (err) return hookErr(err, errSuite, false); + + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite == suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } else { + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + } + + if (self._abort) return done(); + + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done(errSuite) { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(errSuite); + }); + } + + this.hook('beforeAll', function(err){ + if (err) return done(); + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Cleanly abort execution + * + * @return {Runner} for chaining + * @api public + */ +Runner.prototype.abort = function(){ + debug('aborting'); + this._abort = true; +} + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method not init at first + // it is assigned in some seconds + if (global.navigator && /^getInterface/.test(key)) return false; + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && /^\d+/.test(key)) return false; + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return false; + + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} + +/** + * Array of globals dependent on the environment. + * + * @return {Array} + * @api private + */ + + function extraGlobals() { + if (typeof(process) === 'object' && + typeof(process.version) === 'string') { + + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); + + // 'errno' was renamed to process._errno in v0.9.11. + + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } + + return []; + } + +}); // module: runner.js + +require.register("suite.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Suite.prototype = new F; +Suite.prototype.constructor = Suite; + + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; + +}); // module: suite.js + +require.register("test.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Test.prototype = new F; +Test.prototype.constructor = Test; + + +}); // module: test.js + +require.register("utils.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var fs = require('browser/fs') + , path = require('browser/path') + , join = path.join + , debug = require('browser/debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#map (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.map = function(arr, fn, scope){ + var result = []; + for (var i = 0, l = arr.length; i < l; i++) + result.push(fn.call(scope, arr[i], i)); + return result; +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee|litcoffee|coffee.md)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var spaces = str.match(/^\n?( *)/)[1].length + , tabs = str.match(/^\n?(\t*)/)[1].length + , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +}); // module: utils.js +// The global object is "self" in Web Workers. +global = (function() { return this; })(); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; + +/** + * Node shims. + * + * These are meant only to allow + * mocha.js to run untouched, not + * to allow running node code in + * the browser. + */ + +var process = {}; +process.exit = function(status){}; +process.stdout = {}; + +var uncaughtExceptionHandlers = []; + +/** + * Remove uncaughtException listener. + */ + +process.removeListener = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function() {}; + var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn); + if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); } + } +}; + +/** + * Implements uncaughtException listener. + */ + +process.on = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function(err, url, line){ + fn(new Error(err + ' (' + url + ':' + line + ')')); + return true; + }; + uncaughtExceptionHandlers.push(fn); + } +}; + +/** + * Expose mocha. + */ + +var Mocha = global.Mocha = require('mocha'), + mocha = global.mocha = new Mocha({ reporter: 'html' }); + +// The BDD UI is registered by default, but no UI will be functional in the +// browser without an explicit call to the overridden `mocha.ui` (see below). +// Ensure that this default UI does not expose its methods to the global scope. +mocha.suite.removeAllListeners('pre-require'); + +var immediateQueue = [] + , immediateTimeout; + +function timeslice() { + var immediateStart = new Date().getTime(); + while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout(timeslice, 0); + } else { + immediateTimeout = null; + } +} + +/** + * High-performance override of Runner.immediately. + */ + +Mocha.Runner.immediately = function(callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout(timeslice, 0); + } +}; + +/** + * Function to allow assertion libraries to throw errors directly into mocha. + * This is useful when running tests in a browser because window.onerror will + * only receive the 'message' attribute of the Error. + */ +mocha.throwError = function(err) { + Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) { + fn(err); + }); + throw err; +}; + +/** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ + +mocha.ui = function(ui){ + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', global, null, this); + return this; +}; + +/** + * Setup mocha with the given setting options. + */ + +mocha.setup = function(opts){ + if ('string' == typeof opts) opts = { ui: opts }; + for (var opt in opts) this[opt](opts[opt]); + return this; +}; + +/** + * Run mocha, returning the Runner. + */ + +mocha.run = function(fn){ + var options = mocha.options; + mocha.globals('location'); + + var query = Mocha.utils.parseQuery(global.location.search || ''); + if (query.grep) mocha.grep(query.grep); + if (query.invert) mocha.invert(); + + return Mocha.prototype.run.call(mocha, function(){ + // The DOM Document is not available in Web Workers. + if (global.document) { + Mocha.utils.highlightTags('code'); + } + if (fn) fn(); + }); +}; + +/** + * Expose the process shim. + */ + +Mocha.process = process; +})(); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/.bin/jade b/node_modules/mocha/node_modules/.bin/jade new file mode 120000 index 00000000..571fae73 --- /dev/null +++ b/node_modules/mocha/node_modules/.bin/jade @@ -0,0 +1 @@ +../jade/bin/jade \ No newline at end of file diff --git a/node_modules/mocha/node_modules/commander/History.md b/node_modules/mocha/node_modules/commander/History.md new file mode 100644 index 00000000..2e665828 --- /dev/null +++ b/node_modules/mocha/node_modules/commander/History.md @@ -0,0 +1,179 @@ + +2.0.0 / 2013-07-18 +================== + + * remove input methods (.prompt, .confirm, etc) + +1.3.2 / 2013-07-18 +================== + + * add support for sub-commands to co-exist with the original command + +1.3.1 / 2013-07-18 +================== + + * add quick .runningCommand hack so you can opt-out of other logic when running a sub command + +1.3.0 / 2013-07-09 +================== + + * add EACCES error handling + * fix sub-command --help + +1.2.0 / 2013-06-13 +================== + + * allow "-" hyphen as an option argument + * support for RegExp coercion + +1.1.1 / 2012-11-20 +================== + + * add more sub-command padding + * fix .usage() when args are present. Closes #106 + +1.1.0 / 2012-11-16 +================== + + * add git-style executable subcommand support. Closes #94 + +1.0.5 / 2012-10-09 +================== + + * fix `--name` clobbering. Closes #92 + * fix examples/help. Closes #89 + +1.0.4 / 2012-09-03 +================== + + * add `outputHelp()` method. + +1.0.3 / 2012-08-30 +================== + + * remove invalid .version() defaulting + +1.0.2 / 2012-08-24 +================== + + * add `--foo=bar` support [arv] + * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus] + +1.0.1 / 2012-08-03 +================== + + * fix issue #56 + * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode()) + +1.0.0 / 2012-07-05 +================== + + * add support for optional option descriptions + * add defaulting of `.version()` to package.json's version + +0.6.1 / 2012-06-01 +================== + + * Added: append (yes or no) on confirmation + * Added: allow node.js v0.7.x + +0.6.0 / 2012-04-10 +================== + + * Added `.prompt(obj, callback)` support. Closes #49 + * Added default support to .choose(). Closes #41 + * Fixed the choice example + +0.5.1 / 2011-12-20 +================== + + * Fixed `password()` for recent nodes. Closes #36 + +0.5.0 / 2011-12-04 +================== + + * Added sub-command option support [itay] + +0.4.3 / 2011-12-04 +================== + + * Fixed custom help ordering. Closes #32 + +0.4.2 / 2011-11-24 +================== + + * Added travis support + * Fixed: line-buffered input automatically trimmed. Closes #31 + +0.4.1 / 2011-11-18 +================== + + * Removed listening for "close" on --help + +0.4.0 / 2011-11-15 +================== + + * Added support for `--`. Closes #24 + +0.3.3 / 2011-11-14 +================== + + * Fixed: wait for close event when writing help info [Jerry Hamlet] + +0.3.2 / 2011-11-01 +================== + + * Fixed long flag definitions with values [felixge] + +0.3.1 / 2011-10-31 +================== + + * Changed `--version` short flag to `-V` from `-v` + * Changed `.version()` so it's configurable [felixge] + +0.3.0 / 2011-10-31 +================== + + * Added support for long flags only. Closes #18 + +0.2.1 / 2011-10-24 +================== + + * "node": ">= 0.4.x < 0.7.0". Closes #20 + +0.2.0 / 2011-09-26 +================== + + * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] + +0.1.0 / 2011-08-24 +================== + + * Added support for custom `--help` output + +0.0.5 / 2011-08-18 +================== + + * Changed: when the user enters nothing prompt for password again + * Fixed issue with passwords beginning with numbers [NuckChorris] + +0.0.4 / 2011-08-15 +================== + + * Fixed `Commander#args` + +0.0.3 / 2011-08-15 +================== + + * Added default option value support + +0.0.2 / 2011-08-15 +================== + + * Added mask support to `Command#password(str[, mask], fn)` + * Added `Command#password(str, fn)` + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/mocha/node_modules/commander/Readme.md b/node_modules/mocha/node_modules/commander/Readme.md new file mode 100644 index 00000000..d1644012 --- /dev/null +++ b/node_modules/mocha/node_modules/commander/Readme.md @@ -0,0 +1,195 @@ +# Commander.js + + The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). + + [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) + +## Installation + + $ npm install commander + +## Option parsing + + Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander'); + +program + .version('0.0.1') + .option('-p, --peppers', 'Add peppers') + .option('-P, --pineapple', 'Add pineapple') + .option('-b, --bbq', 'Add bbq sauce') + .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') + .parse(process.argv); + +console.log('you ordered a pizza with:'); +if (program.peppers) console.log(' - peppers'); +if (program.pineapple) console.log(' - pineapple'); +if (program.bbq) console.log(' - bbq'); +console.log(' - %s cheese', program.cheese); +``` + + Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +``` + $ ./examples/pizza --help + + Usage: pizza [options] + + Options: + + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineapple + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese [marble] + -h, --help output usage information + +``` + +## Coercion + +```js +function range(val) { + return val.split('..').map(Number); +} + +function list(val) { + return val.split(','); +} + +program + .version('0.0.1') + .usage('[options] ') + .option('-i, --integer ', 'An integer argument', parseInt) + .option('-f, --float ', 'A float argument', parseFloat) + .option('-r, --range ..', 'A range', range) + .option('-l, --list ', 'A list', list) + .option('-o, --optional [value]', 'An optional value') + .parse(process.argv); + +console.log(' int: %j', program.integer); +console.log(' float: %j', program.float); +console.log(' optional: %j', program.optional); +program.range = program.range || []; +console.log(' range: %j..%j', program.range[0], program.range[1]); +console.log(' list: %j', program.list); +console.log(' args: %j', program.args); +``` + +## Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviours, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('../'); + +function list(val) { + return val.split(',').map(Number); +} + +program + .version('0.0.1') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); + console.log(''); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +yielding the following help output: + +``` + +Usage: custom-help [options] + +Options: + + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + + $ custom-help --help + $ custom-help -h + +``` + +## .outputHelp() + + Output help information without exiting. + +## .help() + + Output help information and exit immediately. + +## Links + + - [API documentation](http://visionmedia.github.com/commander.js/) + - [ascii tables](https://github.com/LearnBoost/cli-table) + - [progress bars](https://github.com/visionmedia/node-progress) + - [more progress bars](https://github.com/substack/node-multimeter) + - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) + +## License + +(The MIT License) + +Copyright (c) 2011 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/mocha/node_modules/commander/index.js b/node_modules/mocha/node_modules/commander/index.js new file mode 100644 index 00000000..d5778a75 --- /dev/null +++ b/node_modules/mocha/node_modules/commander/index.js @@ -0,0 +1,847 @@ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter; +var spawn = require('child_process').spawn; +var fs = require('fs'); +var exists = fs.existsSync; +var path = require('path'); +var dirname = path.dirname; +var basename = path.basename; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command; + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = ~flags.indexOf('<'); + this.optional = ~flags.indexOf('['); + this.bool = !~flags.indexOf('-no-'); + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description || ''; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function(){ + return this.long + .replace('--', '') + .replace('no-', ''); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg){ + return arg == this.short + || arg == this.long; +}; + +/** + * Initialize a new `Command`. + * + * @param {String} name + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this._execs = []; + this._args = []; + this._name = name; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Command.prototype.__proto__ = EventEmitter.prototype; + +/** + * Add command `name`. + * + * The `.action()` callback is invoked when the + * command `name` is specified via __ARGV__, + * and the remaining arguments are applied to the + * function for access. + * + * When the `name` is "*" an un-matched command + * will be passed as the first arg, followed by + * the rest of __ARGV__ remaining. + * + * Examples: + * + * program + * .version('0.0.1') + * .option('-C, --chdir ', 'change the working directory') + * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + * .option('-T, --no-tests', 'ignore test hook') + * + * program + * .command('setup') + * .description('run remote setup commands') + * .action(function(){ + * console.log('setup'); + * }); + * + * program + * .command('exec ') + * .description('run the given remote command') + * .action(function(cmd){ + * console.log('exec "%s"', cmd); + * }); + * + * program + * .command('*') + * .description('deploy the given env') + * .action(function(env){ + * console.log('deploying "%s"', env); + * }); + * + * program.parse(process.argv); + * + * @param {String} name + * @param {String} [desc] + * @return {Command} the new command + * @api public + */ + +Command.prototype.command = function(name, desc){ + var args = name.split(/ +/); + var cmd = new Command(args.shift()); + if (desc) cmd.description(desc); + if (desc) this.executables = true; + if (desc) this._execs[cmd._name] = true; + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + if (desc) return this; + return cmd; +}; + +/** + * Add an implicit `help [cmd]` subcommand + * which invokes `--help` for the given command. + * + * @api private + */ + +Command.prototype.addImplicitHelpCommand = function() { + this.command('help [cmd]', 'display help for [cmd]'); +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args){ + if (!args.length) return; + var self = this; + args.forEach(function(arg){ + switch (arg[0]) { + case '<': + self._args.push({ required: true, name: arg.slice(1, -1) }); + break; + case '[': + self._args.push({ required: false, name: arg.slice(1, -1) }); + break; + } + }); + return this; +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function(){ + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn){ + var self = this; + this.parent.on(this._name, function(args, unknown){ + // Parse any so-far unknown options + unknown = unknown || []; + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfNecessary(self, parsed.unknown); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + // Leftover arguments need to be pushed back. Fixes issue #56 + if (parsed.args.length) args = parsed.args.concat(args); + + self._args.forEach(function(arg, i){ + if (arg.required && null == args[i]) { + self.missingArgument(arg.name); + } + }); + + // Always append ourselves to the end of the arguments, + // to make sure we match the number of arguments the user + // expects + if (self._args.length) { + args[self._args.length] = self; + } else { + args.push(self); + } + + fn.apply(this, args); + }); + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to false + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => true + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|Mixed} fn or default + * @param {Mixed} defaultValue + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue){ + var self = this + , option = new Option(flags, description) + , oname = option.name() + , name = camelcase(oname); + + // default as 3rd arg + if ('function' != typeof fn) defaultValue = fn, fn = null; + + // preassign default value only for --no-*, [optional], or + if (false == option.bool || option.optional || option.required) { + // when --no-* we make sure default is true + if (false == option.bool) defaultValue = true; + // preassign only if we have a default + if (undefined !== defaultValue) self[name] = defaultValue; + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on(oname, function(val){ + // coercion + if (null != val && fn) val = fn(val); + + // unassigned or bool + if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { + // if no value, bool true, and we have a default, then use it! + if (null == val) { + self[name] = option.bool + ? defaultValue || true + : false; + } else { + self[name] = val; + } + } else if (null !== val) { + // reassign + self[name] = val; + } + }); + + return this; +}; + +/** + * Parse `argv`, settings options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv){ + // implicit help + if (this.executables) this.addImplicitHelpCommand(); + + // store raw args + this.rawArgs = argv; + + // guess name + this._name = this._name || basename(argv[1]); + + // process argv + var parsed = this.parseOptions(this.normalize(argv.slice(2))); + var args = this.args = parsed.args; + + var result = this.parseArgs(this.args, parsed.unknown); + + // executable sub-commands + var name = result.args[0]; + if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown); + + return result; +}; + +/** + * Execute a sub-command executable. + * + * @param {Array} argv + * @param {Array} args + * @param {Array} unknown + * @api private + */ + +Command.prototype.executeSubCommand = function(argv, args, unknown) { + args = args.concat(unknown); + + if (!args.length) this.help(); + if ('help' == args[0] && 1 == args.length) this.help(); + + // --help + if ('help' == args[0]) { + args[0] = args[1]; + args[1] = '--help'; + } + + // executable + var dir = dirname(argv[1]); + var bin = basename(argv[1]) + '-' + args[0]; + + // check for ./ first + var local = path.join(dir, bin); + + // run it + args = args.slice(1); + var proc = spawn(local, args, { stdio: 'inherit', customFds: [0, 1, 2] }); + proc.on('error', function(err){ + if (err.code == "ENOENT") { + console.error('\n %s(1) does not exist, try --help\n', bin); + } else if (err.code == "EACCES") { + console.error('\n %s(1) not executable. try chmod or run with root\n', bin); + } + }); + + this.runningCommand = proc; +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * This also normalizes equal sign and splits "--abc=def" into "--abc def". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args){ + var ret = [] + , arg + , index; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { + arg.slice(1).split('').forEach(function(c){ + ret.push('-' + c); + }); + } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { + ret.push(arg.slice(0, index), arg.slice(index + 1)); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown){ + var cmds = this.commands + , len = cmds.length + , name; + + if (args.length) { + name = args[0]; + if (this.listeners(name).length) { + this.emit(args.shift(), args, unknown); + } else { + this.emit('*', args); + } + } else { + outputHelpIfNecessary(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0) { + this.unknownOption(unknown[0]); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg){ + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {Array} + * @api public + */ + +Command.prototype.parseOptions = function(argv){ + var args = [] + , len = argv.length + , literal + , option + , arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if ('--' == arg) { + literal = true; + continue; + } + + if (literal) { + args.push(arg); + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (null == arg) return this.optionMissingArgument(option); + if ('-' == arg[0] && '-' != arg) return this.optionMissingArgument(option, arg); + this.emit(option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i+1]; + if (null == arg || ('-' == arg[0] && '-' != arg)) { + arg = null; + } else { + ++i; + } + this.emit(option.name(), arg); + // bool + } else { + this.emit(option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && '-' == arg[0]) { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if (argv[i+1] && '-' != argv[i+1][0]) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name){ + console.error(); + console.error(" error: missing required argument `%s'", name); + console.error(); + process.exit(1); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {String} option + * @param {String} flag + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag){ + console.error(); + if (flag) { + console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); + } else { + console.error(" error: option `%s' argument missing", option.flags); + } + console.error(); + process.exit(1); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag){ + console.error(); + console.error(" error: unknown option `%s'", flag); + console.error(); + process.exit(1); +}; + + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * @param {String} str + * @param {String} flags + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags){ + if (0 == arguments.length) return this._version; + this._version = str; + flags = flags || '-V, --version'; + this.option(flags, 'output the version number'); + this.on('version', function(){ + console.log(str); + process.exit(0); + }); + return this; +}; + +/** + * Set the description `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str){ + if (0 == arguments.length) return this._description; + this._description = str; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str){ + var args = this._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }); + + var usage = '[options' + + (this.commands.length ? '] [command' : '') + + ']' + + (this._args.length ? ' ' + args : ''); + + if (0 == arguments.length) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function(){ + return this.options.reduce(function(max, option){ + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function(){ + var width = this.largestOptionLength(); + + // Prepend the help information + return [pad('-h, --help', width) + ' ' + 'output usage information'] + .concat(this.options.map(function(option){ + return pad(option.flags, width) + + ' ' + option.description; + })) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function(){ + if (!this.commands.length) return ''; + return [ + '' + , ' Commands:' + , '' + , this.commands.map(function(cmd){ + var args = cmd._args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }).join(' '); + + return pad(cmd._name + + (cmd.options.length + ? ' [options]' + : '') + ' ' + args, 22) + + (cmd.description() + ? ' ' + cmd.description() + : ''); + }).join('\n').replace(/^/gm, ' ') + , '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function(){ + return [ + '' + , ' Usage: ' + this._name + ' ' + this.usage() + , '' + this.commandHelp() + , ' Options:' + , '' + , '' + this.optionHelp().replace(/^/gm, ' ') + , '' + , '' + ].join('\n'); +}; + +/** + * Output help information for this command + * + * @api public + */ + +Command.prototype.outputHelp = function(){ + process.stdout.write(this.helpInformation()); + this.emit('--help'); +}; + +/** + * Output help information and exit. + * + * @api public + */ + +Command.prototype.help = function(){ + this.outputHelp(); + process.exit(); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word){ + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Output help information if necessary + * + * @param {Command} command to output help for + * @param {Array} array of options to search for -h or --help + * @api private + */ + +function outputHelpIfNecessary(cmd, options) { + options = options || []; + for (var i = 0; i < options.length; i++) { + if (options[i] == '--help' || options[i] == '-h') { + cmd.outputHelp(); + process.exit(0); + } + } +} diff --git a/node_modules/mocha/node_modules/commander/package.json b/node_modules/mocha/node_modules/commander/package.json new file mode 100644 index 00000000..e25ed273 --- /dev/null +++ b/node_modules/mocha/node_modules/commander/package.json @@ -0,0 +1,38 @@ +{ + "name": "commander", + "version": "2.0.0", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "command", + "option", + "parser", + "prompt", + "stdin" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/commander.js.git" + }, + "devDependencies": { + "should": ">= 0.0.1" + }, + "scripts": { + "test": "make test" + }, + "main": "index", + "engines": { + "node": ">= 0.6.x" + }, + "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineapple');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineapple\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .outputHelp()\n\n Output help information without exiting.\n\n## .help()\n\n Output help information and exit immediately.\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "homepage": "https://github.com/visionmedia/commander.js", + "_id": "commander@2.0.0", + "_from": "commander@2.0.0" +} diff --git a/node_modules/mocha/node_modules/debug/Readme.md b/node_modules/mocha/node_modules/debug/Readme.md new file mode 100644 index 00000000..c5a34e8b --- /dev/null +++ b/node_modules/mocha/node_modules/debug/Readme.md @@ -0,0 +1,115 @@ +# debug + + tiny node.js debugging utility modelled after node core's debugging technique. + +## Installation + +``` +$ npm install debug +``` + +## Usage + + With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', 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_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.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. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_ + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.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". + +## 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:". + +## Browser support + + Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + a('doing some work'); +}, 1200); +``` + +## License + +(The MIT License) + +Copyright (c) 2011 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/mocha/node_modules/debug/debug.js b/node_modules/mocha/node_modules/debug/debug.js new file mode 100644 index 00000000..509dc0de --- /dev/null +++ b/node_modules/mocha/node_modules/debug/debug.js @@ -0,0 +1,137 @@ + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + if (!debug.enabled(name)) return function(){}; + + return function(fmt){ + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (debug[name] || curr); + debug[name] = curr; + + fmt = name + + ' ' + + fmt + + ' +' + debug.humanize(ms); + + // This hackery is required for IE8 + // where `console.log` doesn't have 'apply' + window.console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); + } +} + +/** + * The currently active debug mode names. + */ + +debug.names = []; +debug.skips = []; + +/** + * Enables a debug mode by name. This can include modes + * separated by a colon and wildcards. + * + * @param {String} name + * @api public + */ + +debug.enable = function(name) { + try { + localStorage.debug = name; + } catch(e){} + + var split = (name || '').split(/[\s,]+/) + , len = split.length; + + for (var i = 0; i < len; i++) { + name = split[i].replace('*', '.*?'); + if (name[0] === '-') { + debug.skips.push(new RegExp('^' + name.substr(1) + '$')); + } + else { + debug.names.push(new RegExp('^' + name + '$')); + } + } +}; + +/** + * Disable debug output. + * + * @api public + */ + +debug.disable = function(){ + debug.enable(''); +}; + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +debug.humanize = function(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +}; + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +debug.enabled = function(name) { + for (var i = 0, len = debug.skips.length; i < len; i++) { + if (debug.skips[i].test(name)) { + return false; + } + } + for (var i = 0, len = debug.names.length; i < len; i++) { + if (debug.names[i].test(name)) { + return true; + } + } + return false; +}; + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +// persist + +try { + if (window.localStorage) debug.enable(localStorage.debug); +} catch(e){} diff --git a/node_modules/mocha/node_modules/debug/index.js b/node_modules/mocha/node_modules/debug/index.js new file mode 100644 index 00000000..e02c13b7 --- /dev/null +++ b/node_modules/mocha/node_modules/debug/index.js @@ -0,0 +1,5 @@ +if ('undefined' == typeof window) { + module.exports = require('./lib/debug'); +} else { + module.exports = require('./debug'); +} diff --git a/node_modules/mocha/node_modules/debug/lib/debug.js b/node_modules/mocha/node_modules/debug/lib/debug.js new file mode 100644 index 00000000..3b0a9183 --- /dev/null +++ b/node_modules/mocha/node_modules/debug/lib/debug.js @@ -0,0 +1,147 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Enabled debuggers. + */ + +var names = [] + , skips = []; + +(process.env.DEBUG || '') + .split(/[\s,]+/) + .forEach(function(name){ + name = name.replace('*', '.*?'); + if (name[0] === '-') { + skips.push(new RegExp('^' + name.substr(1) + '$')); + } else { + names.push(new RegExp('^' + name + '$')); + } + }); + +/** + * Colors. + */ + +var colors = [6, 2, 3, 4, 5, 1]; + +/** + * Previous debug() call. + */ + +var prev = {}; + +/** + * Previously assigned color. + */ + +var prevColor = 0; + +/** + * Is stdout a TTY? Colored output is disabled when `true`. + */ + +var isatty = tty.isatty(2); + +/** + * Select a color. + * + * @return {Number} + * @api private + */ + +function color() { + return colors[prevColor++ % colors.length]; +} + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +function humanize(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +} + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + function disabled(){} + disabled.enabled = false; + + var match = skips.some(function(re){ + return re.test(name); + }); + + if (match) return disabled; + + match = names.some(function(re){ + return re.test(name); + }); + + if (!match) return disabled; + var c = color(); + + function colored(fmt) { + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (prev[name] || curr); + prev[name] = curr; + + fmt = ' \u001b[9' + c + 'm' + name + ' ' + + '\u001b[3' + c + 'm\u001b[90m' + + fmt + '\u001b[3' + c + 'm' + + ' +' + humanize(ms) + '\u001b[0m'; + + console.error.apply(this, arguments); + } + + function plain(fmt) { + fmt = coerce(fmt); + + fmt = new Date().toUTCString() + + ' ' + name + ' ' + fmt; + console.error.apply(this, arguments); + } + + colored.enabled = plain.enabled = true; + + return isatty || process.env.DEBUG_COLORS + ? colored + : plain; +} + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/mocha/node_modules/debug/package.json b/node_modules/mocha/node_modules/debug/package.json new file mode 100644 index 00000000..f44874e1 --- /dev/null +++ b/node_modules/mocha/node_modules/debug/package.json @@ -0,0 +1,46 @@ +{ + "name": "debug", + "version": "0.7.4", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*" + }, + "main": "lib/debug.js", + "browser": "./debug.js", + "engines": { + "node": "*" + }, + "files": [ + "lib/debug.js", + "debug.js", + "index.js" + ], + "component": { + "scripts": { + "debug/index.js": "index.js", + "debug/debug.js": "debug.js" + } + }, + "readme": "# debug\n\n tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n 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.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n \n## Conventions\n\n 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\". \n\n## Wildcards\n\n 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=*`.\n\n 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:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "homepage": "https://github.com/visionmedia/debug", + "_id": "debug@0.7.4", + "_from": "debug@*" +} diff --git a/node_modules/mocha/node_modules/diff/README.md b/node_modules/mocha/node_modules/diff/README.md new file mode 100644 index 00000000..95bd8da2 --- /dev/null +++ b/node_modules/mocha/node_modules/diff/README.md @@ -0,0 +1,101 @@ +# jsdiff + +[![Build Status](https://secure.travis-ci.org/kpdecker/jsdiff.png)](http://travis-ci.org/kpdecker/jsdiff) + +A javascript text differencing implementation. + +Based on the algorithm proposed in +["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927). + +## Installation + + npm install diff + +or + + git clone git://github.com/kpdecker/jsdiff.git + +## API + +* JsDiff.diffChars(oldStr, newStr) + Diffs two blocks of text, comparing character by character. + + Returns a list of change objects (See below). + +* JsDiff.diffWords(oldStr, newStr) + Diffs two blocks of text, comparing word by word. + + Returns a list of change objects (See below). + +* JsDiff.diffLines(oldStr, newStr) + Diffs two blocks of text, comparing line by line. + + Returns a list of change objects (See below). + +* JsDiff.diffCss(oldStr, newStr) + Diffs two blocks of text, comparing CSS tokens. + + Returns a list of change objects (See below). + +* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) + Creates a unified diff patch. + + Parameters: + * fileName : String to be output in the filename sections of the patch + * oldStr : Original string value + * newStr : New string value + * oldHeader : Additional information to include in the old file header + * newHeader : Additional information to include in thew new file header + +* JsDiff.applyPatch(oldStr, diffStr) + Applies a unified diff patch. + + Return a string containing new version of provided data. + +* convertChangesToXML(changes) + Converts a list of changes to a serialized XML format + +### Change Objects +Many of the methods above return change objects. These objects are consist of the following fields: + +* value: Text content +* added: True if the value was inserted into the new string +* removed: True of the value was removed from the old string + +Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner. + +## [Example](http://kpdecker.github.com/jsdiff) + +## License + +Software License Agreement (BSD License) + +Copyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com + +All rights reserved. + +Redistribution and use of this software 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 Kevin Decker 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. diff --git a/node_modules/mocha/node_modules/diff/diff.js b/node_modules/mocha/node_modules/diff/diff.js new file mode 100644 index 00000000..a34c22a0 --- /dev/null +++ b/node_modules/mocha/node_modules/diff/diff.js @@ -0,0 +1,354 @@ +/* See LICENSE file for terms of use */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + /*jshint maxparams: 5*/ + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + var Diff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + Diff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString === oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left === right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new Diff(); + + var WordDiff = new Diff(true); + var WordWithSpaceDiff = new Diff(); + WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new Diff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new Diff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + Diff: Diff, + + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push('Index: ' + fileName); + ret.push('==================================================================='); + ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); + ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize) + + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize) + + ' @@'); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + applyPatch: function(oldStr, uniDiff) { + var diffstr = uniDiff.split('\n'); + var diff = []; + var remEOFNL = false, + addEOFNL = false; + + for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) { + if(diffstr[i][0] === '@') { + var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); + diff.unshift({ + start:meh[3], + oldlength:meh[2], + oldlines:[], + newlength:meh[4], + newlines:[] + }); + } else if(diffstr[i][0] === '+') { + diff[0].newlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '-') { + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === ' ') { + diff[0].newlines.push(diffstr[i].substr(1)); + diff[0].oldlines.push(diffstr[i].substr(1)); + } else if(diffstr[i][0] === '\\') { + if (diffstr[i-1][0] === '+') { + remEOFNL = true; + } else if(diffstr[i-1][0] === '-') { + addEOFNL = true; + } + } + } + + var str = oldStr.split('\n'); + for (var i = diff.length - 1; i >= 0; i--) { + var d = diff[i]; + for (var j = 0; j < d.oldlength; j++) { + if(str[d.start-1+j] !== d.oldlines[j]) { + return false; + } + } + Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines)); + } + + if (remEOFNL) { + while (!str[str.length-1]) { + str.pop(); + } + } else if (addEOFNL) { + str.push(''); + } + return str.join('\n'); + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + }, + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + convertChangesToDMP: function(changes){ + var ret = [], change; + for ( var i = 0; i < changes.length; i++) { + change = changes[i]; + ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); + } + return ret; + } + }; +})(); + +if (typeof module !== 'undefined') { + module.exports = JsDiff; +} diff --git a/node_modules/mocha/node_modules/diff/package.json b/node_modules/mocha/node_modules/diff/package.json new file mode 100644 index 00000000..867fd0ce --- /dev/null +++ b/node_modules/mocha/node_modules/diff/package.json @@ -0,0 +1,51 @@ +{ + "name": "diff", + "version": "1.0.7", + "description": "A javascript text diff implementation.", + "keywords": [ + "diff", + "javascript" + ], + "maintainers": [ + { + "name": "Kevin Decker", + "email": "kpdecker@gmail.com", + "url": "http://incaseofstairs.com" + } + ], + "bugs": { + "url": "http://github.com/kpdecker/jsdiff/issues", + "email": "kpdecker@gmail.com" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/kpdecker/jsdiff/blob/master/LICENSE" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/kpdecker/jsdiff.git" + }, + "engines": { + "node": ">=0.3.1" + }, + "main": "./diff", + "scripts": { + "test": "mocha test/*.js" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "~1.6", + "should": "~1.2" + }, + "optionalDependencies": {}, + "files": [ + "diff.js" + ], + "readme": "# jsdiff\n\n[![Build Status](https://secure.travis-ci.org/kpdecker/jsdiff.png)](http://travis-ci.org/kpdecker/jsdiff)\n\nA javascript text differencing implementation.\n\nBased on the algorithm proposed in\n[\"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927).\n\n## Installation\n\n npm install diff\n\nor\n\n git clone git://github.com/kpdecker/jsdiff.git\n\n## API\n\n* JsDiff.diffChars(oldStr, newStr)\n Diffs two blocks of text, comparing character by character.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffWords(oldStr, newStr)\n Diffs two blocks of text, comparing word by word.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffLines(oldStr, newStr)\n Diffs two blocks of text, comparing line by line.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffCss(oldStr, newStr)\n Diffs two blocks of text, comparing CSS tokens.\n\n Returns a list of change objects (See below).\n\n* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader)\n Creates a unified diff patch.\n\n Parameters:\n * fileName : String to be output in the filename sections of the patch\n * oldStr : Original string value\n * newStr : New string value\n * oldHeader : Additional information to include in the old file header\n * newHeader : Additional information to include in thew new file header\n\n* JsDiff.applyPatch(oldStr, diffStr)\n Applies a unified diff patch.\n\n Return a string containing new version of provided data.\n\n* convertChangesToXML(changes)\n Converts a list of changes to a serialized XML format\n\n### Change Objects\nMany of the methods above return change objects. These objects are consist of the following fields:\n\n* value: Text content\n* added: True if the value was inserted into the new string\n* removed: True of the value was removed from the old string\n\nNote that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.\n\n## [Example](http://kpdecker.github.com/jsdiff)\n\n## License\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n copyright notice, this list of conditions and the\n following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the\n following disclaimer in the documentation and/or other\n materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n contributors may be used to endorse or promote products\n derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/kpdecker/jsdiff", + "_id": "diff@1.0.7", + "_from": "diff@1.0.7" +} diff --git a/node_modules/mocha/node_modules/glob/.npmignore b/node_modules/mocha/node_modules/glob/.npmignore new file mode 100644 index 00000000..2af4b71c --- /dev/null +++ b/node_modules/mocha/node_modules/glob/.npmignore @@ -0,0 +1,2 @@ +.*.swp +test/a/ diff --git a/node_modules/mocha/node_modules/glob/.travis.yml b/node_modules/mocha/node_modules/glob/.travis.yml new file mode 100644 index 00000000..baa0031d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.8 diff --git a/node_modules/mocha/node_modules/glob/LICENSE b/node_modules/mocha/node_modules/glob/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/mocha/node_modules/glob/README.md b/node_modules/mocha/node_modules/glob/README.md new file mode 100644 index 00000000..cc691645 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/README.md @@ -0,0 +1,250 @@ +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +## Attention: node-glob users! + +The API has changed dramatically between 2.x and 3.x. This library is +now 100% JavaScript, and the integer flags have been replaced with an +options object. + +Also, there's an event emitter class, proper tests, and all the other +things you've come to expect from node modules. + +And best of all, no compilation! + +## Usage + +```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. +}) +``` + +## Features + +Please see the [minimatch +documentation](https://github.com/isaacs/minimatch) for more details. + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instanting 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} 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. +* `error` The error encountered. When an error is encountered, the + glob object is in an undefined state, and should be discarded. +* `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. +* `statCache` Collection of all the stat results the glob search + performed. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `1` - Path exists, and is not a directory + * `2` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` + +### 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 matched. +* `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 + +* `abort` Stop the search. + +### 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. + +* `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. It will cause + ELOOP to be triggered one level sooner in the case of cyclical + symbolic links. +* `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.) +* `sync` Perform a synchronous glob search. +* `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). +* `nocase` Perform a case-insensitive match. Note that case-insensitive + filesystems will sometimes result in glob returning results that are + case-insensitively matched anyway, since readdir and stat will not + raise an error. +* `debug` Set to enable debug logging in minimatch and glob. +* `globDebug` Set to enable debug logging in glob, but not minimatch. + +## 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. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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. + +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. + +## 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. diff --git a/node_modules/mocha/node_modules/glob/examples/g.js b/node_modules/mocha/node_modules/glob/examples/g.js new file mode 100644 index 00000000..be122df0 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/examples/g.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "test/a/**/[cg]/../[cg]" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/mocha/node_modules/glob/examples/usr-local.js b/node_modules/mocha/node_modules/glob/examples/usr-local.js new file mode 100644 index 00000000..327a425e --- /dev/null +++ b/node_modules/mocha/node_modules/glob/examples/usr-local.js @@ -0,0 +1,9 @@ +var Glob = require("../").Glob + +var pattern = "{./*/*,/*,/usr/local/*}" +console.log(pattern) + +var mg = new Glob(pattern, {mark: true}, function (er, matches) { + console.log("matches", matches) +}) +console.log("after") diff --git a/node_modules/mocha/node_modules/glob/glob.js b/node_modules/mocha/node_modules/glob/glob.js new file mode 100644 index 00000000..f0118a4f --- /dev/null +++ b/node_modules/mocha/node_modules/glob/glob.js @@ -0,0 +1,675 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern) +// 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. +// readdir(PREFIX) as ENTRIES +// If fails, END +// 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 .. $]) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $]) +// +// 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("graceful-fs") +, minimatch = require("minimatch") +, Minimatch = minimatch.Minimatch +, inherits = require("inherits") +, EE = require("events").EventEmitter +, path = require("path") +, isDir = {} +, assert = require("assert").ok + +function glob (pattern, options, cb) { + if (typeof options === "function") cb = options, options = {} + if (!options) options = {} + + if (typeof options === "number") { + deprecated() + return + } + + var g = new Glob(pattern, options, cb) + return g.sync ? g.found : g +} + +glob.fnmatch = deprecated + +function deprecated () { + throw new Error("glob's interface has changed. Please see the docs.") +} + +glob.sync = globSync +function globSync (pattern, options) { + if (typeof options === "number") { + deprecated() + return + } + + options = options || {} + options.sync = true + return glob(pattern, options) +} + + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (!(this instanceof Glob)) { + return new Glob(pattern, options, cb) + } + + if (typeof cb === "function") { + this.on("error", cb) + this.on("end", function (matches) { + cb(null, matches) + }) + } + + options = options || {} + + this.EOF = {} + this._emitQueue = [] + + this.maxDepth = options.maxDepth || 1000 + this.maxLength = options.maxLength || Infinity + this.cache = options.cache || {} + this.statCache = options.statCache || {} + + this.changedCwd = false + var cwd = process.cwd() + if (!options.hasOwnProperty("cwd")) this.cwd = cwd + else { + this.cwd = options.cwd + this.changedCwd = path.resolve(options.cwd) !== cwd + } + + this.root = options.root || path.resolve(this.cwd, "/") + this.root = path.resolve(this.root) + if (process.platform === "win32") + this.root = this.root.replace(/\\/g, "/") + + this.nomount = !!options.nomount + + if (!pattern) { + throw new Error("must provide pattern") + } + + // 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 + } + + this.strict = options.strict !== false + this.dot = !!options.dot + this.mark = !!options.mark + this.sync = !!options.sync + this.nounique = !!options.nounique + this.nonull = !!options.nonull + this.nosort = !!options.nosort + this.nocase = !!options.nocase + this.stat = !!options.stat + + this.debug = !!options.debug || !!options.globDebug + if (this.debug) + this.log = console.error + + this.silent = !!options.silent + + var mm = this.minimatch = new Minimatch(pattern, options) + this.options = mm.options + pattern = this.pattern = mm.pattern + + this.error = null + this.aborted = false + + // list of all the patterns that ** has resolved do, so + // we can avoid visiting multiple times. + this._globstars = {} + + EE.call(this) + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: 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) + + this.minimatch.set.forEach(iterator.bind(this)) + function iterator (pattern, i, set) { + this._process(pattern, 0, i, function (er) { + if (er) this.emit("error", er) + if (-- n <= 0) this._finish() + }) + } +} + +Glob.prototype.log = function () {} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + + var nou = this.nounique + , all = nou ? [] : {} + + for (var i = 0, l = this.matches.length; i < l; i ++) { + var matches = this.matches[i] + this.log("matches[%d] =", i, matches) + // do like the shell, and spit out the literal glob + if (!matches) { + if (this.nonull) { + var literal = this.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 (!this.nosort) { + all = all.sort(this.nocase ? alphasorti : alphasort) + } + + if (this.mark) { + // at *some* point we statted all of these + all = all.map(function (m) { + var sc = this.cache[m] + if (!sc) + return m + var isDir = (Array.isArray(sc) || sc === 2) + if (isDir && m.slice(-1) !== "/") { + return m + "/" + } + if (!isDir && m.slice(-1) === "/") { + return m.replace(/\/+$/, "") + } + return m + }, this) + } + + this.log("emitting end", all) + + this.EOF = this.found = all + this.emitMatch(this.EOF) +} + +function alphasorti (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return alphasort(a, b) +} + +function alphasort (a, b) { + return a > b ? 1 : a < b ? -1 : 0 +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit("abort") +} + +Glob.prototype.pause = function () { + if (this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = true + this.emit("pause") +} + +Glob.prototype.resume = function () { + if (!this.paused) return + if (this.sync) + this.emit("error", new Error("Can't pause/resume sync glob")) + this.paused = false + this.emit("resume") + this._processEmitQueue() + //process.nextTick(this.emit.bind(this, "resume")) +} + +Glob.prototype.emitMatch = function (m) { + if (!this.stat || this.statCache[m] || m === this.EOF) { + this._emitQueue.push(m) + this._processEmitQueue() + } else { + this._stat(m, function(exists, isDir) { + if (exists) { + this._emitQueue.push(m) + this._processEmitQueue() + } + }) + } +} + +Glob.prototype._processEmitQueue = function (m) { + while (!this._processingEmitQueue && + !this.paused) { + this._processingEmitQueue = true + var m = this._emitQueue.shift() + if (!m) { + this._processingEmitQueue = false + break + } + + this.log('emit!', m === this.EOF ? "end" : "match") + + this.emit(m === this.EOF ? "end" : "match", m) + this._processingEmitQueue = false + } +} + +Glob.prototype._process = function (pattern, depth, index, cb_) { + assert(this instanceof Glob) + + var cb = function cb (er, res) { + assert(this instanceof Glob) + if (this.paused) { + if (!this._processQueue) { + this._processQueue = [] + this.once("resume", function () { + var q = this._processQueue + this._processQueue = null + q.forEach(function (cb) { cb() }) + }) + } + this._processQueue.push(cb_.bind(this, er, res)) + } else { + cb_.call(this, er, res) + } + }.bind(this) + + if (this.aborted) return cb() + + if (depth > this.maxDepth) return cb() + + // 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: + prefix = pattern.join("/") + this._stat(prefix, function (exists, isDir) { + // either it's there, or it isn't. + // nothing more to do, either way. + if (exists) { + if (prefix && isAbsolute(prefix) && !this.nomount) { + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + } + } + + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][prefix] = true + this.emitMatch(prefix) + } + return 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) + prefix = prefix.join("/") + break + } + + // get the list of entries. + var read + if (prefix === null) read = "." + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) { + prefix = path.join("/", prefix) + } + read = prefix = path.resolve(prefix) + + // if (process.platform === "win32") + // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/") + + this.log('absolute: ', prefix, this.root, pattern, read) + } else { + read = prefix + } + + this.log('readdir(%j)', read, this.cwd, this.root) + + return this._readdir(read, function (er, entries) { + if (er) { + // not a directory! + // this means that, whatever else comes after this, it can never match + return cb() + } + + // globstar is special + if (pattern[n] === minimatch.GLOBSTAR) { + // test without the globstar, and with every child both below + // and replacing the globstar. + var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ] + entries.forEach(function (e) { + if (e.charAt(0) === "." && !this.dot) return + // instead of the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))) + // below the globstar + s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n))) + }, this) + + s = s.filter(function (pattern) { + var key = gsKey(pattern) + var seen = !this._globstars[key] + this._globstars[key] = true + return seen + }, this) + + if (!s.length) + return cb() + + // now asyncForEach over this + var l = s.length + , errState = null + s.forEach(function (gsPattern) { + this._process(gsPattern, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l <= 0) return cb() + }) + }, this) + + return + } + + // not a globstar + // 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 = pattern[n] + var rawGlob = pattern[n]._glob + , dotOk = this.dot || rawGlob.charAt(0) === "." + + entries = entries.filter(function (e) { + return (e.charAt(0) !== "." || dotOk) && + e.match(pattern[n]) + }) + + // If n === pattern.length - 1, then there's no need for the extra stat + // *unless* the user has specified "mark" or "stat" explicitly. + // We know that they exist, since the readdir returned them. + if (n === pattern.length - 1 && + !this.mark && + !this.stat) { + entries.forEach(function (e) { + if (prefix) { + if (prefix !== "/") e = prefix + "/" + e + else e = prefix + e + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e) + } + + if (process.platform === "win32") + e = e.replace(/\\/g, "/") + + this.matches[index] = this.matches[index] || {} + this.matches[index][e] = true + this.emitMatch(e) + }, this) + return cb.call(this) + } + + + // now test all the remaining entries as stand-ins for that part + // of the pattern. + var l = entries.length + , errState = null + if (l === 0) return cb() // no matches possible + entries.forEach(function (e) { + var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)) + this._process(p, depth + 1, index, function (er) { + if (errState) return + if (er) return cb(errState = er) + if (--l === 0) return cb.call(this) + }) + }, this) + }) + +} + +function gsKey (pattern) { + return '**' + pattern.map(function (p) { + return (p === minimatch.GLOBSTAR) ? '**' : (''+p) + }).join('/') +} + +Glob.prototype._stat = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterStat(f, abs, cb, er) + } + + this.log('stat', [this.cwd, f, '=', abs]) + + if (!this.stat && this.cache.hasOwnProperty(f)) { + var exists = this.cache[f] + , isDir = exists && (Array.isArray(exists) || exists === 2) + if (this.sync) return cb.call(this, !!exists, isDir) + return process.nextTick(cb.bind(this, !!exists, isDir)) + } + + var stat = this.statCache[abs] + if (this.sync || stat) { + var er + try { + stat = fs.statSync(abs) + } catch (e) { + er = e + } + this._afterStat(f, abs, cb, er, stat) + } else { + fs.stat(abs, this._afterStat.bind(this, f, abs, cb)) + } +} + +Glob.prototype._afterStat = function (f, abs, cb, er, stat) { + var exists + assert(this instanceof Glob) + + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) { + this.log("should be ENOTDIR, fake it") + + er = new Error("ENOTDIR, not a directory '" + abs + "'") + er.path = abs + er.code = "ENOTDIR" + stat = null + } + + var emit = !this.statCache[abs] + this.statCache[abs] = stat + + if (er || !stat) { + exists = false + } else { + exists = stat.isDirectory() ? 2 : 1 + if (emit) + this.emit('stat', f, stat) + } + this.cache[f] = this.cache[f] || exists + cb.call(this, !!exists, exists === 2) +} + +Glob.prototype._readdir = function (f, cb) { + assert(this instanceof Glob) + var abs = f + if (f.charAt(0) === "/") { + abs = path.join(this.root, f) + } else if (isAbsolute(f)) { + abs = f + } else if (this.changedCwd) { + abs = path.resolve(this.cwd, f) + } + + if (f.length > this.maxLength) { + var er = new Error("Path name too long") + er.code = "ENAMETOOLONG" + er.path = f + return this._afterReaddir(f, abs, cb, er) + } + + this.log('readdir', [this.cwd, f, abs]) + if (this.cache.hasOwnProperty(f)) { + var c = this.cache[f] + if (Array.isArray(c)) { + if (this.sync) return cb.call(this, null, c) + return process.nextTick(cb.bind(this, null, c)) + } + + if (!c || c === 1) { + // either ENOENT or ENOTDIR + var code = c ? "ENOTDIR" : "ENOENT" + , er = new Error((c ? "Not a directory" : "Not found") + ": " + f) + er.path = f + er.code = code + this.log(f, er) + if (this.sync) return cb.call(this, er) + return process.nextTick(cb.bind(this, er)) + } + + // at this point, c === 2, meaning it's a dir, but we haven't + // had to read it yet, or c === true, meaning it's *something* + // but we don't have any idea what. Need to read it, either way. + } + + if (this.sync) { + var er, entries + try { + entries = fs.readdirSync(abs) + } catch (e) { + er = e + } + return this._afterReaddir(f, abs, cb, er, entries) + } + + fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb)) +} + +Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) { + assert(this instanceof Glob) + if (entries && !er) { + this.cache[f] = entries + // if we haven't asked to stat everything for suresies, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. This also gets us one step + // further into ELOOP territory. + if (!this.mark && !this.stat) { + entries.forEach(function (e) { + if (f === "/") e = f + e + else e = f + "/" + e + this.cache[e] = true + }, this) + } + + return cb.call(this, er, entries) + } + + // now handle errors, and cache the information + if (er) switch (er.code) { + case "ENOTDIR": // totally normal. means it *does* exist. + this.cache[f] = 1 + return cb.call(this, er) + case "ENOENT": // not terribly unusual + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[f] = false + return cb.call(this, er) + default: // some unusual error. Treat as failure. + this.cache[f] = false + if (this.strict) this.emit("error", er) + if (!this.silent) console.error("glob error", er) + return cb.call(this, er) + } +} + +var isAbsolute = process.platform === "win32" ? absWin : absUnix + +function absWin (p) { + if (absUnix(p)) return true + // pull off the device/UNC bit from a windows path. + // from node's lib/path.js + var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ + , result = splitDeviceRe.exec(p) + , device = result[1] || '' + , isUnc = device && device.charAt(1) !== ':' + , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute + + return isAbsolute +} + +function absUnix (p) { + return p.charAt(0) === "/" || p === "" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md new file mode 100644 index 00000000..eb1a1093 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md @@ -0,0 +1,26 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over fs module + +graceful-fs: + +* Queues up `open` and `readdir` calls, and retries them once + something closes if there is an EMFILE error from too many file + descriptors. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 00000000..1865f92c --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,159 @@ +// Monkey-patching the fs module. +// It's ugly, but there is simply no other way to do this. +var fs = module.exports = require('fs') + +var assert = require('assert') + +// fix up some busted stuff, mostly on windows and old nodes +require('./polyfills.js') + +// The EMFILE enqueuing stuff + +var util = require('util') + +function noop () {} + +var debug = noop +var util = require('util') +if (util.debuglog) + debug = util.debuglog('gfs') +else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') + console.error(m) + } + +if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug('fds', fds) + debug(queue) + assert.equal(queue.length, 0) + }) +} + + +var originalOpen = fs.open +fs.open = open + +function open(path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + new OpenReq(path, flags, mode, cb) +} + +function OpenReq(path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb + Req.call(this) +} + +util.inherits(OpenReq, Req) + +OpenReq.prototype.process = function() { + originalOpen.call(fs, this.path, this.flags, this.mode, this.done) +} + +var fds = {} +OpenReq.prototype.done = function(er, fd) { + debug('open done', er, fd) + if (fd) + fds['fd' + fd] = this.path + Req.prototype.done.call(this, er, fd) +} + + +var originalReaddir = fs.readdir +fs.readdir = readdir + +function readdir(path, cb) { + if (typeof cb !== "function") cb = noop + new ReaddirReq(path, cb) +} + +function ReaddirReq(path, cb) { + this.path = path + this.cb = cb + Req.call(this) +} + +util.inherits(ReaddirReq, Req) + +ReaddirReq.prototype.process = function() { + originalReaddir.call(fs, this.path, this.done) +} + +ReaddirReq.prototype.done = function(er, files) { + Req.prototype.done.call(this, er, files) + onclose() +} + + +var originalClose = fs.close +fs.close = close + +function close (fd, cb) { + debug('close', fd) + if (typeof cb !== "function") cb = noop + delete fds['fd' + fd] + originalClose.call(fs, fd, function(er) { + onclose() + cb(er) + }) +} + + +var originalCloseSync = fs.closeSync +fs.closeSync = closeSync + +function closeSync (fd) { + try { + return originalCloseSync(fd) + } finally { + onclose() + } +} + + +// Req class +function Req () { + // start processing + this.done = this.done.bind(this) + this.failures = 0 + this.process() +} + +Req.prototype.done = function (er, result) { + var tryAgain = false + if (er) { + var code = er.code + var tryAgain = code === "EMFILE" + if (process.platform === "win32") + tryAgain = tryAgain || code === "OK" + } + + if (tryAgain) { + this.failures ++ + enqueue(this) + } else { + var cb = this.cb + cb(er, result) + } +} + +var queue = [] + +function enqueue(req) { + queue.push(req) + debug('enqueue %d %s', queue.length, req.constructor.name, req) +} + +function onclose() { + var req = queue.shift() + if (req) { + debug('process', req.constructor.name, req) + req.process() + } +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json new file mode 100644 index 00000000..ea5a208a --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json @@ -0,0 +1,49 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "2.0.1", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over fs module\n\ngraceful-fs:\n\n* Queues up `open` and `readdir` calls, and retries them once\n something closes if there is an EMFILE error from too many file\n descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs", + "_id": "graceful-fs@2.0.1", + "_from": "graceful-fs@~2.0.0" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js new file mode 100644 index 00000000..afc83b3f --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/polyfills.js @@ -0,0 +1,228 @@ +var fs = require('fs') +var constants = require('constants') + +var origCwd = process.cwd +var cwd = null +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} + +// (re-)implement some things that are known busted or missing. + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +function chownErOk (er) { + // if there's no getuid, or if getuid() is something other than 0, + // and the error is EINVAL or EPERM, then just ignore it. + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // When running as root, or if other types of errors are encountered, + // then it's strict. + if (!er || (!process.getuid || process.getuid() !== 0) + && (er.code === "EINVAL" || er.code === "EPERM")) return true +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} + diff --git a/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js new file mode 100644 index 00000000..104f36b0 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js @@ -0,0 +1,39 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is monkeypatched fs', function (t) { + t.equal(fs, require('fs')) + t.end() +}) + +test('open an existing file works', function (t) { + var fd = fs.openSync(__filename, 'r') + fs.closeSync(fd) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + fs.close(fd, function (er) { + if (er) throw er + t.pass('works') + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.end() + }) +}) diff --git a/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE new file mode 100644 index 00000000..dea3013d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +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/mocha/node_modules/glob/node_modules/inherits/README.md b/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md new file mode 100644 index 00000000..b1c56658 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js new file mode 100644 index 00000000..29f5e24f --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js new file mode 100644 index 00000000..c1e78a75 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json b/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json new file mode 100644 index 00000000..5bf0db56 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json @@ -0,0 +1,33 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "homepage": "https://github.com/isaacs/inherits", + "_id": "inherits@2.0.1", + "_from": "inherits@2" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js b/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js new file mode 100644 index 00000000..fc53012d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore b/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/mocha/node_modules/glob/node_modules/minimatch/README.md b/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md new file mode 100644 index 00000000..978268e2 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md @@ -0,0 +1,218 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +Eventually, it will replace the C binding in node-glob. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instanting the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +## Functions + +The top-level exported function has a `cache` property, which is an LRU +cache set to store 100 items. So, calling these methods repeatedly +with the same pattern and options will use the same Minimatch object, +saving the cost of parsing it multiple times. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself. When set, an empty list is returned if there are +no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +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.1, 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. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.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. diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js new file mode 100644 index 00000000..c633f89f --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js @@ -0,0 +1,1055 @@ +;(function (require, exports, module, platform) { + +if (module) module.exports = minimatch +else exports.minimatch = minimatch + +if (!require) { + require = function (id) { + switch (id) { + case "sigmund": return function sigmund (obj) { + return JSON.stringify(obj) + } + case "path": return { basename: function (f) { + f = f.split(/[\/\\]/) + var e = f.pop() + if (!e) e = f.pop() + return e + }} + case "lru-cache": return function LRUCache () { + // not quite an LRU, but still space-limited. + var cache = {} + var cnt = 0 + this.set = function (k, v) { + cnt ++ + if (cnt >= 100) cache = {} + cache[k] = v + } + this.get = function (k) { return cache[k] } + } + } + } +} + +minimatch.Minimatch = Minimatch + +var LRU = require("lru-cache") + , cache = minimatch.cache = new LRU({max: 100}) + , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} + , sigmund = require("sigmund") + +var path = require("path") + // any single thing other than / + // don't need to escape / when using new RegExp() + , qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" + + // characters that need to be escaped in RegExp. + , reSpecials = charSet("().*{}+?[]^$\\!") + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split("").reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + + +function minimatch (p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + return false + } + + // "" only matches "" + if (pattern.trim() === "") return p === "" + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options, cache) + } + + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + pattern = pattern.split("\\").join("/") + } + + // lru storage. + // these things aren't particularly big, but walking down the string + // and turning it into a regexp can get pretty costly. + var cacheKey = pattern + "\n" + sigmund(options) + var cached = minimatch.cache.get(cacheKey) + if (cached) return cached + minimatch.cache.set(cacheKey, this) + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function() {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return -1 === s.indexOf(false) + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + , negate = false + , options = this.options + , negateOffset = 0 + + if (options.nonegate) return + + for ( var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === "!" + ; i ++) { + negate = !negate + negateOffset ++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return new Minimatch(pattern, options).braceExpand() +} + +Minimatch.prototype.braceExpand = braceExpand +function braceExpand (pattern, options) { + options = options || this.options + pattern = typeof pattern === "undefined" + ? this.pattern : pattern + + if (typeof pattern === "undefined") { + throw new Error("undefined pattern") + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + var escaping = false + + // examples and comments refer to this crazy pattern: + // a{b,c{d,e},{f,g}h}x{y,z} + // expected: + // abxy + // abxz + // acdxy + // acdxz + // acexy + // acexz + // afhxy + // afhxz + // aghxy + // aghxz + + // everything before the first \{ is just a prefix. + // So, we pluck that off, and work with the rest, + // and then prepend it to everything we find. + if (pattern.charAt(0) !== "{") { + this.debug(pattern) + var prefix = null + for (var i = 0, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug(i, c) + if (c === "\\") { + escaping = !escaping + } else if (c === "{" && !escaping) { + prefix = pattern.substr(0, i) + break + } + } + + // actually no sets, all { were escaped. + if (prefix === null) { + this.debug("no sets") + return [pattern] + } + + var tail = braceExpand.call(this, pattern.substr(i), options) + return tail.map(function (t) { + return prefix + t + }) + } + + // now we have something like: + // {b,c{d,e},{f,g}h}x{y,z} + // walk through the set, expanding each part, until + // the set ends. then, we'll expand the suffix. + // If the set only has a single member, then'll put the {} back + + // first, handle numeric sets, since they're easier + var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) + if (numset) { + this.debug("numset", numset[1], numset[2]) + var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) + , start = +numset[1] + , end = +numset[2] + , inc = start > end ? -1 : 1 + , set = [] + for (var i = start; i != (end + inc); i += inc) { + // append all the suffixes + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + set.push(i + suf[ii]) + } + } + return set + } + + // ok, walk through the set + // We hope, somewhat optimistically, that there + // will be a } at the end. + // If the closing brace isn't found, then the pattern is + // interpreted as braceExpand("\\" + pattern) so that + // the leading \{ will be interpreted literally. + var i = 1 // skip the \{ + , depth = 1 + , set = [] + , member = "" + , sawEnd = false + , escaping = false + + function addMember () { + set.push(member) + member = "" + } + + this.debug("Entering for") + FOR: for (i = 1, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug("", i, c) + + if (escaping) { + escaping = false + member += "\\" + c + } else { + switch (c) { + case "\\": + escaping = true + continue + + case "{": + depth ++ + member += "{" + continue + + case "}": + depth -- + // if this closes the actual set, then we're done + if (depth === 0) { + addMember() + // pluck off the close-brace + i ++ + break FOR + } else { + member += c + continue + } + + case ",": + if (depth === 1) { + addMember() + } else { + member += c + } + continue + + default: + member += c + continue + } // switch + } // else + } // for + + // now we've either finished the set, and the suffix is + // pattern.substr(i), or we have *not* closed the set, + // and need to escape the leading brace + if (depth !== 0) { + this.debug("didn't close", pattern) + return braceExpand.call(this, "\\" + pattern, options) + } + + // x{y,z} -> ["xy", "xz"] + this.debug("set", set) + this.debug("suffix", pattern.substr(i)) + var suf = braceExpand.call(this, pattern.substr(i), options) + // ["b", "c{d,e}","{f,g}h"] -> + // [["b"], ["cd", "ce"], ["fh", "gh"]] + var addBraces = set.length === 1 + this.debug("set pre-expanded", set) + set = set.map(function (p) { + return braceExpand.call(this, p, options) + }, this) + this.debug("set expanded", set) + + + // [["b"], ["cd", "ce"], ["fh", "gh"]] -> + // ["b", "cd", "ce", "fh", "gh"] + set = set.reduce(function (l, r) { + return l.concat(r) + }) + + if (addBraces) { + set = set.map(function (s) { + return "{" + s + "}" + }) + } + + // now attach the suffixes. + var ret = [] + for (var i = 0, l = set.length; i < l; i ++) { + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + ret.push(set[i] + suf[ii]) + } + } + return ret +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === "**") return GLOBSTAR + if (pattern === "") return "" + + var re = "" + , hasMagic = !!options.nocase + , escaping = false + // ? => one single character + , patternListStack = [] + , plType + , stateChar + , inClass = false + , reClassStart = -1 + , classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + , patternStart = pattern.charAt(0) === "." ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" + : "(?!\\.)" + , self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case "*": + re += star + hasMagic = true + break + case "?": + re += qmark + hasMagic = true + break + default: + re += "\\"+stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for ( var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i ++ ) { + + this.debug("%s\t%s %s %j", pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += "\\" + c + escaping = false + continue + } + + SWITCH: switch (c) { + case "/": + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case "\\": + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === "!" && i === classStart + 1) c = "^" + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case "(": + if (inClass) { + re += "(" + continue + } + + if (!stateChar) { + re += "\\(" + continue + } + + plType = stateChar + patternListStack.push({ type: plType + , start: i - 1 + , reStart: re.length }) + // negation is (?:(?!js)[^/]*) + re += stateChar === "!" ? "(?:(?!" : "(?:" + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ")": + if (inClass || !patternListStack.length) { + re += "\\)" + continue + } + + clearStateChar() + hasMagic = true + re += ")" + plType = patternListStack.pop().type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case "!": + re += "[^/]*?)" + break + case "?": + case "+": + case "*": re += plType + case "@": break // the default anyway + } + continue + + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|" + escaping = false + continue + } + + clearStateChar() + re += "|" + continue + + // these are mostly the same in regexp and glob + case "[": + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += "\\" + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case "]": + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += "\\" + c + escaping = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === "^" && inClass)) { + re += "\\" + } + + re += c + + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + var cs = pattern.substr(classStart + 1) + , sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + "\\[" + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + var pl + while (pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = "\\" + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + "|" + }) + + this.debug("tail=%j\n %s", tail, tail) + var t = pl.type === "*" ? star + : pl.type === "?" ? qmark + : "\\" + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + + t + "\\(" + + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += "\\\\" + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case ".": + case "[": + case "(": addPatternStart = true + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== "" && hasMagic) re = "(?=.)" + re + + if (addPatternStart) re = patternStart + re + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [ re, hasMagic ] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? "i" : "" + , regExp = new RegExp("^" + re + "$", flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) return this.regexp = false + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + , flags = options.nocase ? "i" : "" + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === "string") ? regExpEscape(p) + : p._src + }).join("\\\/") + }).join("|") + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$" + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$" + + try { + return this.regexp = new RegExp(re, flags) + } catch (ex) { + return this.regexp = false + } +} + +minimatch.match = function (list, pattern, options) { + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === "" + + if (f === "/" && partial) return true + + var options = this.options + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + f = f.split("\\").join("/") + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, "split", f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, "set", set) + + var splitFile = path.basename(f.join("/")).split("/") + + for (var i = 0, l = set.length; i < l; i ++) { + var pattern = set[i], file = f + if (options.matchBase && pattern.length === 1) { + file = splitFile + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug("matchOne", + { "this": this + , file: file + , pattern: pattern }) + + this.debug("matchOne", file.length, pattern.length) + + for ( var fi = 0 + , pi = 0 + , fl = file.length + , pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi ++, pi ++ ) { + + this.debug("matchOne loop") + var p = pattern[pi] + , f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + , pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for ( ; fi < fl; fi ++) { + if (file[fi] === "." || file[fi] === ".." || + (!options.dot && file[fi].charAt(0) === ".")) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + WHILE: while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', + file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === "." || swallowee === ".." || + (!options.dot && swallowee.charAt(0) === ".")) { + this.debug("dot detected!", file, fr, pattern, pr) + break WHILE + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr ++ + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug("string match", p, f, hit) + } else { + hit = f.match(p) + this.debug("pattern match", p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") + return emptyFileEnd + } + + // should be unreachable. + throw new Error("wtf?") +} + + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, "$1") +} + + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") +} + +})( typeof require === "function" ? require : null, + this, + typeof module === "object" ? module : null, + typeof process === "object" ? process.platform : "win32" + ) diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS new file mode 100644 index 00000000..4a0bc503 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS @@ -0,0 +1,14 @@ +# Authors, sorted by whether or not they are me +Isaac Z. Schlueter +Brian Cottingham +Carlos Brito Lage +Jesse Dailey +Kevin O'Hara +Marco Rogers +Mark Cavage +Marko Mikulicic +Nathan Rajlich +Satheesh Natesan +Trent Mick +ashleybrener +n4kz diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE new file mode 100644 index 00000000..05a40109 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md new file mode 100644 index 00000000..03ee0f98 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md @@ -0,0 +1,97 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n) { return n * 2 } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = LRU(options) + , otherCache = LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n){return n.length}`. The default is + `function(n){return 1}`, which is fine if you want to store `n` + like-sized things. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. + +## API + +* `set(key, value)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js new file mode 100644 index 00000000..d1d13817 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -0,0 +1,252 @@ +;(function () { // closure for web browsers + +if (typeof module === 'object' && module.exports) { + module.exports = LRUCache +} else { + // just set the global for non-node platforms. + this.LRUCache = LRUCache +} + +function hOP (obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key) +} + +function naiveLength () { return 1 } + +function LRUCache (options) { + if (!(this instanceof LRUCache)) + return new LRUCache(options) + + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + this._max = options.max + // Kind of weird to have a default max of Infinity, but oh well. + if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) + this._max = Infinity + + this._lengthCalculator = options.length || naiveLength + if (typeof this._lengthCalculator !== "function") + this._lengthCalculator = naiveLength + + this._allowStale = options.stale || false + this._maxAge = options.maxAge || null + this._dispose = options.dispose + this.reset() +} + +// resize the cache when the max changes. +Object.defineProperty(LRUCache.prototype, "max", + { set : function (mL) { + if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity + this._max = mL + if (this._length > this._max) trim(this) + } + , get : function () { return this._max } + , enumerable : true + }) + +// resize the cache when the lengthCalculator changes. +Object.defineProperty(LRUCache.prototype, "lengthCalculator", + { set : function (lC) { + if (typeof lC !== "function") { + this._lengthCalculator = naiveLength + this._length = this._itemCount + for (var key in this._cache) { + this._cache[key].length = 1 + } + } else { + this._lengthCalculator = lC + this._length = 0 + for (var key in this._cache) { + this._cache[key].length = this._lengthCalculator(this._cache[key].value) + this._length += this._cache[key].length + } + } + + if (this._length > this._max) trim(this) + } + , get : function () { return this._lengthCalculator } + , enumerable : true + }) + +Object.defineProperty(LRUCache.prototype, "length", + { get : function () { return this._length } + , enumerable : true + }) + + +Object.defineProperty(LRUCache.prototype, "itemCount", + { get : function () { return this._itemCount } + , enumerable : true + }) + +LRUCache.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + var i = 0; + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + i++ + var hit = this._lruList[k] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + del(this, hit) + if (!this._allowStale) hit = undefined + } + if (hit) { + fn.call(thisp, hit.value, hit.key, this) + } + } +} + +LRUCache.prototype.keys = function () { + var keys = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + keys[i++] = hit.key + } + return keys +} + +LRUCache.prototype.values = function () { + var values = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + values[i++] = hit.value + } + return values +} + +LRUCache.prototype.reset = function () { + if (this._dispose && this._cache) { + for (var k in this._cache) { + this._dispose(k, this._cache[k].value) + } + } + + this._cache = Object.create(null) // hash of items by key + this._lruList = Object.create(null) // list of items in order of use recency + this._mru = 0 // most recently used + this._lru = 0 // least recently used + this._length = 0 // number of items in the list + this._itemCount = 0 +} + +// Provided for debugging/dev purposes only. No promises whatsoever that +// this API stays stable. +LRUCache.prototype.dump = function () { + return this._cache +} + +LRUCache.prototype.dumpLru = function () { + return this._lruList +} + +LRUCache.prototype.set = function (key, value) { + if (hOP(this._cache, key)) { + // dispose of the old one before overwriting + if (this._dispose) this._dispose(key, this._cache[key].value) + if (this._maxAge) this._cache[key].now = Date.now() + this._cache[key].value = value + this.get(key) + return true + } + + var len = this._lengthCalculator(value) + var age = this._maxAge ? Date.now() : 0 + var hit = new Entry(key, value, this._mru++, len, age) + + // oversized objects fall out of cache automatically. + if (hit.length > this._max) { + if (this._dispose) this._dispose(key, value) + return false + } + + this._length += hit.length + this._lruList[hit.lu] = this._cache[key] = hit + this._itemCount ++ + + if (this._length > this._max) trim(this) + return true +} + +LRUCache.prototype.has = function (key) { + if (!hOP(this._cache, key)) return false + var hit = this._cache[key] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + return false + } + return true +} + +LRUCache.prototype.get = function (key) { + return get(this, key, true) +} + +LRUCache.prototype.peek = function (key) { + return get(this, key, false) +} + +LRUCache.prototype.pop = function () { + var hit = this._lruList[this._lru] + del(this, hit) + return hit || null +} + +LRUCache.prototype.del = function (key) { + del(this, this._cache[key]) +} + +function get (self, key, doUse) { + var hit = self._cache[key] + if (hit) { + if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + del(self, hit) + if (!self._allowStale) hit = undefined + } else { + if (doUse) use(self, hit) + } + if (hit) hit = hit.value + } + return hit +} + +function use (self, hit) { + shiftLU(self, hit) + hit.lu = self._mru ++ + self._lruList[hit.lu] = hit +} + +function trim (self) { + while (self._lru < self._mru && self._length > self._max) + del(self, self._lruList[self._lru]) +} + +function shiftLU (self, hit) { + delete self._lruList[ hit.lu ] + while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ +} + +function del (self, hit) { + if (hit) { + if (self._dispose) self._dispose(hit.key, hit.value) + self._length -= hit.length + self._itemCount -- + delete self._cache[ hit.key ] + shiftLU(self, hit) + } +} + +// classy, since V8 prefers predictable objects. +function Entry (key, value, lu, length, now) { + this.key = key + this.value = value + this.lu = lu + this.length = length + this.now = now +} + +})() diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json new file mode 100644 index 00000000..4472725d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json @@ -0,0 +1,33 @@ +{ + "name": "lru-cache", + "description": "A cache object that deletes the least-recently-used items.", + "version": "2.5.0", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "scripts": { + "test": "tap test --gc" + }, + "main": "lib/lru-cache.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "devDependencies": { + "tap": "", + "weak": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" + }, + "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "homepage": "https://github.com/isaacs/node-lru-cache", + "_id": "lru-cache@2.5.0", + "_from": "lru-cache@2" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js new file mode 100644 index 00000000..f72697c4 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -0,0 +1,369 @@ +var test = require("tap").test + , LRU = require("../") + +test("basic", function (t) { + var cache = new LRU({max: 10}) + cache.set("key", "value") + t.equal(cache.get("key"), "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.length, 1) + t.equal(cache.max, 10) + t.end() +}) + +test("least recently set", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.get("a") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), "A") + t.end() +}) + +test("del", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.del("a") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("max", function (t) { + var cache = new LRU(3) + + // test changing the max, verify that the LRU items get dropped. + cache.max = 100 + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + + // now remove the max restriction, and try again. + cache.max = "hello" + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + // should trigger an immediate resize + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + t.end() +}) + +test("reset", function (t) { + var cache = new LRU(10) + cache.set("a", "A") + cache.set("b", "B") + cache.reset() + t.equal(cache.length, 0) + t.equal(cache.max, 10) + t.equal(cache.get("a"), undefined) + t.equal(cache.get("b"), undefined) + t.end() +}) + + +// Note: `.dump()` is a debugging tool only. No guarantees are made +// about the format/layout of the response. +test("dump", function (t) { + var cache = new LRU(10) + var d = cache.dump(); + t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") + cache.set("a", "A") + var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } + t.ok(d.a) + t.equal(d.a.key, "a") + t.equal(d.a.value, "A") + t.equal(d.a.lu, 0) + + cache.set("b", "B") + cache.get("b") + d = cache.dump() + t.ok(d.b) + t.equal(d.b.key, "b") + t.equal(d.b.value, "B") + t.equal(d.b.lu, 2) + + t.end() +}) + + +test("basic with weighed length", function (t) { + var cache = new LRU({ + max: 100, + length: function (item) { return item.size } + }) + cache.set("key", {val: "value", size: 50}) + t.equal(cache.get("key").val, "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.lengthCalculator(cache.get("key")), 50) + t.equal(cache.length, 50) + t.equal(cache.max, 100) + t.end() +}) + + +test("weighed length item too large", function (t) { + var cache = new LRU({ + max: 10, + length: function (item) { return item.size } + }) + t.equal(cache.max, 10) + + // should fall out immediately + cache.set("key", {val: "value", size: 50}) + + t.equal(cache.length, 0) + t.equal(cache.get("key"), undefined) + t.end() +}) + +test("least recently set with weighed length", function (t) { + var cache = new LRU({ + max:8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.set("d", "DDDD") + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("c"), "CCC") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten with weighed length", function (t) { + var cache = new LRU({ + max: 8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.get("a") + cache.get("b") + cache.set("d", "DDDD") + t.equal(cache.get("c"), undefined) + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("b"), "BB") + t.equal(cache.get("a"), "A") + t.end() +}) + +test("set returns proper booleans", function(t) { + var cache = new LRU({ + max: 5, + length: function (item) { return item.length } + }) + + t.equal(cache.set("a", "A"), true) + + // should return false for max exceeded + t.equal(cache.set("b", "donuts"), false) + + t.equal(cache.set("b", "B"), true) + t.equal(cache.set("c", "CCCC"), true) + t.end() +}) + +test("drop the old items", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A") + + setTimeout(function () { + cache.set("b", "b") + t.equal(cache.get("a"), "A") + }, 25) + + setTimeout(function () { + cache.set("c", "C") + // timed out + t.notOk(cache.get("a")) + }, 60) + + setTimeout(function () { + t.notOk(cache.get("b")) + t.equal(cache.get("c"), "C") + }, 90) + + setTimeout(function () { + t.notOk(cache.get("c")) + t.end() + }, 155) +}) + +test("disposal function", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + dispose: function (k, n) { + disposed = n + } + }) + + cache.set(1, 1) + cache.set(2, 2) + t.equal(disposed, 1) + cache.set(3, 3) + t.equal(disposed, 2) + cache.reset() + t.equal(disposed, 3) + t.end() +}) + +test("disposal function on too big of item", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + length: function (k) { + return k.length + }, + dispose: function (k, n) { + disposed = n + } + }) + var obj = [ 1, 2 ] + + t.equal(disposed, false) + cache.set("obj", obj) + t.equal(disposed, obj) + t.end() +}) + +test("has()", function(t) { + var cache = new LRU({ + max: 1, + maxAge: 10 + }) + + cache.set('foo', 'bar') + t.equal(cache.has('foo'), true) + cache.set('blu', 'baz') + t.equal(cache.has('foo'), false) + t.equal(cache.has('blu'), true) + setTimeout(function() { + t.equal(cache.has('blu'), false) + t.end() + }, 15) +}) + +test("stale", function(t) { + var cache = new LRU({ + maxAge: 10, + stale: true + }) + + cache.set('foo', 'bar') + t.equal(cache.get('foo'), 'bar') + t.equal(cache.has('foo'), true) + setTimeout(function() { + t.equal(cache.has('foo'), false) + t.equal(cache.get('foo'), 'bar') + t.equal(cache.get('foo'), undefined) + t.end() + }, 15) +}) + +test("lru update via set", function(t) { + var cache = LRU({ max: 2 }); + + cache.set('foo', 1); + cache.set('bar', 2); + cache.del('bar'); + cache.set('baz', 3); + cache.set('qux', 4); + + t.equal(cache.get('foo'), undefined) + t.equal(cache.get('bar'), undefined) + t.equal(cache.get('baz'), 3) + t.equal(cache.get('qux'), 4) + t.end() +}) + +test("least recently set w/ peek", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + t.equal(cache.peek("a"), "A") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("pop the least used item", function (t) { + var cache = new LRU(3) + , last + + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + + t.equal(cache.length, 3) + t.equal(cache.max, 3) + + // Ensure we pop a, c, b + cache.get("b", "B") + + last = cache.pop() + t.equal(last.key, "a") + t.equal(last.value, "A") + t.equal(cache.length, 2) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "c") + t.equal(last.value, "C") + t.equal(cache.length, 1) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "b") + t.equal(last.value, "B") + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last, null) + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js new file mode 100644 index 00000000..eefb80d9 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -0,0 +1,52 @@ +var test = require('tap').test +var LRU = require('../') + +test('forEach', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 9 + l.forEach(function (val, key, cache) { + t.equal(cache, l) + t.equal(key, i.toString()) + t.equal(val, i.toString(2)) + i -= 1 + }) + + // get in order of most recently used + l.get(6) + l.get(8) + + var order = [ 8, 6, 9, 7, 5 ] + var i = 0 + + l.forEach(function (val, key, cache) { + var j = order[i ++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + + t.end() +}) + +test('keys() and values()', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + t.similar(l.keys(), ['9', '8', '7', '6', '5']) + t.similar(l.values(), ['1001', '1000', '111', '110', '101']) + + // get in order of most recently used + l.get(6) + l.get(8) + + t.similar(l.keys(), ['8', '6', '9', '7', '5']) + t.similar(l.values(), ['1000', '110', '1001', '111', '101']) + + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js new file mode 100644 index 00000000..7af45b02 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node --expose_gc + +var weak = require('weak'); +var test = require('tap').test +var LRU = require('../') +var l = new LRU({ max: 10 }) +var refs = 0 +function X() { + refs ++ + weak(this, deref) +} + +function deref() { + refs -- +} + +test('no leaks', function (t) { + // fill up the cache + for (var i = 0; i < 100; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var start = process.memoryUsage() + + // capture the memory + var startRefs = refs + + // do it again, but more + for (var i = 0; i < 10000; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var end = process.memoryUsage() + t.equal(refs, startRefs, 'no leaky refs') + + console.error('start: %j\n' + + 'end: %j', start, end); + t.pass(); + t.end(); +}) diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE new file mode 100644 index 00000000..0c44ae71 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md new file mode 100644 index 00000000..7e365129 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md @@ -0,0 +1,53 @@ +# sigmund + +Quick and dirty signatures for Objects. + +This is like a much faster `deepEquals` comparison, which returns a +string key suitable for caches and the like. + +## Usage + +```javascript +function doSomething (someObj) { + var key = sigmund(someObj, maxDepth) // max depth defaults to 10 + var cached = cache.get(key) + if (cached) return cached) + + var result = expensiveCalculation(someObj) + cache.set(key, result) + return result +} +``` + +The resulting key will be as unique and reproducible as calling +`JSON.stringify` or `util.inspect` on the object, but is much faster. +In order to achieve this speed, some differences are glossed over. +For example, the object `{0:'foo'}` will be treated identically to the +array `['foo']`. + +Also, just as there is no way to summon the soul from the scribblings +of a cocain-addled psychoanalyst, there is no way to revive the object +from the signature string that sigmund gives you. In fact, it's +barely even readable. + +As with `sys.inspect` and `JSON.stringify`, larger objects will +produce larger signature strings. + +Because sigmund is a bit less strict than the more thorough +alternatives, the strings will be shorter, and also there is a +slightly higher chance for collisions. For example, these objects +have the same signature: + + var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} + var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +Like a good Freudian, sigmund is most effective when you already have +some understanding of what you're looking for. It can help you help +yourself, but you must be willing to do some work as well. + +Cycles are handled, and cyclical objects are silently omitted (though +the key is included in the signature output.) + +The second argument is the maximum depth, which defaults to 10, +because that is the maximum object traversal depth covered by most +insurance carriers. diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js new file mode 100644 index 00000000..5acfd6d9 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js @@ -0,0 +1,283 @@ +// different ways to id objects +// use a req/res pair, since it's crazy deep and cyclical + +// sparseFE10 and sigmund are usually pretty close, which is to be expected, +// since they are essentially the same algorithm, except that sigmund handles +// regular expression objects properly. + + +var http = require('http') +var util = require('util') +var sigmund = require('./sigmund.js') +var sreq, sres, creq, cres, test + +http.createServer(function (q, s) { + sreq = q + sres = s + sres.end('ok') + this.close(function () { setTimeout(function () { + start() + }, 200) }) +}).listen(1337, function () { + creq = http.get({ port: 1337 }) + creq.on('response', function (s) { cres = s }) +}) + +function start () { + test = [sreq, sres, creq, cres] + // test = sreq + // sreq.sres = sres + // sreq.creq = creq + // sreq.cres = cres + + for (var i in exports.compare) { + console.log(i) + var hash = exports.compare[i]() + console.log(hash) + console.log(hash.length) + console.log('') + } + + require('bench').runMain() +} + +function customWs (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return customWs(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + customWs(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function custom (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return '' + obj + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return custom(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + custom(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function sparseFE2 (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ':' + ch(v[k], depth + 1) + }) + soFar += '}' + } + ch(obj, 0) + return soFar +} + +function sparseFE (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ch(v[k], depth + 1) + }) + } + ch(obj, 0) + return soFar +} + +function sparse (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ch(v[k], depth + 1) + } + } + ch(obj, 0) + return soFar +} + +function noCommas (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + + +function flatten (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + soFar += ',' + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + +exports.compare = +{ + // 'custom 2': function () { + // return custom(test, 2, 0) + // }, + // 'customWs 2': function () { + // return customWs(test, 2, 0) + // }, + 'JSON.stringify (guarded)': function () { + var seen = [] + return JSON.stringify(test, function (k, v) { + if (typeof v !== 'object' || !v) return v + if (seen.indexOf(v) !== -1) return undefined + seen.push(v) + return v + }) + }, + + 'flatten 10': function () { + return flatten(test, 10) + }, + + // 'flattenFE 10': function () { + // return flattenFE(test, 10) + // }, + + 'noCommas 10': function () { + return noCommas(test, 10) + }, + + 'sparse 10': function () { + return sparse(test, 10) + }, + + 'sparseFE 10': function () { + return sparseFE(test, 10) + }, + + 'sparseFE2 10': function () { + return sparseFE2(test, 10) + }, + + sigmund: function() { + return sigmund(test, 10) + }, + + + // 'util.inspect 1': function () { + // return util.inspect(test, false, 1, false) + // }, + // 'util.inspect undefined': function () { + // util.inspect(test) + // }, + // 'util.inspect 2': function () { + // util.inspect(test, false, 2, false) + // }, + // 'util.inspect 3': function () { + // util.inspect(test, false, 3, false) + // }, + // 'util.inspect 4': function () { + // util.inspect(test, false, 4, false) + // }, + // 'util.inspect Infinity': function () { + // util.inspect(test, false, Infinity, false) + // } +} + +/** results +**/ diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json new file mode 100644 index 00000000..cb7e2bd4 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json @@ -0,0 +1,42 @@ +{ + "name": "sigmund", + "version": "1.0.0", + "description": "Quick and dirty signatures for Objects.", + "main": "sigmund.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.3.0" + }, + "scripts": { + "test": "tap test/*.js", + "bench": "node bench.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/sigmund" + }, + "keywords": [ + "object", + "signature", + "key", + "data", + "psychoanalysis" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "BSD", + "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/sigmund/issues" + }, + "homepage": "https://github.com/isaacs/sigmund", + "_id": "sigmund@1.0.0", + "_from": "sigmund@~1.0.0" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js new file mode 100644 index 00000000..82c7ab8c --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js @@ -0,0 +1,39 @@ +module.exports = sigmund +function sigmund (subject, maxSessions) { + maxSessions = maxSessions || 10; + var notes = []; + var analysis = ''; + var RE = RegExp; + + function psychoAnalyze (subject, session) { + if (session > maxSessions) return; + + if (typeof subject === 'function' || + typeof subject === 'undefined') { + return; + } + + if (typeof subject !== 'object' || !subject || + (subject instanceof RE)) { + analysis += subject; + return; + } + + if (notes.indexOf(subject) !== -1 || session === maxSessions) return; + + notes.push(subject); + analysis += '{'; + Object.keys(subject).forEach(function (issue, _, __) { + // pseudo-private values. skip those. + if (issue.charAt(0) === '_') return; + var to = typeof subject[issue]; + if (to === 'function' || to === 'undefined') return; + analysis += issue; + psychoAnalyze(subject[issue], session + 1); + }); + } + psychoAnalyze(subject, 0); + return analysis; +} + +// vim: set softtabstop=4 shiftwidth=4: diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js new file mode 100644 index 00000000..50c53a13 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js @@ -0,0 +1,24 @@ +var test = require('tap').test +var sigmund = require('../sigmund.js') + + +// occasionally there are duplicates +// that's an acceptable edge-case. JSON.stringify and util.inspect +// have some collision potential as well, though less, and collision +// detection is expensive. +var hash = '{abc/def/g{0h1i2{jkl' +var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} +var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +var obj3 = JSON.parse(JSON.stringify(obj1)) +obj3.c = /def/ +obj3.g[2].cycle = obj3 +var cycleHash = '{abc/def/g{0h1i2{jklcycle' + +test('basic', function (t) { + t.equal(sigmund(obj1), hash) + t.equal(sigmund(obj2), hash) + t.equal(sigmund(obj3), cycleHash) + t.end() +}) + diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json new file mode 100644 index 00000000..f8f545aa --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "0.2.14", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "devDependencies": { + "tap": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" + }, + "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself. When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "homepage": "https://github.com/isaacs/minimatch", + "_id": "minimatch@0.2.14", + "_from": "minimatch@~0.2.11" +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js new file mode 100644 index 00000000..ae7ac73c --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js @@ -0,0 +1,399 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + + +var patterns = + [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + // https://github.com/isaacs/minimatch/issues/5 + , function () { + files = [ 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' + , 'a/b/.x' + , 'a/b/.x/' + , 'a/.x/b' + , '.x' + , '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b/.x/c' + , '.x/.x' ] + } + , ["**/.x/**", [ '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b' + , 'a/b/.x/' + , 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' ] ] + + ] + +var regexps = + [ '/^(?:(?=.)a[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:\\*)$/', + '/^(?:(?=.)\\*[^/]*?)$/', + '/^(?:\\*\\*)$/', + '/^(?:(?=.)b[^/]*?\\/)$/', + '/^(?:(?=.)c[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', + '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', + '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', + '/^(?:(?=.)a[^/]*?[^c])$/', + '/^(?:(?=.)a[X-]b)$/', + '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', + '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[^/]c)$/', + '/^(?:a\\*c)$/', + 'false', + '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', + '/^(?:man\\/man1\\/bash\\.1)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[-abc])$/', + '/^(?:(?!\\.)(?=.)[abc-])$/', + '/^(?:\\\\)$/', + '/^(?:(?!\\.)(?=.)[\\\\])$/', + '/^(?:(?!\\.)(?=.)[\\[])$/', + '/^(?:\\[)$/', + '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[\\]])$/', + '/^(?:(?!\\.)(?=.)[\\]-])$/', + '/^(?:(?!\\.)(?=.)[a-z])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:\\[\\])$/', + '/^(?:\\[abc)$/', + '/^(?:(?=.)XYZ)$/i', + '/^(?:(?=.)ab[^/]*?)$/i', + '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', + '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', + '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', + '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', + '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', + '/^(?:(?=.)a[^/]b)$/', + '/^(?:(?=.)#[^/]*?)$/', + '/^(?!^(?:(?=.)a[^/]*?)$).*$/', + '/^(?:(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)a[^/]*?)$/', + '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] +var re = 0; + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + patterns.forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var m = new mm.Minimatch(pattern, options) + var r = m.makeRe() + var expectRe = regexps[re++] + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + + t.equal(tapOpts.re, expectRe, tapOpts) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js new file mode 100644 index 00000000..7ee278a2 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js @@ -0,0 +1,33 @@ +var tap = require("tap") + , minimatch = require("../") + +tap.test("brace expansion", function (t) { + // [ pattern, [expanded] ] + ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" + , [ "abxy" + , "abxz" + , "acdxy" + , "acdxz" + , "acexy" + , "acexz" + , "afhxy" + , "afhxz" + , "aghxy" + , "aghxz" ] ] + , [ "a{1..5}b" + , [ "a1b" + , "a2b" + , "a3b" + , "a4b" + , "a5b" ] ] + , [ "a{b}c", ["a{b}c"] ] + ].forEach(function (tc) { + var p = tc[0] + , expect = tc[1] + t.equivalent(minimatch.braceExpand(p), expect, p) + }) + console.error("ending") + t.end() +}) + + diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js new file mode 100644 index 00000000..0fec4b0f --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js @@ -0,0 +1,14 @@ +var Minimatch = require("../minimatch.js").Minimatch +var tap = require("tap") +tap.test("cache test", function (t) { + var mm1 = new Minimatch("a?b") + var mm2 = new Minimatch("a?b") + t.equal(mm1, mm2, "should get the same object") + // the lru should drop it after 100 entries + for (var i = 0; i < 100; i ++) { + new Minimatch("a"+i) + } + mm2 = new Minimatch("a?b") + t.notEqual(mm1, mm2, "cache should have dropped") + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js new file mode 100644 index 00000000..25f1f601 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js @@ -0,0 +1,274 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + ; [ "http://www.bashcookbook.com/bashinfo" + + "/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + ].forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var Class = mm.defaults(options).Minimatch + var m = new Class(pattern, {}) + var r = m.makeRe() + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js new file mode 100644 index 00000000..6676e262 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js @@ -0,0 +1,8 @@ +var test = require('tap').test +var minimatch = require('../') + +test('extglob ending with statechar', function(t) { + t.notOk(minimatch('ax', 'a?(b*)')) + t.ok(minimatch('ax', '?(a*|b)')) + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/package.json b/node_modules/mocha/node_modules/glob/package.json new file mode 100644 index 00000000..bfbbbcca --- /dev/null +++ b/node_modules/mocha/node_modules/glob/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "glob", + "description": "a little globber", + "version": "3.2.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "main": "glob.js", + "engines": { + "node": "*" + }, + "dependencies": { + "minimatch": "~0.2.11", + "graceful-fs": "~2.0.0", + "inherits": "2" + }, + "devDependencies": { + "tap": "~0.4.0", + "mkdirp": "0", + "rimraf": "1" + }, + "scripts": { + "test": "tap test/*.js" + }, + "license": "BSD", + "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "homepage": "https://github.com/isaacs/node-glob", + "_id": "glob@3.2.3", + "_from": "glob@3.2.3" +} diff --git a/node_modules/mocha/node_modules/glob/test/00-setup.js b/node_modules/mocha/node_modules/glob/test/00-setup.js new file mode 100644 index 00000000..245afafd --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/00-setup.js @@ -0,0 +1,176 @@ +// just a little pre-run script to set up the fixtures. +// zz-finish cleans it up + +var mkdirp = require("mkdirp") +var path = require("path") +var i = 0 +var tap = require("tap") +var fs = require("fs") +var rimraf = require("rimraf") + +var files = +[ "a/.abcdef/x/y/z/a" +, "a/abcdef/g/h" +, "a/abcfed/g/h" +, "a/b/c/d" +, "a/bc/e/f" +, "a/c/d/c/b" +, "a/cb/e/f" +] + +var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c") +var symlinkFrom = "../.." + +files = files.map(function (f) { + return path.resolve(__dirname, f) +}) + +tap.test("remove fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "remove fixtures") + t.end() + }) +}) + +files.forEach(function (f) { + tap.test(f, function (t) { + var d = path.dirname(f) + mkdirp(d, 0755, function (er) { + if (er) { + t.fail(er) + return t.bailout() + } + fs.writeFile(f, "i like tests", function (er) { + t.ifError(er, "make file") + t.end() + }) + }) + }) +}) + +if (process.platform !== "win32") { + tap.test("symlinky", function (t) { + var d = path.dirname(symlinkTo) + console.error("mkdirp", d) + mkdirp(d, 0755, function (er) { + t.ifError(er) + fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) { + t.ifError(er, "make symlink") + t.end() + }) + }) + }) +} + +;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) { + w = "/tmp/glob-test/" + w + tap.test("create " + w, function (t) { + mkdirp(w, function (er) { + if (er) + throw er + t.pass(w) + t.end() + }) + }) +}) + + +// generate the bash pattern test-fixtures if possible +if (process.platform === "win32" || !process.env.TEST_REGEN) { + console.error("Windows, or TEST_REGEN unset. Using cached fixtures.") + return +} + +var spawn = require("child_process").spawn; +var globs = + // put more patterns here. + // anything that would be directly in / should be in /tmp/glob-test + ["test/a/*/+(c|g)/./d" + ,"test/a/**/[cg]/../[cg]" + ,"test/a/{b,c,d,e,f}/**/g" + ,"test/a/b/**" + ,"test/**/g" + ,"test/a/abc{fed,def}/g/h" + ,"test/a/abc{fed/g,def}/**/" + ,"test/a/abc{fed/g,def}/**///**/" + ,"test/**/a/**/" + ,"test/+(a|b|c)/a{/,bc*}/**" + ,"test/*/*/*/f" + ,"test/**/f" + ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" + ,"{./*/*,/tmp/glob-test/*}" + ,"{/tmp/glob-test/*,*}" // evil owl face! how you taunt me! + ,"test/a/!(symlink)/**" + ] +var bashOutput = {} +var fs = require("fs") + +globs.forEach(function (pattern) { + tap.test("generate fixture " + pattern, function (t) { + var cmd = "shopt -s globstar && " + + "shopt -s extglob && " + + "shopt -s nullglob && " + + // "shopt >&2; " + + "eval \'for i in " + pattern + "; do echo $i; done\'" + var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) }) + var out = [] + cp.stdout.on("data", function (c) { + out.push(c) + }) + cp.stderr.pipe(process.stderr) + cp.on("close", function (code) { + out = flatten(out) + if (!out) + out = [] + else + out = cleanResults(out.split(/\r*\n/)) + + bashOutput[pattern] = out + t.notOk(code, "bash test should finish nicely") + t.end() + }) + }) +}) + +tap.test("save fixtures", function (t) { + var fname = path.resolve(__dirname, "bash-results.json") + var data = JSON.stringify(bashOutput, null, 2) + "\n" + fs.writeFile(fname, data, function (er) { + t.ifError(er) + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +function flatten (chunks) { + var s = 0 + chunks.forEach(function (c) { s += c.length }) + var out = new Buffer(s) + s = 0 + chunks.forEach(function (c) { + c.copy(out, s) + s += c.length + }) + + return out.toString().trim() +} + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} diff --git a/node_modules/mocha/node_modules/glob/test/bash-comparison.js b/node_modules/mocha/node_modules/glob/test/bash-comparison.js new file mode 100644 index 00000000..239ed1a9 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/bash-comparison.js @@ -0,0 +1,63 @@ +// basic test +// show that it does the same thing by default as the shell. +var tap = require("tap") +, child_process = require("child_process") +, bashResults = require("./bash-results.json") +, globs = Object.keys(bashResults) +, glob = require("../") +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +globs.forEach(function (pattern) { + var expect = bashResults[pattern] + // anything regarding the symlink thing will fail on windows, so just skip it + if (process.platform === "win32" && + expect.some(function (m) { + return /\/symlink\//.test(m) + })) + return + + tap.test(pattern, function (t) { + glob(pattern, function (er, matches) { + if (er) + throw er + + // sort and unmark, just to match the shell results + matches = cleanResults(matches) + + t.deepEqual(matches, expect, pattern) + t.end() + }) + }) + + tap.test(pattern + " sync", function (t) { + var matches = cleanResults(glob.sync(pattern)) + + t.deepEqual(matches, expect, "should match shell") + t.end() + }) +}) + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/') + }) +} diff --git a/node_modules/mocha/node_modules/glob/test/bash-results.json b/node_modules/mocha/node_modules/glob/test/bash-results.json new file mode 100644 index 00000000..a9bc347d --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/bash-results.json @@ -0,0 +1,350 @@ +{ + "test/a/*/+(c|g)/./d": [ + "test/a/b/c/./d" + ], + "test/a/**/[cg]/../[cg]": [ + "test/a/abcdef/g/../g", + "test/a/abcfed/g/../g", + "test/a/b/c/../c", + "test/a/c/../c", + "test/a/c/d/c/../c", + "test/a/symlink/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c" + ], + "test/a/{b,c,d,e,f}/**/g": [], + "test/a/b/**": [ + "test/a/b", + "test/a/b/c", + "test/a/b/c/d" + ], + "test/**/g": [ + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed,def}/g/h": [ + "test/a/abcdef/g/h", + "test/a/abcfed/g/h" + ], + "test/a/abc{fed/g,def}/**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/a/abc{fed/g,def}/**///**/": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed/g" + ], + "test/**/a/**/": [ + "test/a", + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/b", + "test/a/b/c", + "test/a/bc", + "test/a/bc/e", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/cb", + "test/a/cb/e", + "test/a/symlink", + "test/a/symlink/a", + "test/a/symlink/a/b", + "test/a/symlink/a/b/c", + "test/a/symlink/a/b/c/a", + "test/a/symlink/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b" + ], + "test/+(a|b|c)/a{/,bc*}/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h" + ], + "test/*/*/*/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/**/f": [ + "test/a/bc/e/f", + "test/a/cb/e/f" + ], + "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [ + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", + "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c" + ], + "{./*/*,/tmp/glob-test/*}": [ + "./examples/g.js", + "./examples/usr-local.js", + "./node_modules/graceful-fs", + "./node_modules/inherits", + "./node_modules/minimatch", + "./node_modules/mkdirp", + "./node_modules/rimraf", + "./node_modules/tap", + "./test/00-setup.js", + "./test/a", + "./test/bash-comparison.js", + "./test/bash-results.json", + "./test/cwd-test.js", + "./test/globstar-match.js", + "./test/mark.js", + "./test/nocase-nomagic.js", + "./test/pause-resume.js", + "./test/root-nomount.js", + "./test/root.js", + "./test/stat.js", + "./test/zz-cleanup.js", + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq" + ], + "{/tmp/glob-test/*,*}": [ + "/tmp/glob-test/asdf", + "/tmp/glob-test/bar", + "/tmp/glob-test/baz", + "/tmp/glob-test/foo", + "/tmp/glob-test/quux", + "/tmp/glob-test/qwer", + "/tmp/glob-test/rewq", + "examples", + "glob.js", + "LICENSE", + "node_modules", + "package.json", + "README.md", + "test" + ], + "test/a/!(symlink)/**": [ + "test/a/abcdef", + "test/a/abcdef/g", + "test/a/abcdef/g/h", + "test/a/abcfed", + "test/a/abcfed/g", + "test/a/abcfed/g/h", + "test/a/b", + "test/a/b/c", + "test/a/b/c/d", + "test/a/bc", + "test/a/bc/e", + "test/a/bc/e/f", + "test/a/c", + "test/a/c/d", + "test/a/c/d/c", + "test/a/c/d/c/b", + "test/a/cb", + "test/a/cb/e", + "test/a/cb/e/f" + ] +} diff --git a/node_modules/mocha/node_modules/glob/test/cwd-test.js b/node_modules/mocha/node_modules/glob/test/cwd-test.js new file mode 100644 index 00000000..352c27ef --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/cwd-test.js @@ -0,0 +1,55 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing cwd and searching for **/d", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('**/d', function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('a', function (t) { + glob('**/d', {cwd:path.resolve('a')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'b/c/d', 'c/d' ]) + t.end() + }) + }) + + t.test('a/b', function (t) { + glob('**/d', {cwd:path.resolve('a/b')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('a/b/', function (t) { + glob('**/d', {cwd:path.resolve('a/b/')}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'c/d' ]) + t.end() + }) + }) + + t.test('.', function (t) { + glob('**/d', {cwd: process.cwd()}, function (er, matches) { + t.ifError(er) + t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/test/globstar-match.js b/node_modules/mocha/node_modules/glob/test/globstar-match.js new file mode 100644 index 00000000..9b234fa2 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/globstar-match.js @@ -0,0 +1,19 @@ +var Glob = require("../glob.js").Glob +var test = require('tap').test + +test('globstar should not have dupe matches', function(t) { + var pattern = 'a/**/[gh]' + var g = new Glob(pattern, { cwd: __dirname }) + var matches = [] + g.on('match', function(m) { + console.error('match %j', m) + matches.push(m) + }) + g.on('end', function(set) { + console.error('set', set) + matches = matches.sort() + set = set.sort() + t.same(matches, set, 'should have same set of matches') + t.end() + }) +}) diff --git a/node_modules/mocha/node_modules/glob/test/mark.js b/node_modules/mocha/node_modules/glob/test/mark.js new file mode 100644 index 00000000..ed68a335 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/mark.js @@ -0,0 +1,74 @@ +var test = require("tap").test +var glob = require('../') +process.chdir(__dirname) + +test("mark, no / on pattern", function (t) { + glob("a/*", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + + if (process.platform !== "win32") + expect.push('a/symlink/') + + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, no / on pattern", function (t) { + glob("a/*", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef', + 'a/abcfed', + 'a/b', + 'a/bc', + 'a/c', + 'a/cb' ] + + if (process.platform !== "win32") + expect.push('a/symlink') + t.same(results, expect) + t.end() + }) +}) + +test("mark=true, / on pattern", function (t) { + glob("a/*/", {mark: true}, function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) + +test("mark=false, / on pattern", function (t) { + glob("a/*/", function (er, results) { + if (er) + throw er + var expect = [ 'a/abcdef/', + 'a/abcfed/', + 'a/b/', + 'a/bc/', + 'a/c/', + 'a/cb/' ] + if (process.platform !== "win32") + expect.push('a/symlink/') + t.same(results, expect) + t.end() + }) +}) diff --git a/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js b/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js new file mode 100644 index 00000000..d8629709 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js @@ -0,0 +1,113 @@ +var fs = require('graceful-fs'); +var test = require('tap').test; +var glob = require('../'); + +test('mock fs', function(t) { + var stat = fs.stat + var statSync = fs.statSync + var readdir = fs.readdir + var readdirSync = fs.readdirSync + + function fakeStat(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = { isDirectory: function() { return true } } + break + case '/tmp/a': + ret = { isDirectory: function() { return false } } + break + } + return ret + } + + fs.stat = function(path, cb) { + var f = fakeStat(path); + if (f) { + process.nextTick(function() { + cb(null, f) + }) + } else { + stat.call(fs, path, cb) + } + } + + fs.statSync = function(path) { + return fakeStat(path) || statSync.call(fs, path) + } + + function fakeReaddir(path) { + var ret + switch (path.toLowerCase()) { + case '/tmp': case '/tmp/': + ret = [ 'a', 'A' ] + break + case '/': + ret = ['tmp', 'tMp', 'tMP', 'TMP'] + } + return ret + } + + fs.readdir = function(path, cb) { + var f = fakeReaddir(path) + if (f) + process.nextTick(function() { + cb(null, f) + }) + else + readdir.call(fs, path, cb) + } + + fs.readdirSync = function(path) { + return fakeReaddir(path) || readdirSync.call(fs, path) + } + + t.pass('mocked') + t.end() +}) + +test('nocase, nomagic', function(t) { + var n = 2 + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/a', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) + glob('/tmp/A', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + if (--n === 0) t.end() + }) +}) + +test('nocase, with some magic', function(t) { + t.plan(2) + var want = [ '/TMP/A', + '/TMP/a', + '/tMP/A', + '/tMP/a', + '/tMp/A', + '/tMp/a', + '/tmp/A', + '/tmp/a' ] + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) + glob('/tmp/*', { nocase: true }, function(er, res) { + if (er) + throw er + t.same(res.sort(), want) + }) +}) diff --git a/node_modules/mocha/node_modules/glob/test/pause-resume.js b/node_modules/mocha/node_modules/glob/test/pause-resume.js new file mode 100644 index 00000000..e1ffbab1 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/pause-resume.js @@ -0,0 +1,73 @@ +// show that no match events happen while paused. +var tap = require("tap") +, child_process = require("child_process") +// just some gnarly pattern with lots of matches +, pattern = "test/a/!(symlink)/**" +, bashResults = require("./bash-results.json") +, patterns = Object.keys(bashResults) +, glob = require("../") +, Glob = glob.Glob +, path = require("path") + +// run from the root of the project +// this is usually where you're at anyway, but be sure. +process.chdir(path.resolve(__dirname, "..")) + +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 : a < b ? -1 : 0 +} + +function cleanResults (m) { + // normalize discrepancies in ordering, duplication, + // and ending slashes. + return m.map(function (m) { + return m.replace(/\/+/g, "/").replace(/\/$/, "") + }).sort(alphasort).reduce(function (set, f) { + if (f !== set[set.length - 1]) set.push(f) + return set + }, []).sort(alphasort).map(function (f) { + // de-windows + return (process.platform !== 'win32') ? f + : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') + }) +} + +var globResults = [] +tap.test("use a Glob object, and pause/resume it", function (t) { + var g = new Glob(pattern) + , paused = false + , res = [] + , expect = bashResults[pattern] + + g.on("pause", function () { + console.error("pause") + }) + + g.on("resume", function () { + console.error("resume") + }) + + g.on("match", function (m) { + t.notOk(g.paused, "must not be paused") + globResults.push(m) + g.pause() + t.ok(g.paused, "must be paused") + setTimeout(g.resume.bind(g), 10) + }) + + g.on("end", function (matches) { + t.pass("reached glob end") + globResults = cleanResults(globResults) + matches = cleanResults(matches) + t.deepEqual(matches, globResults, + "end event matches should be the same as match events") + + t.deepEqual(matches, expect, + "glob matches should be the same as bash results") + + t.end() + }) +}) + diff --git a/node_modules/mocha/node_modules/glob/test/root-nomount.js b/node_modules/mocha/node_modules/glob/test/root-nomount.js new file mode 100644 index 00000000..3ac5979b --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/root-nomount.js @@ -0,0 +1,39 @@ +var tap = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +tap.test("changing root and searching for /b*/**", function (t) { + var glob = require('../') + var path = require('path') + t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.', nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) + }) + + t.test('a', function (t) { + glob('/b*/**', { globDebug: true, root: path.resolve('a'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b'), nomount: true }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) + t.end() + }) + }) + + t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() + }) + + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/test/root.js b/node_modules/mocha/node_modules/glob/test/root.js new file mode 100644 index 00000000..95c23f99 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/root.js @@ -0,0 +1,46 @@ +var t = require("tap") + +var origCwd = process.cwd() +process.chdir(__dirname) + +var glob = require('../') +var path = require('path') + +t.test('.', function (t) { + glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) { + t.ifError(er) + t.like(matches, []) + t.end() + }) +}) + + +t.test('a', function (t) { + console.error("root=" + path.resolve('a')) + glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) { + t.ifError(er) + var wanted = [ + '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' + ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + }) + + t.like(matches, wanted) + t.end() + }) +}) + +t.test('root=a, cwd=a/b', function (t) { + glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) { + t.ifError(er) + t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) { + return path.join(path.resolve('a'), m).replace(/\\/g, '/') + })) + t.end() + }) +}) + +t.test('cd -', function (t) { + process.chdir(origCwd) + t.end() +}) diff --git a/node_modules/mocha/node_modules/glob/test/stat.js b/node_modules/mocha/node_modules/glob/test/stat.js new file mode 100644 index 00000000..62917114 --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/stat.js @@ -0,0 +1,32 @@ +var glob = require('../') +var test = require('tap').test +var path = require('path') + +test('stat all the things', function(t) { + var g = new glob.Glob('a/*abc*/**', { stat: true, cwd: __dirname }) + var matches = [] + g.on('match', function(m) { + matches.push(m) + }) + var stats = [] + g.on('stat', function(m) { + stats.push(m) + }) + g.on('end', function(eof) { + stats = stats.sort() + matches = matches.sort() + eof = eof.sort() + t.same(stats, matches) + t.same(eof, matches) + var cache = Object.keys(this.statCache) + t.same(cache.map(function (f) { + return path.relative(__dirname, f) + }).sort(), matches) + + cache.forEach(function(c) { + t.equal(typeof this.statCache[c], 'object') + }, this) + + t.end() + }) +}) diff --git a/node_modules/mocha/node_modules/glob/test/zz-cleanup.js b/node_modules/mocha/node_modules/glob/test/zz-cleanup.js new file mode 100644 index 00000000..e085f0fa --- /dev/null +++ b/node_modules/mocha/node_modules/glob/test/zz-cleanup.js @@ -0,0 +1,11 @@ +// remove the fixtures +var tap = require("tap") +, rimraf = require("rimraf") +, path = require("path") + +tap.test("cleanup fixtures", function (t) { + rimraf(path.resolve(__dirname, "a"), function (er) { + t.ifError(er, "removed") + t.end() + }) +}) diff --git a/node_modules/mocha/node_modules/growl/History.md b/node_modules/mocha/node_modules/growl/History.md new file mode 100644 index 00000000..a4b7b49f --- /dev/null +++ b/node_modules/mocha/node_modules/growl/History.md @@ -0,0 +1,63 @@ + +1.7.0 / 2012-12-30 +================== + + * support transient notifications in Gnome + +1.6.1 / 2012-09-25 +================== + + * restore compatibility with node < 0.8 [fgnass] + +1.6.0 / 2012-09-06 +================== + + * add notification center support [drudge] + +1.5.1 / 2012-04-08 +================== + + * Merge pull request #16 from KyleAMathews/patch-1 + * Fixes #15 + +1.5.0 / 2012-02-08 +================== + + * Added windows support [perfusorius] + +1.4.1 / 2011-12-28 +================== + + * Fixed: dont exit(). Closes #9 + +1.4.0 / 2011-12-17 +================== + + * Changed API: `growl.notify()` -> `growl()` + +1.3.0 / 2011-12-17 +================== + + * Added support for Ubuntu/Debian/Linux users [niftylettuce] + * Fixed: send notifications even if title not specified [alessioalex] + +1.2.0 / 2011-10-06 +================== + + * Add support for priority. + +1.1.0 / 2011-03-15 +================== + + * Added optional callbacks + * Added parsing of version + +1.0.1 / 2010-03-26 +================== + + * Fixed; sys.exec -> child_process.exec to support latest node + +1.0.0 / 2010-03-19 +================== + + * Initial release diff --git a/node_modules/mocha/node_modules/growl/Readme.md b/node_modules/mocha/node_modules/growl/Readme.md new file mode 100644 index 00000000..48d717cc --- /dev/null +++ b/node_modules/mocha/node_modules/growl/Readme.md @@ -0,0 +1,99 @@ +# Growl for nodejs + +Growl support for Nodejs. This is essentially a port of my [Ruby Growl Library](http://github.com/visionmedia/growl). Ubuntu/Linux support added thanks to [@niftylettuce](http://github.com/niftylettuce). + +## Installation + +### Install + +### Mac OS X (Darwin): + + Install [growlnotify(1)](http://growl.info/extras.php#growlnotify). On OS X 10.8, Notification Center is supported using [terminal-notifier](https://github.com/alloy/terminal-notifier). To install: + + $ sudo gem install terminal-notifier + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +### Ubuntu (Linux): + + Install `notify-send` through the [libnotify-bin](http://packages.ubuntu.com/libnotify-bin) package: + + $ sudo apt-get install libnotify-bin + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +### Windows: + + Download and install [Growl for Windows](http://www.growlforwindows.com/gfw/default.aspx) + + Download [growlnotify](http://www.growlforwindows.com/gfw/help/growlnotify.aspx) - **IMPORTANT :** Unpack growlnotify to a folder that is present in your path! + + Install [npm](http://npmjs.org/) and run: + + $ npm install growl + +## Examples + +Callback functions are optional + + var growl = require('growl') + growl('You have mail!') + growl('5 new messages', { sticky: true }) + growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true }) + growl('Message with title', { title: 'Title'}) + growl('Set priority', { priority: 2 }) + growl('Show Safari icon', { image: 'Safari' }) + growl('Show icon', { image: 'path/to/icon.icns' }) + growl('Show image', { image: 'path/to/my.image.png' }) + growl('Show png filesystem icon', { image: 'png' }) + growl('Show pdf filesystem icon', { image: 'article.pdf' }) + growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(err){ + // ... notified + }) + +## Options + + - title + - notification title + - name + - application name + - priority + - priority for the notification (default is 0) + - sticky + - weither or not the notification should remainin until closed + - image + - Auto-detects the context: + - path to an icon sets --iconpath + - path to an image sets --image + - capitalized word sets --appIcon + - filename uses extname as --icon + - otherwise treated as --icon + +## License + +(The MIT License) + +Copyright (c) 2009 TJ Holowaychuk + +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/mocha/node_modules/growl/lib/growl.js b/node_modules/mocha/node_modules/growl/lib/growl.js new file mode 100644 index 00000000..04f4f9b4 --- /dev/null +++ b/node_modules/mocha/node_modules/growl/lib/growl.js @@ -0,0 +1,234 @@ +// Growl - Copyright TJ Holowaychuk (MIT Licensed) + +/** + * Module dependencies. + */ + +var exec = require('child_process').exec + , fs = require('fs') + , path = require('path') + , exists = fs.existsSync || path.existsSync + , os = require('os') + , quote = JSON.stringify + , cmd; + +function which(name) { + var paths = process.env.PATH.split(':'); + var loc; + + for (var i = 0, len = paths.length; i < len; ++i) { + loc = path.join(paths[i], name); + if (exists(loc)) return loc; + } +} + +switch(os.type()) { + case 'Darwin': + if (which('terminal-notifier')) { + cmd = { + type: "Darwin-NotificationCenter" + , pkg: "terminal-notifier" + , msg: '-message' + , title: '-title' + , subtitle: '-subtitle' + , priority: { + cmd: '-execute' + , range: [] + } + }; + } else { + cmd = { + type: "Darwin-Growl" + , pkg: "growlnotify" + , msg: '-m' + , sticky: '--sticky' + , priority: { + cmd: '--priority' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + , "Very Low" + , "Moderate" + , "Normal" + , "High" + , "Emergency" + ] + } + }; + } + break; + case 'Linux': + cmd = { + type: "Linux" + , pkg: "notify-send" + , msg: '' + , sticky: '-t 0' + , icon: '-i' + , priority: { + cmd: '-u' + , range: [ + "low" + , "normal" + , "critical" + ] + } + }; + break; + case 'Windows_NT': + cmd = { + type: "Windows" + , pkg: "growlnotify" + , msg: '' + , sticky: '/s:true' + , title: '/t:' + , icon: '/i:' + , priority: { + cmd: '/p:' + , range: [ + -2 + , -1 + , 0 + , 1 + , 2 + ] + } + }; + break; +} + +/** + * Expose `growl`. + */ + +exports = module.exports = growl; + +/** + * Node-growl version. + */ + +exports.version = '1.4.1' + +/** + * Send growl notification _msg_ with _options_. + * + * Options: + * + * - title Notification title + * - sticky Make the notification stick (defaults to false) + * - priority Specify an int or named key (default is 0) + * - name Application name (defaults to growlnotify) + * - image + * - path to an icon sets --iconpath + * - path to an image sets --image + * - capitalized word sets --appIcon + * - filename uses extname as --icon + * - otherwise treated as --icon + * + * Examples: + * + * growl('New email') + * growl('5 new emails', { title: 'Thunderbird' }) + * growl('Email sent', function(){ + * // ... notification sent + * }) + * + * @param {string} msg + * @param {object} options + * @param {function} fn + * @api public + */ + +function growl(msg, options, fn) { + var image + , args + , options = options || {} + , fn = fn || function(){}; + + // noop + if (!cmd) return fn(new Error('growl not supported on this platform')); + args = [cmd.pkg]; + + // image + if (image = options.image) { + switch(cmd.type) { + case 'Darwin-Growl': + var flag, ext = path.extname(image).substr(1) + flag = flag || ext == 'icns' && 'iconpath' + flag = flag || /^[A-Z]/.test(image) && 'appIcon' + flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' + flag = flag || ext && (image = ext) && 'icon' + flag = flag || 'icon' + args.push('--' + flag, image) + break; + case 'Linux': + args.push(cmd.icon + " " + image); + // libnotify defaults to sticky, set a hint for transient notifications + if (!options.sticky) args.push('--hint=int:transient:1'); + break; + case 'Windows': + args.push(cmd.icon + quote(image)); + break; + } + } + + // sticky + if (options.sticky) args.push(cmd.sticky); + + // priority + if (options.priority) { + var priority = options.priority + ''; + var checkindexOf = cmd.priority.range.indexOf(priority); + if (~cmd.priority.range.indexOf(priority)) { + args.push(cmd.priority, options.priority); + } + } + + // name + if (options.name && cmd.type === "Darwin-Growl") { + args.push('--name', options.name); + } + + switch(cmd.type) { + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Darwin-NotificationCenter': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) { + args.push(cmd.title); + args.push(quote(options.title)); + } + if (options.subtitle) { + args.push(cmd.subtitle); + args.push(quote(options.title)); + } + break; + case 'Darwin-Growl': + args.push(cmd.msg); + args.push(quote(msg)); + if (options.title) args.push(quote(options.title)); + break; + case 'Linux': + if (options.title) { + args.push(quote(options.title)); + args.push(cmd.msg); + args.push(quote(msg)); + } else { + args.push(quote(msg)); + } + break; + case 'Windows': + args.push(quote(msg)); + if (options.title) args.push(cmd.title + quote(options.title)); + break; + } + + // execute + exec(args.join(' '), fn); +}; diff --git a/node_modules/mocha/node_modules/growl/package.json b/node_modules/mocha/node_modules/growl/package.json new file mode 100644 index 00000000..6565e46d --- /dev/null +++ b/node_modules/mocha/node_modules/growl/package.json @@ -0,0 +1,14 @@ +{ + "name": "growl", + "version": "1.7.0", + "description": "Growl unobtrusive notifications", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "main": "./lib/growl.js", + "readme": "# Growl for nodejs\n\nGrowl support for Nodejs. This is essentially a port of my [Ruby Growl Library](http://github.com/visionmedia/growl). Ubuntu/Linux support added thanks to [@niftylettuce](http://github.com/niftylettuce). \n\n## Installation\n\n### Install \n\n### Mac OS X (Darwin):\n\n Install [growlnotify(1)](http://growl.info/extras.php#growlnotify). On OS X 10.8, Notification Center is supported using [terminal-notifier](https://github.com/alloy/terminal-notifier). To install:\n \n $ sudo gem install terminal-notifier\n \n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n### Ubuntu (Linux):\n\n Install `notify-send` through the [libnotify-bin](http://packages.ubuntu.com/libnotify-bin) package:\n\n $ sudo apt-get install libnotify-bin\n\n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n### Windows:\n\n Download and install [Growl for Windows](http://www.growlforwindows.com/gfw/default.aspx)\n\n Download [growlnotify](http://www.growlforwindows.com/gfw/help/growlnotify.aspx) - **IMPORTANT :** Unpack growlnotify to a folder that is present in your path!\n\n Install [npm](http://npmjs.org/) and run:\n \n $ npm install growl\n\n## Examples\n\nCallback functions are optional\n\n var growl = require('growl')\n growl('You have mail!')\n growl('5 new messages', { sticky: true })\n growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true })\n growl('Message with title', { title: 'Title'})\n growl('Set priority', { priority: 2 })\n growl('Show Safari icon', { image: 'Safari' })\n growl('Show icon', { image: 'path/to/icon.icns' })\n growl('Show image', { image: 'path/to/my.image.png' })\n growl('Show png filesystem icon', { image: 'png' })\n growl('Show pdf filesystem icon', { image: 'article.pdf' })\n growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(err){\n // ... notified\n })\n\n## Options\n\n - title\n - notification title\n - name\n - application name\n - priority\n - priority for the notification (default is 0)\n - sticky\n - weither or not the notification should remainin until closed\n - image\n - Auto-detects the context:\n - path to an icon sets --iconpath\n - path to an image sets --image\n - capitalized word sets --appIcon\n - filename uses extname as --icon\n - otherwise treated as --icon\n \n## License \n\n(The MIT License)\n\nCopyright (c) 2009 TJ Holowaychuk \n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", + "readmeFilename": "Readme.md", + "_id": "growl@1.7.0", + "_from": "growl@1.7.x" +} diff --git a/node_modules/mocha/node_modules/growl/test.js b/node_modules/mocha/node_modules/growl/test.js new file mode 100644 index 00000000..cf22d90b --- /dev/null +++ b/node_modules/mocha/node_modules/growl/test.js @@ -0,0 +1,20 @@ + +var growl = require('./lib/growl') + +growl('You have mail!') +growl('5 new messages', { sticky: true }) +growl('5 new emails', { title: 'Email Client', image: 'Safari', sticky: true }) +growl('Message with title', { title: 'Title'}) +growl('Set priority', { priority: 2 }) +growl('Show Safari icon', { image: 'Safari' }) +growl('Show icon', { image: 'path/to/icon.icns' }) +growl('Show image', { image: 'path/to/my.image.png' }) +growl('Show png filesystem icon', { image: 'png' }) +growl('Show pdf filesystem icon', { image: 'article.pdf' }) +growl('Show pdf filesystem icon', { image: 'article.pdf' }, function(){ + console.log('callback'); +}) +growl('Show pdf filesystem icon', { title: 'Use show()', image: 'article.pdf' }) +growl('here \' are \n some \\ characters that " need escaping', {}, function(error, stdout, stderr) { + if (error !== null) throw new Error('escaping failed:\n' + stdout + stderr); +}) diff --git a/node_modules/mocha/node_modules/jade/.npmignore b/node_modules/mocha/node_modules/jade/.npmignore new file mode 100644 index 00000000..b9af3d4b --- /dev/null +++ b/node_modules/mocha/node_modules/jade/.npmignore @@ -0,0 +1,15 @@ +test +support +benchmarks +examples +lib-cov +coverage.html +.gitmodules +.travis.yml +History.md +Readme.md +Makefile +test/ +support/ +benchmarks/ +examples/ diff --git a/node_modules/mocha/node_modules/jade/LICENSE b/node_modules/mocha/node_modules/jade/LICENSE new file mode 100644 index 00000000..8ad0e0d3 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2009-2010 TJ Holowaychuk + +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. \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/bin/jade b/node_modules/mocha/node_modules/jade/bin/jade new file mode 100755 index 00000000..7e6002f9 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/bin/jade @@ -0,0 +1,147 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var fs = require('fs') + , program = require('commander') + , path = require('path') + , basename = path.basename + , dirname = path.dirname + , resolve = path.resolve + , join = path.join + , mkdirp = require('mkdirp') + , jade = require('../'); + +// jade options + +var options = {}; + +// options + +program + .version(jade.version) + .usage('[options] [dir|file ...]') + .option('-o, --obj ', 'javascript options object') + .option('-O, --out ', 'output the compiled html to ') + .option('-p, --path ', 'filename used to resolve includes') + .option('-P, --pretty', 'compile pretty html output') + .option('-c, --client', 'compile for client-side runtime.js') + .option('-D, --no-debug', 'compile without debugging (smaller functions)') + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' # translate jade the templates dir'); + console.log(' $ jade templates'); + console.log(''); + console.log(' # create {foo,bar}.html'); + console.log(' $ jade {foo,bar}.jade'); + console.log(''); + console.log(' # jade over stdio'); + console.log(' $ jade < my.jade > my.html'); + console.log(''); + console.log(' # jade over stdio'); + console.log(' $ echo "h1 Jade!" | jade'); + console.log(''); + console.log(' # foo, bar dirs rendering to /tmp'); + console.log(' $ jade foo bar --out /tmp '); + console.log(''); +}); + +program.parse(process.argv); + +// options given, parse them + +if (program.obj) options = eval('(' + program.obj + ')'); + +// --filename + +if (program.path) options.filename = program.path; + +// --no-debug + +options.compileDebug = program.debug; + +// --client + +options.client = program.client; + +// --pretty + +options.pretty = program.pretty; + +// left-over args are file paths + +var files = program.args; + +// compile files + +if (files.length) { + console.log(); + files.forEach(renderFile); + process.on('exit', console.log); +// stdio +} else { + stdin(); +} + +/** + * Compile from stdin. + */ + +function stdin() { + var buf = ''; + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function(chunk){ buf += chunk; }); + process.stdin.on('end', function(){ + var fn = jade.compile(buf, options); + var output = options.client + ? fn.toString() + : fn(options); + process.stdout.write(output); + }).resume(); +} + +/** + * Process the given path, compiling the jade files found. + * Always walk the subdirectories. + */ + +function renderFile(path) { + var re = /\.jade$/; + fs.lstat(path, function(err, stat) { + if (err) throw err; + // Found jade file + if (stat.isFile() && re.test(path)) { + fs.readFile(path, 'utf8', function(err, str){ + if (err) throw err; + options.filename = path; + var fn = jade.compile(str, options); + var extname = options.client ? '.js' : '.html'; + path = path.replace(re, extname); + if (program.out) path = join(program.out, basename(path)); + var dir = resolve(dirname(path)); + mkdirp(dir, 0755, function(err){ + if (err) throw err; + var output = options.client + ? fn.toString() + : fn(options); + fs.writeFile(path, output, function(err){ + if (err) throw err; + console.log(' \033[90mrendered \033[36m%s\033[0m', path); + }); + }); + }); + // Found directory + } else if (stat.isDirectory()) { + fs.readdir(path, function(err, files) { + if (err) throw err; + files.map(function(filename) { + return path + '/' + filename; + }).forEach(renderFile); + }); + } + }); +} diff --git a/node_modules/mocha/node_modules/jade/index.js b/node_modules/mocha/node_modules/jade/index.js new file mode 100644 index 00000000..8ad059f7 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/index.js @@ -0,0 +1,4 @@ + +module.exports = process.env.JADE_COV + ? require('./lib-cov/jade') + : require('./lib/jade'); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/jade.js b/node_modules/mocha/node_modules/jade/jade.js new file mode 100644 index 00000000..1983a203 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/jade.js @@ -0,0 +1,3586 @@ +(function() { + +// CommonJS require() + +function require(p){ + var path = require.resolve(p) + , mod = require.modules[path]; + if (!mod) throw new Error('failed to require "' + p + '"'); + if (!mod.exports) { + mod.exports = {}; + mod.call(mod.exports, mod, mod.exports, require.relative(path)); + } + return mod.exports; + } + +require.modules = {}; + +require.resolve = function (path){ + var orig = path + , reg = path + '.js' + , index = path + '/index.js'; + return require.modules[reg] && reg + || require.modules[index] && index + || orig; + }; + +require.register = function (path, fn){ + require.modules[path] = fn; + }; + +require.relative = function (parent) { + return function(p){ + if ('.' != p.charAt(0)) return require(p); + + var path = parent.split('/') + , segs = p.split('/'); + path.pop(); + + for (var i = 0; i < segs.length; i++) { + var seg = segs[i]; + if ('..' == seg) path.pop(); + else if ('.' != seg) path.push(seg); + } + + return require(path.join('/')); + }; + }; + + +require.register("compiler.js", function(module, exports, require){ + +/*! + * Jade - Compiler + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var nodes = require('./nodes') + , filters = require('./filters') + , doctypes = require('./doctypes') + , selfClosing = require('./self-closing') + , runtime = require('./runtime') + , utils = require('./utils'); + + + if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } + } + + if (!String.prototype.trimLeft) { + String.prototype.trimLeft = function(){ + return this.replace(/^\s+/, ''); + } + } + + + +/** + * Initialize `Compiler` with the given `node`. + * + * @param {Node} node + * @param {Object} options + * @api public + */ + +var Compiler = module.exports = function Compiler(node, options) { + this.options = options = options || {}; + this.node = node; + this.hasCompiledDoctype = false; + this.hasCompiledTag = false; + this.pp = options.pretty || false; + this.debug = false !== options.compileDebug; + this.indents = 0; + this.parentIndents = 0; + if (options.doctype) this.setDoctype(options.doctype); +}; + +/** + * Compiler prototype. + */ + +Compiler.prototype = { + + /** + * Compile parse tree to JavaScript. + * + * @api public + */ + + compile: function(){ + this.buf = ['var interp;']; + if (this.pp) this.buf.push("var __indent = [];"); + this.lastBufferedIdx = -1; + this.visit(this.node); + return this.buf.join('\n'); + }, + + /** + * Sets the default doctype `name`. Sets terse mode to `true` when + * html 5 is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {string} name + * @api public + */ + + setDoctype: function(name){ + var doctype = doctypes[(name || 'default').toLowerCase()]; + doctype = doctype || ''; + this.doctype = doctype; + this.terse = '5' == name || 'html' == name; + this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) + this.prettyIndent(1, true); + + for (var i = 0; i < len; ++i) { + // Pretty print text + if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) + this.prettyIndent(1, false); + + this.visit(block.nodes[i]); + // Multiple text nodes are separated by newlines + if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) + this.buffer('\\n'); + } + }, + + /** + * Visit `doctype`. Sets terse mode to `true` when html 5 + * is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {Doctype} doctype + * @api public + */ + + visitDoctype: function(doctype){ + if (doctype && (doctype.val || !this.doctype)) { + this.setDoctype(doctype.val || 'default'); + } + + if (this.doctype) this.buffer(this.doctype); + this.hasCompiledDoctype = true; + }, + + /** + * Visit `mixin`, generating a function that + * may be called within the template. + * + * @param {Mixin} mixin + * @api public + */ + + visitMixin: function(mixin){ + var name = mixin.name.replace(/-/g, '_') + '_mixin' + , args = mixin.args || '' + , block = mixin.block + , attrs = mixin.attrs + , pp = this.pp; + + if (mixin.call) { + if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") + if (block || attrs.length) { + + this.buf.push(name + '.call({'); + + if (block) { + this.buf.push('block: function(){'); + + // Render block with no indents, dynamically added when rendered + this.parentIndents++; + var _indents = this.indents; + this.indents = 0; + this.visit(mixin.block); + this.indents = _indents; + this.parentIndents--; + + if (attrs.length) { + this.buf.push('},'); + } else { + this.buf.push('}'); + } + } + + if (attrs.length) { + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push('attributes: merge({' + val.buf + + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); + } else { + this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); + } + } + + if (args) { + this.buf.push('}, ' + args + ');'); + } else { + this.buf.push('});'); + } + + } else { + this.buf.push(name + '(' + args + ');'); + } + if (pp) this.buf.push("__indent.pop();") + } else { + this.buf.push('var ' + name + ' = function(' + args + '){'); + this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); + this.parentIndents++; + this.visit(block); + this.parentIndents--; + this.buf.push('};'); + } + }, + + /** + * Visit `tag` buffering tag markup, generating + * attributes, visiting the `tag`'s code and block. + * + * @param {Tag} tag + * @api public + */ + + visitTag: function(tag){ + this.indents++; + var name = tag.name + , pp = this.pp; + + if (tag.buffer) name = "' + (" + name + ") + '"; + + if (!this.hasCompiledTag) { + if (!this.hasCompiledDoctype && 'html' == name) { + this.visitDoctype(); + } + this.hasCompiledTag = true; + } + + // pretty print + if (pp && !tag.isInline()) + this.prettyIndent(0, true); + + if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { + this.buffer('<' + name); + this.visitAttributes(tag.attrs); + this.terse + ? this.buffer('>') + : this.buffer('/>'); + } else { + // Optimize attributes buffering + if (tag.attrs.length) { + this.buffer('<' + name); + if (tag.attrs.length) this.visitAttributes(tag.attrs); + this.buffer('>'); + } else { + this.buffer('<' + name + '>'); + } + if (tag.code) this.visitCode(tag.code); + this.escape = 'pre' == tag.name; + this.visit(tag.block); + + // pretty print + if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) + this.prettyIndent(0, true); + + this.buffer(''); + } + this.indents--; + }, + + /** + * Visit `filter`, throwing when the filter does not exist. + * + * @param {Filter} filter + * @api public + */ + + visitFilter: function(filter){ + var fn = filters[filter.name]; + + // unknown filter + if (!fn) { + if (filter.isASTFilter) { + throw new Error('unknown ast filter "' + filter.name + ':"'); + } else { + throw new Error('unknown filter ":' + filter.name + '"'); + } + } + + if (filter.isASTFilter) { + this.buf.push(fn(filter.block, this, filter.attrs)); + } else { + var text = filter.block.nodes.map(function(node){ return node.val }).join('\n'); + filter.attrs = filter.attrs || {}; + filter.attrs.filename = this.options.filename; + this.buffer(utils.text(fn(text, filter.attrs))); + } + }, + + /** + * Visit `text` node. + * + * @param {Text} text + * @api public + */ + + visitText: function(text){ + text = utils.text(text.val.replace(/\\/g, '\\\\')); + if (this.escape) text = escape(text); + this.buffer(text); + }, + + /** + * Visit a `comment`, only buffering when the buffer flag is set. + * + * @param {Comment} comment + * @api public + */ + + visitComment: function(comment){ + if (!comment.buffer) return; + if (this.pp) this.prettyIndent(1, true); + this.buffer(''); + }, + + /** + * Visit a `BlockComment`. + * + * @param {Comment} comment + * @api public + */ + + visitBlockComment: function(comment){ + if (!comment.buffer) return; + if (0 == comment.val.trim().indexOf('if')) { + this.buffer(''); + } else { + this.buffer(''); + } + }, + + /** + * Visit `code`, respecting buffer / escape flags. + * If the code is followed by a block, wrap it in + * a self-calling function. + * + * @param {Code} code + * @api public + */ + + visitCode: function(code){ + // Wrap code blocks with {}. + // we only wrap unbuffered code blocks ATM + // since they are usually flow control + + // Buffer code + if (code.buffer) { + var val = code.val.trimLeft(); + this.buf.push('var __val__ = ' + val); + val = 'null == __val__ ? "" : __val__'; + if (code.escape) val = 'escape(' + val + ')'; + this.buf.push("buf.push(" + val + ");"); + } else { + this.buf.push(code.val); + } + + // Block support + if (code.block) { + if (!code.buffer) this.buf.push('{'); + this.visit(code.block); + if (!code.buffer) this.buf.push('}'); + } + }, + + /** + * Visit `each` block. + * + * @param {Each} each + * @api public + */ + + visitEach: function(each){ + this.buf.push('' + + '// iterate ' + each.obj + '\n' + + ';(function(){\n' + + ' if (\'number\' == typeof ' + each.obj + '.length) {\n' + + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push('' + + ' }\n' + + ' } else {\n' + + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' + + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push(' }\n'); + + this.buf.push(' }\n }\n}).call(this);\n'); + }, + + /** + * Visit `attrs`. + * + * @param {Array} attrs + * @api public + */ + + visitAttributes: function(attrs){ + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push("buf.push(attrs(merge({ " + val.buf + + " }, attributes), merge(" + val.escaped + ", escaped, true)));"); + } else if (val.constant) { + eval('var buf={' + val.buf + '};'); + this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); + } else { + this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); + } + }, + + /** + * Compile attributes. + */ + + attrs: function(attrs){ + var buf = [] + , classes = [] + , escaped = {} + , constant = attrs.every(function(attr){ return isConstant(attr.val) }) + , inherits = false; + + if (this.terse) buf.push('terse: true'); + + attrs.forEach(function(attr){ + if (attr.name == 'attributes') return inherits = true; + escaped[attr.name] = attr.escaped; + if (attr.name == 'class') { + classes.push('(' + attr.val + ')'); + } else { + var pair = "'" + attr.name + "':(" + attr.val + ')'; + buf.push(pair); + } + }); + + if (classes.length) { + classes = classes.join(" + ' ' + "); + buf.push("class: " + classes); + } + + return { + buf: buf.join(', ').replace('class:', '"class":'), + escaped: JSON.stringify(escaped), + inherits: inherits, + constant: constant + }; + } +}; + +/** + * Check if expression can be evaluated to a constant + * + * @param {String} expression + * @return {Boolean} + * @api private + */ + +function isConstant(val){ + // Check strings/literals + if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) + return true; + + // Check numbers + if (!isNaN(Number(val))) + return true; + + // Check arrays + var matches; + if (matches = /^ *\[(.*)\] *$/.exec(val)) + return matches[1].split(',').every(isConstant); + + return false; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +function escape(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} +}); // module: compiler.js + +require.register("doctypes.js", function(module, exports, require){ + +/*! + * Jade - doctypes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + '5': '' + , 'default': '' + , 'xml': '' + , 'transitional': '' + , 'strict': '' + , 'frameset': '' + , '1.1': '' + , 'basic': '' + , 'mobile': '' +}; +}); // module: doctypes.js + +require.register("filters.js", function(module, exports, require){ + +/*! + * Jade - filters + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + + /** + * Wrap text with CDATA block. + */ + + cdata: function(str){ + return ''; + }, + + /** + * Transform sass to css, wrapped in style tags. + */ + + sass: function(str){ + str = str.replace(/\\n/g, '\n'); + var sass = require('sass').render(str).replace(/\n/g, '\\n'); + return ''; + }, + + /** + * Transform stylus to css, wrapped in style tags. + */ + + stylus: function(str, options){ + var ret; + str = str.replace(/\\n/g, '\n'); + var stylus = require('stylus'); + stylus(str, options).render(function(err, css){ + if (err) throw err; + ret = css.replace(/\n/g, '\\n'); + }); + return ''; + }, + + /** + * Transform less to css, wrapped in style tags. + */ + + less: function(str){ + var ret; + str = str.replace(/\\n/g, '\n'); + require('less').render(str, function(err, css){ + if (err) throw err; + ret = ''; + }); + return ret; + }, + + /** + * Transform markdown to html. + */ + + markdown: function(str){ + var md; + + // support markdown / discount + try { + md = require('markdown'); + } catch (err){ + try { + md = require('discount'); + } catch (err) { + try { + md = require('markdown-js'); + } catch (err) { + try { + md = require('marked'); + } catch (err) { + throw new + Error('Cannot find markdown library, install markdown, discount, or marked.'); + } + } + } + } + + str = str.replace(/\\n/g, '\n'); + return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); + }, + + /** + * Transform coffeescript to javascript. + */ + + coffeescript: function(str){ + str = str.replace(/\\n/g, '\n'); + var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); + return ''; + } +}; + +}); // module: filters.js + +require.register("inline-tags.js", function(module, exports, require){ + +/*! + * Jade - inline tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'a' + , 'abbr' + , 'acronym' + , 'b' + , 'br' + , 'code' + , 'em' + , 'font' + , 'i' + , 'img' + , 'ins' + , 'kbd' + , 'map' + , 'samp' + , 'small' + , 'span' + , 'strong' + , 'sub' + , 'sup' +]; +}); // module: inline-tags.js + +require.register("jade.js", function(module, exports, require){ +/*! + * Jade + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Parser = require('./parser') + , Lexer = require('./lexer') + , Compiler = require('./compiler') + , runtime = require('./runtime') + +/** + * Library version. + */ + +exports.version = '0.26.1'; + +/** + * Expose self closing tags. + */ + +exports.selfClosing = require('./self-closing'); + +/** + * Default supported doctypes. + */ + +exports.doctypes = require('./doctypes'); + +/** + * Text filters. + */ + +exports.filters = require('./filters'); + +/** + * Utilities. + */ + +exports.utils = require('./utils'); + +/** + * Expose `Compiler`. + */ + +exports.Compiler = Compiler; + +/** + * Expose `Parser`. + */ + +exports.Parser = Parser; + +/** + * Expose `Lexer`. + */ + +exports.Lexer = Lexer; + +/** + * Nodes. + */ + +exports.nodes = require('./nodes'); + +/** + * Jade runtime helpers. + */ + +exports.runtime = runtime; + +/** + * Template function cache. + */ + +exports.cache = {}; + +/** + * Parse the given `str` of jade and return a function body. + * + * @param {String} str + * @param {Object} options + * @return {String} + * @api private + */ + +function parse(str, options){ + try { + // Parse + var parser = new Parser(str, options.filename, options); + + // Compile + var compiler = new (options.compiler || Compiler)(parser.parse(), options) + , js = compiler.compile(); + + // Debug compiler + if (options.debug) { + console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); + } + + return '' + + 'var buf = [];\n' + + (options.self + ? 'var self = locals || {};\n' + js + : 'with (locals || {}) {\n' + js + '\n}\n') + + 'return buf.join("");'; + } catch (err) { + parser = parser.context(); + runtime.rethrow(err, parser.filename, parser.lexer.lineno); + } +} + +/** + * Compile a `Function` representation of the given jade `str`. + * + * Options: + * + * - `compileDebug` when `false` debugging code is stripped from the compiled template + * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` + * for use with the Jade client-side runtime.js + * + * @param {String} str + * @param {Options} options + * @return {Function} + * @api public + */ + +exports.compile = function(str, options){ + var options = options || {} + , client = options.client + , filename = options.filename + ? JSON.stringify(options.filename) + : 'undefined' + , fn; + + if (options.compileDebug !== false) { + fn = [ + 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' + , 'try {' + , parse(String(str), options) + , '} catch (err) {' + , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' + , '}' + ].join('\n'); + } else { + fn = parse(String(str), options); + } + + if (client) { + fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; + } + + fn = new Function('locals, attrs, escape, rethrow, merge', fn); + + if (client) return fn; + + return function(locals){ + return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); + }; +}; + +/** + * Render the given `str` of jade and invoke + * the callback `fn(err, str)`. + * + * Options: + * + * - `cache` enable template caching + * - `filename` filename required for `include` / `extends` and caching + * + * @param {String} str + * @param {Object|Function} options or fn + * @param {Function} fn + * @api public + */ + +exports.render = function(str, options, fn){ + // swap args + if ('function' == typeof options) { + fn = options, options = {}; + } + + // cache requires .filename + if (options.cache && !options.filename) { + return fn(new Error('the "filename" option is required for caching')); + } + + try { + var path = options.filename; + var tmpl = options.cache + ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) + : exports.compile(str, options); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Render a Jade file at the given `path` and callback `fn(err, str)`. + * + * @param {String} path + * @param {Object|Function} options or callback + * @param {Function} fn + * @api public + */ + +exports.renderFile = function(path, options, fn){ + var key = path + ':string'; + + if ('function' == typeof options) { + fn = options, options = {}; + } + + try { + options.filename = path; + var str = options.cache + ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) + : fs.readFileSync(path, 'utf8'); + exports.render(str, options, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Express support. + */ + +exports.__express = exports.renderFile; + +}); // module: jade.js + +require.register("lexer.js", function(module, exports, require){ + +/*! + * Jade - Lexer + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize `Lexer` with the given `str`. + * + * Options: + * + * - `colons` allow colons for attr delimiters + * + * @param {String} str + * @param {Object} options + * @api private + */ + +var Lexer = module.exports = function Lexer(str, options) { + options = options || {}; + this.input = str.replace(/\r\n|\r/g, '\n'); + this.colons = options.colons; + this.deferredTokens = []; + this.lastIndents = 0; + this.lineno = 1; + this.stash = []; + this.indentStack = []; + this.indentRe = null; + this.pipeless = false; +}; + +/** + * Lexer prototype. + */ + +Lexer.prototype = { + + /** + * Construct a token with the given `type` and `val`. + * + * @param {String} type + * @param {String} val + * @return {Object} + * @api private + */ + + tok: function(type, val){ + return { + type: type + , line: this.lineno + , val: val + } + }, + + /** + * Consume the given `len` of input. + * + * @param {Number} len + * @api private + */ + + consume: function(len){ + this.input = this.input.substr(len); + }, + + /** + * Scan for `type` with the given `regexp`. + * + * @param {String} type + * @param {RegExp} regexp + * @return {Object} + * @api private + */ + + scan: function(regexp, type){ + var captures; + if (captures = regexp.exec(this.input)) { + this.consume(captures[0].length); + return this.tok(type, captures[1]); + } + }, + + /** + * Defer the given `tok`. + * + * @param {Object} tok + * @api private + */ + + defer: function(tok){ + this.deferredTokens.push(tok); + }, + + /** + * 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.next()); + return this.stash[--n]; + }, + + /** + * Return the indexOf `start` / `end` delimiters. + * + * @param {String} start + * @param {String} end + * @return {Number} + * @api private + */ + + indexOfDelimiters: function(start, end){ + var str = this.input + , nstart = 0 + , nend = 0 + , pos = 0; + for (var i = 0, len = str.length; i < len; ++i) { + if (start == str.charAt(i)) { + ++nstart; + } else if (end == str.charAt(i)) { + if (++nend == nstart) { + pos = i; + break; + } + } + } + return pos; + }, + + /** + * Stashed token. + */ + + stashed: function() { + return this.stash.length + && this.stash.shift(); + }, + + /** + * Deferred token. + */ + + deferred: function() { + return this.deferredTokens.length + && this.deferredTokens.shift(); + }, + + /** + * end-of-source. + */ + + eos: function() { + if (this.input.length) return; + if (this.indentStack.length) { + this.indentStack.shift(); + return this.tok('outdent'); + } else { + return this.tok('eos'); + } + }, + + /** + * Blank line. + */ + + blank: function() { + var captures; + if (captures = /^\n *\n/.exec(this.input)) { + this.consume(captures[0].length - 1); + if (this.pipeless) return this.tok('text', ''); + return this.next(); + } + }, + + /** + * Comment. + */ + + comment: function() { + var captures; + if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('comment', captures[2]); + tok.buffer = '-' != captures[1]; + return tok; + } + }, + + /** + * Interpolated tag. + */ + + interpolation: function() { + var captures; + if (captures = /^#\{(.*?)\}/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('interpolation', captures[1]); + } + }, + + /** + * Tag. + */ + + tag: function() { + var captures; + if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { + this.consume(captures[0].length); + var tok, name = captures[1]; + if (':' == name[name.length - 1]) { + name = name.slice(0, -1); + tok = this.tok('tag', name); + this.defer(this.tok(':')); + while (' ' == this.input[0]) this.input = this.input.substr(1); + } else { + tok = this.tok('tag', name); + } + tok.selfClosing = !! captures[2]; + return tok; + } + }, + + /** + * Filter. + */ + + filter: function() { + return this.scan(/^:(\w+)/, 'filter'); + }, + + /** + * Doctype. + */ + + doctype: function() { + return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); + }, + + /** + * Id. + */ + + id: function() { + return this.scan(/^#([\w-]+)/, 'id'); + }, + + /** + * Class. + */ + + className: function() { + return this.scan(/^\.([\w-]+)/, 'class'); + }, + + /** + * Text. + */ + + text: function() { + return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); + }, + + /** + * Extends. + */ + + "extends": function() { + return this.scan(/^extends? +([^\n]+)/, 'extends'); + }, + + /** + * Block prepend. + */ + + prepend: function() { + var captures; + if (captures = /^prepend +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'prepend' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block append. + */ + + append: function() { + var captures; + if (captures = /^append +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'append' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block. + */ + + block: function() { + var captures; + if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = captures[1] || 'replace' + , name = captures[2] + , tok = this.tok('block', name); + + tok.mode = mode; + return tok; + } + }, + + /** + * Yield. + */ + + yield: function() { + return this.scan(/^yield */, 'yield'); + }, + + /** + * Include. + */ + + include: function() { + return this.scan(/^include +([^\n]+)/, 'include'); + }, + + /** + * Case. + */ + + "case": function() { + return this.scan(/^case +([^\n]+)/, 'case'); + }, + + /** + * When. + */ + + when: function() { + return this.scan(/^when +([^:\n]+)/, 'when'); + }, + + /** + * Default. + */ + + "default": function() { + return this.scan(/^default */, 'default'); + }, + + /** + * Assignment. + */ + + assignment: function() { + var captures; + if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { + this.consume(captures[0].length); + var name = captures[1] + , val = captures[2]; + return this.tok('code', 'var ' + name + ' = (' + val + ');'); + } + }, + + /** + * Call mixin. + */ + + call: function(){ + var captures; + if (captures = /^\+([-\w]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('call', captures[1]); + + // Check for args (not attributes) + if (captures = /^ *\((.*?)\)/.exec(this.input)) { + if (!/^ *[-\w]+ *=/.test(captures[1])) { + this.consume(captures[0].length); + tok.args = captures[1]; + } + } + + return tok; + } + }, + + /** + * Mixin. + */ + + mixin: function(){ + var captures; + if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('mixin', captures[1]); + tok.args = captures[2]; + return tok; + } + }, + + /** + * Conditional. + */ + + conditional: function() { + var captures; + if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var type = captures[1] + , js = captures[2]; + + switch (type) { + case 'if': js = 'if (' + js + ')'; break; + case 'unless': js = 'if (!(' + js + '))'; break; + case 'else if': js = 'else if (' + js + ')'; break; + case 'else': js = 'else'; break; + } + + return this.tok('code', js); + } + }, + + /** + * While. + */ + + "while": function() { + var captures; + if (captures = /^while +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('code', 'while (' + captures[1] + ')'); + } + }, + + /** + * Each. + */ + + each: function() { + var captures; + if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('each', captures[1]); + tok.key = captures[2] || '$index'; + tok.code = captures[3]; + return tok; + } + }, + + /** + * Code. + */ + + code: function() { + var captures; + if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var flags = captures[1]; + captures[1] = captures[2]; + var tok = this.tok('code', captures[1]); + tok.escape = flags[0] === '='; + tok.buffer = flags[0] === '=' || flags[1] === '='; + return tok; + } + }, + + /** + * Attributes. + */ + + attrs: function() { + if ('(' == this.input.charAt(0)) { + var index = this.indexOfDelimiters('(', ')') + , str = this.input.substr(1, index-1) + , tok = this.tok('attrs') + , len = str.length + , colons = this.colons + , states = ['key'] + , escapedAttr + , key = '' + , val = '' + , quote + , c + , p; + + function state(){ + return states[states.length - 1]; + } + + function interpolate(attr) { + return attr.replace(/#\{([^}]+)\}/g, function(_, expr){ + return quote + " + (" + expr + ") + " + quote; + }); + } + + this.consume(index + 1); + tok.attrs = {}; + tok.escaped = {}; + + function parse(c) { + var real = c; + // TODO: remove when people fix ":" + if (colons && ':' == c) c = '='; + switch (c) { + case ',': + case '\n': + switch (state()) { + case 'expr': + case 'array': + case 'string': + case 'object': + val += c; + break; + default: + states.push('key'); + val = val.trim(); + key = key.trim(); + if ('' == key) return; + key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); + tok.escaped[key] = escapedAttr; + tok.attrs[key] = '' == val + ? true + : interpolate(val); + key = val = ''; + } + break; + case '=': + switch (state()) { + case 'key char': + key += real; + break; + case 'val': + case 'expr': + case 'array': + case 'string': + case 'object': + val += real; + break; + default: + escapedAttr = '!' != p; + states.push('val'); + } + break; + case '(': + if ('val' == state() + || 'expr' == state()) states.push('expr'); + val += c; + break; + case ')': + if ('expr' == state() + || 'val' == state()) states.pop(); + val += c; + break; + case '{': + if ('val' == state()) states.push('object'); + val += c; + break; + case '}': + if ('object' == state()) states.pop(); + val += c; + break; + case '[': + if ('val' == state()) states.push('array'); + val += c; + break; + case ']': + if ('array' == state()) states.pop(); + val += c; + break; + case '"': + case "'": + switch (state()) { + case 'key': + states.push('key char'); + break; + case 'key char': + states.pop(); + break; + case 'string': + if (c == quote) states.pop(); + val += c; + break; + default: + states.push('string'); + val += c; + quote = c; + } + break; + case '': + break; + default: + switch (state()) { + case 'key': + case 'key char': + key += c; + break; + default: + val += c; + } + } + p = c; + } + + for (var i = 0; i < len; ++i) { + parse(str.charAt(i)); + } + + parse(','); + + if ('/' == this.input.charAt(0)) { + this.consume(1); + tok.selfClosing = true; + } + + return tok; + } + }, + + /** + * Indent | Outdent | Newline. + */ + + indent: function() { + var captures, re; + + // established regexp + if (this.indentRe) { + captures = this.indentRe.exec(this.input); + // determine regexp + } else { + // tabs + re = /^\n(\t*) */; + captures = re.exec(this.input); + + // spaces + if (captures && !captures[1].length) { + re = /^\n( *)/; + captures = re.exec(this.input); + } + + // established + if (captures && captures[1].length) this.indentRe = re; + } + + if (captures) { + var tok + , indents = captures[1].length; + + ++this.lineno; + this.consume(indents + 1); + + if (' ' == this.input[0] || '\t' == this.input[0]) { + throw new Error('Invalid indentation, you can use tabs or spaces but not both'); + } + + // blank line + if ('\n' == this.input[0]) return this.tok('newline'); + + // outdent + if (this.indentStack.length && indents < this.indentStack[0]) { + while (this.indentStack.length && this.indentStack[0] > indents) { + this.stash.push(this.tok('outdent')); + this.indentStack.shift(); + } + tok = this.stash.pop(); + // indent + } else if (indents && indents != this.indentStack[0]) { + this.indentStack.unshift(indents); + tok = this.tok('indent', indents); + // newline + } else { + tok = this.tok('newline'); + } + + return tok; + } + }, + + /** + * Pipe-less text consumed only when + * pipeless is true; + */ + + pipelessText: function() { + if (this.pipeless) { + if ('\n' == this.input[0]) return; + var i = this.input.indexOf('\n'); + if (-1 == i) i = this.input.length; + var str = this.input.substr(0, i); + this.consume(str.length); + return this.tok('text', str); + } + }, + + /** + * ':' + */ + + colon: function() { + return this.scan(/^: */, ':'); + }, + + /** + * Return the next token object, or those + * previously stashed by lookahead. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.stashed() + || this.next(); + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + next: function() { + return this.deferred() + || this.blank() + || this.eos() + || this.pipelessText() + || this.yield() + || this.doctype() + || this.interpolation() + || this["case"]() + || this.when() + || this["default"]() + || this["extends"]() + || this.append() + || this.prepend() + || this.block() + || this.include() + || this.mixin() + || this.call() + || this.conditional() + || this.each() + || this["while"]() + || this.assignment() + || this.tag() + || this.filter() + || this.code() + || this.id() + || this.className() + || this.attrs() + || this.indent() + || this.comment() + || this.colon() + || this.text(); + } +}; + +}); // module: lexer.js + +require.register("nodes/attrs.js", function(module, exports, require){ + +/*! + * Jade - nodes - Attrs + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'), + Block = require('./block'); + +/** + * Initialize a `Attrs` node. + * + * @api public + */ + +var Attrs = module.exports = function Attrs() { + this.attrs = []; +}; + +/** + * Inherit from `Node`. + */ + +Attrs.prototype = new Node; +Attrs.prototype.constructor = Attrs; + + +/** + * Set attribute `name` to `val`, keep in mind these become + * part of a raw js object literal, so to quote a value you must + * '"quote me"', otherwise or example 'user.name' is literal JavaScript. + * + * @param {String} name + * @param {String} val + * @param {Boolean} escaped + * @return {Tag} for chaining + * @api public + */ + +Attrs.prototype.setAttribute = function(name, val, escaped){ + this.attrs.push({ name: name, val: val, escaped: escaped }); + return this; +}; + +/** + * Remove attribute `name` when present. + * + * @param {String} name + * @api public + */ + +Attrs.prototype.removeAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + delete this.attrs[i]; + } + } +}; + +/** + * Get attribute value by `name`. + * + * @param {String} name + * @return {String} + * @api public + */ + +Attrs.prototype.getAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + return this.attrs[i].val; + } + } +}; + +}); // module: nodes/attrs.js + +require.register("nodes/block-comment.js", function(module, exports, require){ + +/*! + * Jade - nodes - BlockComment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `BlockComment` with the given `block`. + * + * @param {String} val + * @param {Block} block + * @param {Boolean} buffer + * @api public + */ + +var BlockComment = module.exports = function BlockComment(val, block, buffer) { + this.block = block; + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +BlockComment.prototype = new Node; +BlockComment.prototype.constructor = BlockComment; + +}); // module: nodes/block-comment.js + +require.register("nodes/block.js", function(module, exports, require){ + +/*! + * Jade - nodes - Block + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Block` with an optional `node`. + * + * @param {Node} node + * @api public + */ + +var Block = module.exports = function Block(node){ + this.nodes = []; + if (node) this.push(node); +}; + +/** + * Inherit from `Node`. + */ + +Block.prototype = new Node; +Block.prototype.constructor = Block; + + +/** + * Block flag. + */ + +Block.prototype.isBlock = true; + +/** + * Replace the nodes in `other` with the nodes + * in `this` block. + * + * @param {Block} other + * @api private + */ + +Block.prototype.replace = function(other){ + other.nodes = this.nodes; +}; + +/** + * Pust the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.push = function(node){ + return this.nodes.push(node); +}; + +/** + * Check if this block is empty. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.isEmpty = function(){ + return 0 == this.nodes.length; +}; + +/** + * Unshift the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.unshift = function(node){ + return this.nodes.unshift(node); +}; + +/** + * Return the "last" block, or the first `yield` node. + * + * @return {Block} + * @api private + */ + +Block.prototype.includeBlock = function(){ + var ret = this + , node; + + for (var i = 0, len = this.nodes.length; i < len; ++i) { + node = this.nodes[i]; + if (node.yield) return node; + else if (node.textOnly) continue; + else if (node.includeBlock) ret = node.includeBlock(); + else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); + } + + return ret; +}; + +/** + * Return a clone of this block. + * + * @return {Block} + * @api private + */ + +Block.prototype.clone = function(){ + var clone = new Block; + for (var i = 0, len = this.nodes.length; i < len; ++i) { + clone.push(this.nodes[i].clone()); + } + return clone; +}; + + +}); // module: nodes/block.js + +require.register("nodes/case.js", function(module, exports, require){ + +/*! + * Jade - nodes - Case + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Case` with `expr`. + * + * @param {String} expr + * @api public + */ + +var Case = exports = module.exports = function Case(expr, block){ + this.expr = expr; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Case.prototype = new Node; +Case.prototype.constructor = Case; + + +var When = exports.When = function When(expr, block){ + this.expr = expr; + this.block = block; + this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +When.prototype = new Node; +When.prototype.constructor = When; + + + +}); // module: nodes/case.js + +require.register("nodes/code.js", function(module, exports, require){ + +/*! + * Jade - nodes - Code + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Code` node with the given code `val`. + * Code may also be optionally buffered and escaped. + * + * @param {String} val + * @param {Boolean} buffer + * @param {Boolean} escape + * @api public + */ + +var Code = module.exports = function Code(val, buffer, escape) { + this.val = val; + this.buffer = buffer; + this.escape = escape; + if (val.match(/^ *else/)) this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +Code.prototype = new Node; +Code.prototype.constructor = Code; + +}); // module: nodes/code.js + +require.register("nodes/comment.js", function(module, exports, require){ + +/*! + * Jade - nodes - Comment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Comment` with the given `val`, optionally `buffer`, + * otherwise the comment may render in the output. + * + * @param {String} val + * @param {Boolean} buffer + * @api public + */ + +var Comment = module.exports = function Comment(val, buffer) { + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +Comment.prototype = new Node; +Comment.prototype.constructor = Comment; + +}); // module: nodes/comment.js + +require.register("nodes/doctype.js", function(module, exports, require){ + +/*! + * Jade - nodes - Doctype + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Doctype` with the given `val`. + * + * @param {String} val + * @api public + */ + +var Doctype = module.exports = function Doctype(val) { + this.val = val; +}; + +/** + * Inherit from `Node`. + */ + +Doctype.prototype = new Node; +Doctype.prototype.constructor = Doctype; + +}); // module: nodes/doctype.js + +require.register("nodes/each.js", function(module, exports, require){ + +/*! + * Jade - nodes - Each + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize an `Each` node, representing iteration + * + * @param {String} obj + * @param {String} val + * @param {String} key + * @param {Block} block + * @api public + */ + +var Each = module.exports = function Each(obj, val, key, block) { + this.obj = obj; + this.val = val; + this.key = key; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Each.prototype = new Node; +Each.prototype.constructor = Each; + +}); // module: nodes/each.js + +require.register("nodes/filter.js", function(module, exports, require){ + +/*! + * Jade - nodes - Filter + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , Block = require('./block'); + +/** + * Initialize a `Filter` node with the given + * filter `name` and `block`. + * + * @param {String} name + * @param {Block|Node} block + * @api public + */ + +var Filter = module.exports = function Filter(name, block, attrs) { + this.name = name; + this.block = block; + this.attrs = attrs; + this.isASTFilter = !block.nodes.every(function(node){ return node.isText }); +}; + +/** + * Inherit from `Node`. + */ + +Filter.prototype = new Node; +Filter.prototype.constructor = Filter; + +}); // module: nodes/filter.js + +require.register("nodes/index.js", function(module, exports, require){ + +/*! + * Jade - nodes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +exports.Node = require('./node'); +exports.Tag = require('./tag'); +exports.Code = require('./code'); +exports.Each = require('./each'); +exports.Case = require('./case'); +exports.Text = require('./text'); +exports.Block = require('./block'); +exports.Mixin = require('./mixin'); +exports.Filter = require('./filter'); +exports.Comment = require('./comment'); +exports.Literal = require('./literal'); +exports.BlockComment = require('./block-comment'); +exports.Doctype = require('./doctype'); + +}); // module: nodes/index.js + +require.register("nodes/literal.js", function(module, exports, require){ + +/*! + * Jade - nodes - Literal + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Literal` node with the given `str. + * + * @param {String} str + * @api public + */ + +var Literal = module.exports = function Literal(str) { + this.str = str + .replace(/\\/g, "\\\\") + .replace(/\n|\r\n/g, "\\n") + .replace(/'/g, "\\'"); +}; + +/** + * Inherit from `Node`. + */ + +Literal.prototype = new Node; +Literal.prototype.constructor = Literal; + + +}); // module: nodes/literal.js + +require.register("nodes/mixin.js", function(module, exports, require){ + +/*! + * Jade - nodes - Mixin + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'); + +/** + * Initialize a new `Mixin` with `name` and `block`. + * + * @param {String} name + * @param {String} args + * @param {Block} block + * @api public + */ + +var Mixin = module.exports = function Mixin(name, args, block, call){ + this.name = name; + this.args = args; + this.block = block; + this.attrs = []; + this.call = call; +}; + +/** + * Inherit from `Attrs`. + */ + +Mixin.prototype = new Attrs; +Mixin.prototype.constructor = Mixin; + + + +}); // module: nodes/mixin.js + +require.register("nodes/node.js", function(module, exports, require){ + +/*! + * Jade - nodes - Node + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize a `Node`. + * + * @api public + */ + +var Node = module.exports = function Node(){}; + +/** + * Clone this node (return itself) + * + * @return {Node} + * @api private + */ + +Node.prototype.clone = function(){ + return this; +}; + +}); // module: nodes/node.js + +require.register("nodes/tag.js", function(module, exports, require){ + +/*! + * Jade - nodes - Tag + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'), + Block = require('./block'), + inlineTags = require('../inline-tags'); + +/** + * Initialize a `Tag` node with the given tag `name` and optional `block`. + * + * @param {String} name + * @param {Block} block + * @api public + */ + +var Tag = module.exports = function Tag(name, block) { + this.name = name; + this.attrs = []; + this.block = block || new Block; +}; + +/** + * Inherit from `Attrs`. + */ + +Tag.prototype = new Attrs; +Tag.prototype.constructor = Tag; + + +/** + * Clone this tag. + * + * @return {Tag} + * @api private + */ + +Tag.prototype.clone = function(){ + var clone = new Tag(this.name, this.block.clone()); + clone.line = this.line; + clone.attrs = this.attrs; + clone.textOnly = this.textOnly; + return clone; +}; + +/** + * Check if this tag is an inline tag. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.isInline = function(){ + return ~inlineTags.indexOf(this.name); +}; + +/** + * Check if this tag's contents can be inlined. Used for pretty printing. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.canInline = function(){ + var nodes = this.block.nodes; + + function isInline(node){ + // Recurse if the node is a block + if (node.isBlock) return node.nodes.every(isInline); + return node.isText || (node.isInline && node.isInline()); + } + + // Empty tag + if (!nodes.length) return true; + + // Text-only or inline-only tag + if (1 == nodes.length) return isInline(nodes[0]); + + // Multi-line inline-only tag + if (this.block.nodes.every(isInline)) { + for (var i = 1, len = nodes.length; i < len; ++i) { + if (nodes[i-1].isText && nodes[i].isText) + return false; + } + return true; + } + + // Mixed tag + return false; +}; +}); // module: nodes/tag.js + +require.register("nodes/text.js", function(module, exports, require){ + +/*! + * Jade - nodes - Text + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Text` node with optional `line`. + * + * @param {String} line + * @api public + */ + +var Text = module.exports = function Text(line) { + this.val = ''; + if ('string' == typeof line) this.val = line; +}; + +/** + * Inherit from `Node`. + */ + +Text.prototype = new Node; +Text.prototype.constructor = Text; + + +/** + * Flag as text. + */ + +Text.prototype.isText = true; +}); // module: nodes/text.js + +require.register("parser.js", function(module, exports, require){ + +/*! + * Jade - Parser + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Lexer = require('./lexer') + , nodes = require('./nodes'); + +/** + * Initialize `Parser` with the given input `str` and `filename`. + * + * @param {String} str + * @param {String} filename + * @param {Object} options + * @api public + */ + +var Parser = exports = module.exports = function Parser(str, filename, options){ + this.input = str; + this.lexer = new Lexer(str, options); + this.filename = filename; + this.blocks = {}; + this.mixins = {}; + this.options = options; + this.contexts = [this]; +}; + +/** + * Tags that may not contain tags. + */ + +var textOnly = exports.textOnly = ['script', 'style']; + +/** + * Parser prototype. + */ + +Parser.prototype = { + + /** + * Push `parser` onto the context stack, + * or pop and return a `Parser`. + */ + + context: function(parser){ + if (parser) { + this.contexts.push(parser); + } else { + return this.contexts.pop(); + } + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.lexer.advance(); + }, + + /** + * Skip `n` tokens. + * + * @param {Number} n + * @api private + */ + + skip: function(n){ + while (n--) this.advance(); + }, + + /** + * Single token lookahead. + * + * @return {Object} + * @api private + */ + + peek: function() { + return this.lookahead(1); + }, + + /** + * Return lexer lineno. + * + * @return {Number} + * @api private + */ + + line: function() { + return this.lexer.lineno; + }, + + /** + * `n` token lookahead. + * + * @param {Number} n + * @return {Object} + * @api private + */ + + lookahead: function(n){ + return this.lexer.lookahead(n); + }, + + /** + * Parse input returning a string of js for evaluation. + * + * @return {String} + * @api public + */ + + parse: function(){ + var block = new nodes.Block, parser; + block.line = this.line(); + + while ('eos' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + + if (parser = this.extending) { + this.context(parser); + var ast = parser.parse(); + this.context(); + // hoist mixins + for (var name in this.mixins) + ast.unshift(this.mixins[name]); + return ast; + } + + return block; + }, + + /** + * Expect the given type, or throw an exception. + * + * @param {String} type + * @api private + */ + + expect: function(type){ + if (this.peek().type === type) { + return this.advance(); + } else { + throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); + } + }, + + /** + * Accept the given `type`. + * + * @param {String} type + * @api private + */ + + accept: function(type){ + if (this.peek().type === type) { + return this.advance(); + } + }, + + /** + * tag + * | doctype + * | mixin + * | include + * | filter + * | comment + * | text + * | each + * | code + * | yield + * | id + * | class + * | interpolation + */ + + parseExpr: function(){ + switch (this.peek().type) { + case 'tag': + return this.parseTag(); + case 'mixin': + return this.parseMixin(); + case 'block': + return this.parseBlock(); + case 'case': + return this.parseCase(); + case 'when': + return this.parseWhen(); + case 'default': + return this.parseDefault(); + case 'extends': + return this.parseExtends(); + case 'include': + return this.parseInclude(); + case 'doctype': + return this.parseDoctype(); + case 'filter': + return this.parseFilter(); + case 'comment': + return this.parseComment(); + case 'text': + return this.parseText(); + case 'each': + return this.parseEach(); + case 'code': + return this.parseCode(); + case 'call': + return this.parseCall(); + case 'interpolation': + return this.parseInterpolation(); + case 'yield': + this.advance(); + var block = new nodes.Block; + block.yield = true; + return block; + case 'id': + case 'class': + var tok = this.advance(); + this.lexer.defer(this.lexer.tok('tag', 'div')); + this.lexer.defer(tok); + return this.parseExpr(); + default: + throw new Error('unexpected token "' + this.peek().type + '"'); + } + }, + + /** + * Text + */ + + parseText: function(){ + var tok = this.expect('text') + , node = new nodes.Text(tok.val); + node.line = this.line(); + return node; + }, + + /** + * ':' expr + * | block + */ + + parseBlockExpansion: function(){ + if (':' == this.peek().type) { + this.advance(); + return new nodes.Block(this.parseExpr()); + } else { + return this.block(); + } + }, + + /** + * case + */ + + parseCase: function(){ + var val = this.expect('case').val + , node = new nodes.Case(val); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * when + */ + + parseWhen: function(){ + var val = this.expect('when').val + return new nodes.Case.When(val, this.parseBlockExpansion()); + }, + + /** + * default + */ + + parseDefault: function(){ + this.expect('default'); + return new nodes.Case.When('default', this.parseBlockExpansion()); + }, + + /** + * code + */ + + parseCode: function(){ + var tok = this.expect('code') + , node = new nodes.Code(tok.val, tok.buffer, tok.escape) + , block + , i = 1; + node.line = this.line(); + while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; + block = 'indent' == this.lookahead(i).type; + if (block) { + this.skip(i-1); + node.block = this.block(); + } + return node; + }, + + /** + * comment + */ + + parseComment: function(){ + var tok = this.expect('comment') + , node; + + if ('indent' == this.peek().type) { + node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); + } else { + node = new nodes.Comment(tok.val, tok.buffer); + } + + node.line = this.line(); + return node; + }, + + /** + * doctype + */ + + parseDoctype: function(){ + var tok = this.expect('doctype') + , node = new nodes.Doctype(tok.val); + node.line = this.line(); + return node; + }, + + /** + * filter attrs? text-block + */ + + parseFilter: function(){ + var block + , tok = this.expect('filter') + , attrs = this.accept('attrs'); + + this.lexer.pipeless = true; + block = this.parseTextBlock(); + this.lexer.pipeless = false; + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * tag ':' attrs? block + */ + + parseASTFilter: function(){ + var block + , tok = this.expect('tag') + , attrs = this.accept('attrs'); + + this.expect(':'); + block = this.block(); + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * each block + */ + + parseEach: function(){ + var tok = this.expect('each') + , node = new nodes.Each(tok.code, tok.val, tok.key); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * 'extends' name + */ + + parseExtends: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + if (!this.filename) + throw new Error('the "filename" option is required to extend templates'); + + var path = this.expect('extends').val.trim() + , dir = dirname(this.filename); + + var path = join(dir, path + '.jade') + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + + parser.blocks = this.blocks; + parser.contexts = this.contexts; + this.extending = parser; + + // TODO: null node + return new nodes.Literal(''); + }, + + /** + * 'block' name block + */ + + parseBlock: function(){ + var block = this.expect('block') + , mode = block.mode + , name = block.val.trim(); + + block = 'indent' == this.peek().type + ? this.block() + : new nodes.Block(new nodes.Literal('')); + + var prev = this.blocks[name]; + + if (prev) { + switch (prev.mode) { + case 'append': + block.nodes = block.nodes.concat(prev.nodes); + prev = block; + break; + case 'prepend': + block.nodes = prev.nodes.concat(block.nodes); + prev = block; + break; + } + } + + block.mode = mode; + return this.blocks[name] = prev || block; + }, + + /** + * include block? + */ + + parseInclude: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + var path = this.expect('include').val.trim() + , dir = dirname(this.filename); + + if (!this.filename) + throw new Error('the "filename" option is required to use includes'); + + // no extension + if (!~basename(path).indexOf('.')) { + path += '.jade'; + } + + // non-jade + if ('.jade' != path.substr(-5)) { + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8'); + return new nodes.Literal(str); + } + + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + parser.blocks = this.blocks; + parser.mixins = this.mixins; + + this.context(parser); + var ast = parser.parse(); + this.context(); + ast.filename = path; + + if ('indent' == this.peek().type) { + ast.includeBlock().push(this.block()); + } + + return ast; + }, + + /** + * call ident block + */ + + parseCall: function(){ + var tok = this.expect('call') + , name = tok.val + , args = tok.args + , mixin = new nodes.Mixin(name, args, new nodes.Block, true); + + this.tag(mixin); + if (mixin.block.isEmpty()) mixin.block = null; + return mixin; + }, + + /** + * mixin block + */ + + parseMixin: function(){ + var tok = this.expect('mixin') + , name = tok.val + , args = tok.args + , mixin; + + // definition + if ('indent' == this.peek().type) { + mixin = new nodes.Mixin(name, args, this.block(), false); + this.mixins[name] = mixin; + return mixin; + // call + } else { + return new nodes.Mixin(name, args, null, true); + } + }, + + /** + * indent (text | newline)* outdent + */ + + parseTextBlock: function(){ + var block = new nodes.Block; + block.line = this.line(); + var spaces = this.expect('indent').val; + if (null == this._spaces) this._spaces = spaces; + var indent = Array(spaces - this._spaces + 1).join(' '); + while ('outdent' != this.peek().type) { + switch (this.peek().type) { + case 'newline': + this.advance(); + break; + case 'indent': + this.parseTextBlock().nodes.forEach(function(node){ + block.push(node); + }); + break; + default: + var text = new nodes.Text(indent + this.advance().val); + text.line = this.line(); + block.push(text); + } + } + + if (spaces == this._spaces) this._spaces = null; + this.expect('outdent'); + return block; + }, + + /** + * indent expr* outdent + */ + + block: function(){ + var block = new nodes.Block; + block.line = this.line(); + this.expect('indent'); + while ('outdent' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + this.expect('outdent'); + return block; + }, + + /** + * interpolation (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseInterpolation: function(){ + var tok = this.advance(); + var tag = new nodes.Tag(tok.val); + tag.buffer = true; + return this.tag(tag); + }, + + /** + * tag (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseTag: function(){ + // ast-filter look-ahead + var i = 2; + if ('attrs' == this.lookahead(i).type) ++i; + if (':' == this.lookahead(i).type) { + if ('indent' == this.lookahead(++i).type) { + return this.parseASTFilter(); + } + } + + var tok = this.advance() + , tag = new nodes.Tag(tok.val); + + tag.selfClosing = tok.selfClosing; + + return this.tag(tag); + }, + + /** + * Parse tag. + */ + + tag: function(tag){ + var dot; + + tag.line = this.line(); + + // (attrs | class | id)* + out: + while (true) { + switch (this.peek().type) { + case 'id': + case 'class': + var tok = this.advance(); + tag.setAttribute(tok.type, "'" + tok.val + "'"); + continue; + case 'attrs': + var tok = this.advance() + , obj = tok.attrs + , escaped = tok.escaped + , names = Object.keys(obj); + + if (tok.selfClosing) tag.selfClosing = true; + + for (var i = 0, len = names.length; i < len; ++i) { + var name = names[i] + , val = obj[name]; + tag.setAttribute(name, val, escaped[name]); + } + continue; + default: + break out; + } + } + + // check immediate '.' + if ('.' == this.peek().val) { + dot = tag.textOnly = true; + this.advance(); + } + + // (text | code | ':')? + switch (this.peek().type) { + case 'text': + tag.block.push(this.parseText()); + break; + case 'code': + tag.code = this.parseCode(); + break; + case ':': + this.advance(); + tag.block = new nodes.Block; + tag.block.push(this.parseExpr()); + break; + } + + // newline* + while ('newline' == this.peek().type) this.advance(); + + tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); + + // script special-case + if ('script' == tag.name) { + var type = tag.getAttribute('type'); + if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { + tag.textOnly = false; + } + } + + // block? + if ('indent' == this.peek().type) { + if (tag.textOnly) { + this.lexer.pipeless = true; + tag.block = this.parseTextBlock(); + this.lexer.pipeless = false; + } else { + var block = this.block(); + if (tag.block) { + for (var i = 0, len = block.nodes.length; i < len; ++i) { + tag.block.push(block.nodes[i]); + } + } else { + tag.block = block; + } + } + } + + return tag; + } +}; + +}); // module: parser.js + +require.register("runtime.js", function(module, exports, require){ + +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; + +}); // module: runtime.js + +require.register("self-closing.js", function(module, exports, require){ + +/*! + * Jade - self closing tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'meta' + , 'img' + , 'link' + , 'input' + , 'source' + , 'area' + , 'base' + , 'col' + , 'br' + , 'hr' +]; +}); // module: self-closing.js + +require.register("utils.js", function(module, exports, require){ + +/*! + * Jade - utils + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Convert interpolation in the given string to JavaScript. + * + * @param {String} str + * @return {String} + * @api private + */ + +var interpolate = exports.interpolate = function(str){ + return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){ + return escape + ? str + : "' + " + + ('!' == flag ? '' : 'escape') + + "((interp = " + code.replace(/\\'/g, "'") + + ") == null ? '' : interp) + '"; + }); +}; + +/** + * Escape single quotes in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +var escape = exports.escape = function(str) { + return str.replace(/'/g, "\\'"); +}; + +/** + * Interpolate, and escape the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.text = function(str){ + return interpolate(escape(str)); +}; +}); // module: utils.js + +window.jade = require("jade"); +})(); diff --git a/node_modules/mocha/node_modules/jade/jade.md b/node_modules/mocha/node_modules/jade/jade.md new file mode 100644 index 00000000..051dc031 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/jade.md @@ -0,0 +1,510 @@ + +# Jade + + The jade template engine for node.js + +## Synopsis + + jade [-h|--help] [-v|--version] [-o|--obj STR] + [-O|--out DIR] [-p|--path PATH] [-P|--pretty] + [-c|--client] [-D|--no-debug] + +## Examples + + translate jade the templates dir + + $ jade templates + + create {foo,bar}.html + + $ jade {foo,bar}.jade + + jade over stdio + + $ jade < my.jade > my.html + + jade over s + + $ echo "h1 Jade!" | jade + + foo, bar dirs rendering to /tmp + + $ jade foo bar --out /tmp + + compile client-side templates without debugging + instrumentation, making the output javascript + very light-weight. This requires runtime.js + in your projects. + + $ jade --client --no-debug < my.jade + +## Tags + + Tags are simply nested via whitespace, closing + tags defined for you. These indents are called "blocks". + + ul + li + a Foo + li + a Bar + + You may have several tags in one "block": + + ul + li + a Foo + a Bar + a Baz + +## Self-closing Tags + + Some tags are flagged as self-closing by default, such + as `meta`, `link`, and so on. To explicitly self-close + a tag simply append the `/` character: + + foo/ + foo(bar='baz')/ + + Would yield: + + + + +## Attributes + + Tag attributes look similar to HTML, however + the values are regular JavaScript, here are + some examples: + + a(href='google.com') Google + a(class='button', href='google.com') Google + + As mentioned the attribute values are just JavaScript, + this means ternary operations and other JavaScript expressions + work just fine: + + body(class=user.authenticated ? 'authenticated' : 'anonymous') + a(href=user.website || 'http://google.com') + + Multiple lines work too: + + input(type='checkbox', + name='agreement', + checked) + + Multiple lines without the comma work fine: + + input(type='checkbox' + name='agreement' + checked) + + Funky whitespace? fine: + + input( + type='checkbox' + name='agreement' + checked) + +## Boolean attributes + + Boolean attributes are mirrored by Jade, and accept + bools, aka _true_ or _false_. When no value is specified + _true_ is assumed. For example: + + input(type="checkbox", checked) + // => "" + + For example if the checkbox was for an agreement, perhaps `user.agreed` + was _true_ the following would also output 'checked="checked"': + + input(type="checkbox", checked=user.agreed) + +## Class attributes + + The _class_ attribute accepts an array of classes, + this can be handy when generated from a javascript + function etc: + + classes = ['foo', 'bar', 'baz'] + a(class=classes) + // => "" + +## Class literal + + Classes may be defined using a ".CLASSNAME" syntax: + + .button + // => "
        " + + Or chained: + + .large.button + // => "
        " + + The previous defaulted to divs, however you + may also specify the tag type: + + h1.title My Title + // => "

        My Title

        " + +## Id literal + + Much like the class literal there's an id literal: + + #user-1 + // => "
        " + + Again we may specify the tag as well: + + ul#menu + li: a(href='/home') Home + li: a(href='/store') Store + li: a(href='/contact') Contact + + Finally all of these may be used in any combination, + the following are all valid tags: + + a.button#contact(style: 'color: red') Contact + a.button(style: 'color: red')#contact Contact + a(style: 'color: red').button#contact Contact + +## Block expansion + + Jade supports the concept of "block expansion", in which + using a trailing ":" after a tag will inject a block: + + ul + li: a Foo + li: a Bar + li: a Baz + +## Text + + Arbitrary text may follow tags: + + p Welcome to my site + + yields: + +

        Welcome to my site

        + +## Pipe text + + Another form of text is "pipe" text. Pipes act + as the text margin for large bodies of text. + + p + | This is a large + | body of text for + | this tag. + | + | Nothing too + | exciting. + + yields: + +

        This is a large + body of text for + this tag. + + Nothing too + exciting. +

        + + Using pipes we can also specify regular Jade tags + within the text: + + p + | Click to visit + a(href='http://google.com') Google + | if you want. + +## Text only tags + + As an alternative to pipe text you may add + a trailing "." to indicate that the block + contains nothing but plain-text, no tags: + + p. + This is a large + body of text for + this tag. + + Nothing too + exciting. + + Some tags are text-only by default, for example + _script_, _textarea_, and _style_ tags do not + contain nested HTML so Jade implies the trailing ".": + + script + if (foo) { + bar(); + } + + style + body { + padding: 50px; + font: 14px Helvetica; + } + +## Template script tags + + Sometimes it's useful to define HTML in script + tags using Jade, typically for client-side templates. + + To do this simply give the _script_ tag an arbitrary + _type_ attribute such as _text/x-template_: + + script(type='text/template') + h1 Look! + p Jade still works in here! + +## Interpolation + + Both plain-text and piped-text support interpolation, + which comes in two forms, escapes and non-escaped. The + following will output the _user.name_ in the paragraph + but HTML within it will be escaped to prevent XSS attacks: + + p Welcome #{user.name} + + The following syntax is identical however it will _not_ escape + HTML, and should only be used with strings that you trust: + + p Welcome !{user.name} + +## Inline HTML + + Sometimes constructing small inline snippets of HTML + in Jade can be annoying, luckily we can add plain + HTML as well: + + p Welcome #{user.name} + +## Code + + To buffer output with Jade simply use _=_ at the beginning + of a line or after a tag. This method escapes any HTML + present in the string. + + p= user.description + + To buffer output unescaped use the _!=_ variant, but again + be careful of XSS. + + p!= user.description + + The final way to mess with JavaScript code in Jade is the unbuffered + _-_, which can be used for conditionals, defining variables etc: + + - var user = { description: 'foo bar baz' } + #user + - if (user.description) { + h2 Description + p.description= user.description + - } + + When compiled blocks are wrapped in anonymous functions, so the + following is also valid, without braces: + + - var user = { description: 'foo bar baz' } + #user + - if (user.description) + h2 Description + p.description= user.description + + If you really want you could even use `.forEach()` and others: + + - users.forEach(function(user){ + .user + h2= user.name + p User #{user.name} is #{user.age} years old + - }) + + Taking this further Jade provides some syntax for conditionals, + iteration, switch statements etc. Let's look at those next! + +## Assignment + + Jade's first-class assignment is simple, simply use the _=_ + operator and Jade will _var_ it for you. The following are equivalent: + + - var user = { name: 'tobi' } + user = { name: 'tobi' } + +## Conditionals + + Jade's first-class conditional syntax allows for optional + parenthesis, and you may now omit the leading _-_ otherwise + it's identical, still just regular javascript: + + user = { description: 'foo bar baz' } + #user + if user.description + h2 Description + p.description= user.description + + Jade provides the negated version, _unless_ as well, the following + are equivalent: + + - if (!(user.isAnonymous)) + p You're logged in as #{user.name} + + unless user.isAnonymous + p You're logged in as #{user.name} + +## Iteration + + JavaScript's _for_ loops don't look very declarative, so Jade + also provides its own _for_ loop construct, aliased as _each_: + + for user in users + .user + h2= user.name + p user #{user.name} is #{user.age} year old + + As mentioned _each_ is identical: + + each user in users + .user + h2= user.name + + If necessary the index is available as well: + + for user, i in users + .user(class='user-#{i}') + h2= user.name + + Remember, it's just JavaScript: + + ul#letters + for letter in ['a', 'b', 'c'] + li= letter + +## Mixins + + Mixins provide a way to define jade "functions" which "mix in" + their contents when called. This is useful for abstracting + out large fragments of Jade. + + The simplest possible mixin which accepts no arguments might + look like this: + + mixin hello + p Hello + + You use a mixin by placing `+` before the name: + + +hello + + For something a little more dynamic, mixins can take + arguments, the mixin itself is converted to a javascript + function internally: + + mixin hello(user) + p Hello #{user} + + +hello('Tobi') + + Yields: + +

        Hello Tobi

        + + Mixins may optionally take blocks, when a block is passed + its contents becomes the implicit `block` argument. For + example here is a mixin passed a block, and also invoked + without passing a block: + + mixin article(title) + .article + .article-wrapper + h1= title + if block + block + else + p No content provided + + +article('Hello world') + + +article('Hello world') + p This is my + p Amazing article + + yields: + +
        +
        +

        Hello world

        +

        No content provided

        +
        +
        + +
        +
        +

        Hello world

        +

        This is my

        +

        Amazing article

        +
        +
        + + Mixins can even take attributes, just like a tag. When + attributes are passed they become the implicit `attributes` + argument. Individual attributes can be accessed just like + normal object properties: + + mixin centered + .centered(class=attributes.class) + block + + +centered.bold Hello world + + +centered.red + p This is my + p Amazing article + + yields: + +
        Hello world
        +
        +

        This is my

        +

        Amazing article

        +
        + + If you use `attributes` directly, *all* passed attributes + get used: + + mixin link + a.menu(attributes) + block + + +link.highlight(href='#top') Top + +link#sec1.plain(href='#section1') Section 1 + +link#sec2.plain(href='#section2') Section 2 + + yields: + + Top + Section 1 + Section 2 + + If you pass arguments, they must directly follow the mixin: + + mixin list(arr) + if block + .title + block + ul(attributes) + each item in arr + li= item + + +list(['foo', 'bar', 'baz'])(id='myList', class='bold') + + yields: + +
          +
        • foo
        • +
        • bar
        • +
        • baz
        • +
        diff --git a/node_modules/mocha/node_modules/jade/jade.min.js b/node_modules/mocha/node_modules/jade/jade.min.js new file mode 100644 index 00000000..72e4535e --- /dev/null +++ b/node_modules/mocha/node_modules/jade/jade.min.js @@ -0,0 +1,2 @@ +(function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');return mod.exports||(mod.exports={},mod.call(mod.exports,mod,mod.exports,require.relative(path))),mod.exports}require.modules={},require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&®||require.modules[index]&&index||orig},require.register=function(path,fn){require.modules[path]=fn},require.relative=function(parent){return function(p){if("."!=p.charAt(0))return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i",this.doctype=doctype,this.terse="5"==name||"html"==name,this.xml=0==this.doctype.indexOf("1&&!escape&&block.nodes[0].isText&&block.nodes[1].isText&&this.prettyIndent(1,!0);for(var i=0;i0&&!escape&&block.nodes[i].isText&&block.nodes[i-1].isText&&this.prettyIndent(1,!1),this.visit(block.nodes[i]),block.nodes[i+1]&&block.nodes[i].isText&&block.nodes[i+1].isText&&this.buffer("\\n")},visitDoctype:function(doctype){doctype&&(doctype.val||!this.doctype)&&this.setDoctype(doctype.val||"default"),this.doctype&&this.buffer(this.doctype),this.hasCompiledDoctype=!0},visitMixin:function(mixin){var name=mixin.name.replace(/-/g,"_")+"_mixin",args=mixin.args||"",block=mixin.block,attrs=mixin.attrs,pp=this.pp;if(mixin.call){pp&&this.buf.push("__indent.push('"+Array(this.indents+1).join(" ")+"');");if(block||attrs.length){this.buf.push(name+".call({");if(block){this.buf.push("block: function(){"),this.parentIndents++;var _indents=this.indents;this.indents=0,this.visit(mixin.block),this.indents=_indents,this.parentIndents--,attrs.length?this.buf.push("},"):this.buf.push("}")}if(attrs.length){var val=this.attrs(attrs);val.inherits?this.buf.push("attributes: merge({"+val.buf+"}, attributes), escaped: merge("+val.escaped+", escaped, true)"):this.buf.push("attributes: {"+val.buf+"}, escaped: "+val.escaped)}args?this.buf.push("}, "+args+");"):this.buf.push("});")}else this.buf.push(name+"("+args+");");pp&&this.buf.push("__indent.pop();")}else this.buf.push("var "+name+" = function("+args+"){"),this.buf.push("var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};"),this.parentIndents++,this.visit(block),this.parentIndents--,this.buf.push("};")},visitTag:function(tag){this.indents++;var name=tag.name,pp=this.pp;tag.buffer&&(name="' + ("+name+") + '"),this.hasCompiledTag||(!this.hasCompiledDoctype&&"html"==name&&this.visitDoctype(),this.hasCompiledTag=!0),pp&&!tag.isInline()&&this.prettyIndent(0,!0),(~selfClosing.indexOf(name)||tag.selfClosing)&&!this.xml?(this.buffer("<"+name),this.visitAttributes(tag.attrs),this.terse?this.buffer(">"):this.buffer("/>")):(tag.attrs.length?(this.buffer("<"+name),tag.attrs.length&&this.visitAttributes(tag.attrs),this.buffer(">")):this.buffer("<"+name+">"),tag.code&&this.visitCode(tag.code),this.escape="pre"==tag.name,this.visit(tag.block),pp&&!tag.isInline()&&"pre"!=tag.name&&!tag.canInline()&&this.prettyIndent(0,!0),this.buffer("")),this.indents--},visitFilter:function(filter){var fn=filters[filter.name];if(!fn)throw filter.isASTFilter?new Error('unknown ast filter "'+filter.name+':"'):new Error('unknown filter ":'+filter.name+'"');if(filter.isASTFilter)this.buf.push(fn(filter.block,this,filter.attrs));else{var text=filter.block.nodes.map(function(node){return node.val}).join("\n");filter.attrs=filter.attrs||{},filter.attrs.filename=this.options.filename,this.buffer(utils.text(fn(text,filter.attrs)))}},visitText:function(text){text=utils.text(text.val.replace(/\\/g,"\\\\")),this.escape&&(text=escape(text)),this.buffer(text)},visitComment:function(comment){if(!comment.buffer)return;this.pp&&this.prettyIndent(1,!0),this.buffer("")},visitBlockComment:function(comment){if(!comment.buffer)return;0==comment.val.trim().indexOf("if")?(this.buffer("")):(this.buffer(""))},visitCode:function(code){if(code.buffer){var val=code.val.trimLeft();this.buf.push("var __val__ = "+val),val='null == __val__ ? "" : __val__',code.escape&&(val="escape("+val+")"),this.buf.push("buf.push("+val+");")}else this.buf.push(code.val);code.block&&(code.buffer||this.buf.push("{"),this.visit(code.block),code.buffer||this.buf.push("}"))},visitEach:function(each){this.buf.push("// iterate "+each.obj+"\n"+";(function(){\n"+" if ('number' == typeof "+each.obj+".length) {\n"+" for (var "+each.key+" = 0, $$l = "+each.obj+".length; "+each.key+" < $$l; "+each.key+"++) {\n"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n } else {\n for (var "+each.key+" in "+each.obj+") {\n"+" if ("+each.obj+".hasOwnProperty("+each.key+")){"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n"),this.buf.push(" }\n }\n}).call(this);\n")},visitAttributes:function(attrs){var val=this.attrs(attrs);val.inherits?this.buf.push("buf.push(attrs(merge({ "+val.buf+" }, attributes), merge("+val.escaped+", escaped, true)));"):val.constant?(eval("var buf={"+val.buf+"};"),this.buffer(runtime.attrs(buf,JSON.parse(val.escaped)),!0)):this.buf.push("buf.push(attrs({ "+val.buf+" }, "+val.escaped+"));")},attrs:function(attrs){var buf=[],classes=[],escaped={},constant=attrs.every(function(attr){return isConstant(attr.val)}),inherits=!1;return this.terse&&buf.push("terse: true"),attrs.forEach(function(attr){if(attr.name=="attributes")return inherits=!0;escaped[attr.name]=attr.escaped;if(attr.name=="class")classes.push("("+attr.val+")");else{var pair="'"+attr.name+"':("+attr.val+")";buf.push(pair)}}),classes.length&&(classes=classes.join(" + ' ' + "),buf.push("class: "+classes)),{buf:buf.join(", ").replace("class:",'"class":'),escaped:JSON.stringify(escaped),inherits:inherits,constant:constant}}};function isConstant(val){if(/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))return!0;if(!isNaN(Number(val)))return!0;var matches;return(matches=/^ *\[(.*)\] *$/.exec(val))?matches[1].split(",").every(isConstant):!1}function escape(html){return String(html).replace(/&(?!\w+;)/g,"&").replace(//g,">").replace(/"/g,""")}}),require.register("doctypes.js",function(module,exports,require){module.exports={5:"","default":"",xml:'',transitional:'',strict:'',frameset:'',1.1:'',basic:'',mobile:''}}),require.register("filters.js",function(module,exports,require){module.exports={cdata:function(str){return""},sass:function(str){str=str.replace(/\\n/g,"\n");var sass=require("sass").render(str).replace(/\n/g,"\\n");return'"},stylus:function(str,options){var ret;str=str.replace(/\\n/g,"\n");var stylus=require("stylus");return stylus(str,options).render(function(err,css){if(err)throw err;ret=css.replace(/\n/g,"\\n")}),'"},less:function(str){var ret;return str=str.replace(/\\n/g,"\n"),require("less").render(str,function(err,css){if(err)throw err;ret='"}),ret},markdown:function(str){var md;try{md=require("markdown")}catch(err){try{md=require("discount")}catch(err){try{md=require("markdown-js")}catch(err){try{md=require("marked")}catch(err){throw new Error("Cannot find markdown library, install markdown, discount, or marked.")}}}}return str=str.replace(/\\n/g,"\n"),md.parse(str).replace(/\n/g,"\\n").replace(/'/g,"'")},coffeescript:function(str){str=str.replace(/\\n/g,"\n");var js=require("coffee-script").compile(str).replace(/\\/g,"\\\\").replace(/\n/g,"\\n");return'"}}}),require.register("inline-tags.js",function(module,exports,require){module.exports=["a","abbr","acronym","b","br","code","em","font","i","img","ins","kbd","map","samp","small","span","strong","sub","sup"]}),require.register("jade.js",function(module,exports,require){var Parser=require("./parser"),Lexer=require("./lexer"),Compiler=require("./compiler"),runtime=require("./runtime");exports.version="0.26.1",exports.selfClosing=require("./self-closing"),exports.doctypes=require("./doctypes"),exports.filters=require("./filters"),exports.utils=require("./utils"),exports.Compiler=Compiler,exports.Parser=Parser,exports.Lexer=Lexer,exports.nodes=require("./nodes"),exports.runtime=runtime,exports.cache={};function parse(str,options){try{var parser=new Parser(str,options.filename,options),compiler=new(options.compiler||Compiler)(parser.parse(),options),js=compiler.compile();return options.debug&&console.error("\nCompiled Function:\n\n%s",js.replace(/^/gm," ")),"var buf = [];\n"+(options.self?"var self = locals || {};\n"+js:"with (locals || {}) {\n"+js+"\n}\n")+'return buf.join("");'}catch(err){parser=parser.context(),runtime.rethrow(err,parser.filename,parser.lexer.lineno)}}exports.compile=function(str,options){var options=options||{},client=options.client,filename=options.filename?JSON.stringify(options.filename):"undefined",fn;return options.compileDebug!==!1?fn=["var __jade = [{ lineno: 1, filename: "+filename+" }];","try {",parse(String(str),options),"} catch (err) {"," rethrow(err, __jade[0].filename, __jade[0].lineno);","}"].join("\n"):fn=parse(String(str),options),client&&(fn="attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n"+fn),fn=new Function("locals, attrs, escape, rethrow, merge",fn),client?fn:function(locals){return fn(locals,runtime.attrs,runtime.escape,runtime.rethrow,runtime.merge)}},exports.render=function(str,options,fn){"function"==typeof options&&(fn=options,options={});if(options.cache&&!options.filename)return fn(new Error('the "filename" option is required for caching'));try{var path=options.filename,tmpl=options.cache?exports.cache[path]||(exports.cache[path]=exports.compile(str,options)):exports.compile(str,options);fn(null,tmpl(options))}catch(err){fn(err)}},exports.renderFile=function(path,options,fn){var key=path+":string";"function"==typeof options&&(fn=options,options={});try{options.filename=path;var str=options.cache?exports.cache[key]||(exports.cache[key]=fs.readFileSync(path,"utf8")):fs.readFileSync(path,"utf8");exports.render(str,options,fn)}catch(err){fn(err)}},exports.__express=exports.renderFile}),require.register("lexer.js",function(module,exports,require){var Lexer=module.exports=function Lexer(str,options){options=options||{},this.input=str.replace(/\r\n|\r/g,"\n"),this.colons=options.colons,this.deferredTokens=[],this.lastIndents=0,this.lineno=1,this.stash=[],this.indentStack=[],this.indentRe=null,this.pipeless=!1};Lexer.prototype={tok:function(type,val){return{type:type,line:this.lineno,val:val}},consume:function(len){this.input=this.input.substr(len)},scan:function(regexp,type){var captures;if(captures=regexp.exec(this.input))return this.consume(captures[0].length),this.tok(type,captures[1])},defer:function(tok){this.deferredTokens.push(tok)},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-->0)this.stash.push(this.next());return this.stash[--n]},indexOfDelimiters:function(start,end){var str=this.input,nstart=0,nend=0,pos=0;for(var i=0,len=str.length;iindents)this.stash.push(this.tok("outdent")),this.indentStack.shift();tok=this.stash.pop()}else indents&&indents!=this.indentStack[0]?(this.indentStack.unshift(indents),tok=this.tok("indent",indents)):tok=this.tok("newline");return tok}},pipelessText:function(){if(this.pipeless){if("\n"==this.input[0])return;var i=this.input.indexOf("\n");-1==i&&(i=this.input.length);var str=this.input.substr(0,i);return this.consume(str.length),this.tok("text",str)}},colon:function(){return this.scan(/^: */,":")},advance:function(){return this.stashed()||this.next()},next:function(){return this.deferred()||this.blank()||this.eos()||this.pipelessText()||this.yield()||this.doctype()||this.interpolation()||this["case"]()||this.when()||this["default"]()||this["extends"]()||this.append()||this.prepend()||this.block()||this.include()||this.mixin()||this.call()||this.conditional()||this.each()||this["while"]()||this.assignment()||this.tag()||this.filter()||this.code()||this.id()||this.className()||this.attrs()||this.indent()||this.comment()||this.colon()||this.text()}}}),require.register("nodes/attrs.js",function(module,exports,require){var Node=require("./node"),Block=require("./block"),Attrs=module.exports=function Attrs(){this.attrs=[]};Attrs.prototype=new Node,Attrs.prototype.constructor=Attrs,Attrs.prototype.setAttribute=function(name,val,escaped){return this.attrs.push({name:name,val:val,escaped:escaped}),this},Attrs.prototype.removeAttribute=function(name){for(var i=0,len=this.attrs.length;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err}}),require.register("self-closing.js",function(module,exports,require){module.exports=["meta","img","link","input","source","area","base","col","br","hr"]}),require.register("utils.js",function(module,exports,require){var interpolate=exports.interpolate=function(str){return str.replace(/(\\)?([#!]){(.*?)}/g,function(str,escape,flag,code){return escape?str:"' + "+("!"==flag?"":"escape")+"((interp = "+code.replace(/\\'/g,"'")+") == null ? '' : interp) + '"})},escape=exports.escape=function(str){return str.replace(/'/g,"\\'")};exports.text=function(str){return interpolate(escape(str))}}),window.jade=require("jade")})(); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/compiler.js b/node_modules/mocha/node_modules/jade/lib/compiler.js new file mode 100644 index 00000000..516ac83d --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/compiler.js @@ -0,0 +1,642 @@ + +/*! + * Jade - Compiler + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var nodes = require('./nodes') + , filters = require('./filters') + , doctypes = require('./doctypes') + , selfClosing = require('./self-closing') + , runtime = require('./runtime') + , utils = require('./utils'); + +// if browser +// +// if (!Object.keys) { +// Object.keys = function(obj){ +// var arr = []; +// for (var key in obj) { +// if (obj.hasOwnProperty(key)) { +// arr.push(key); +// } +// } +// return arr; +// } +// } +// +// if (!String.prototype.trimLeft) { +// String.prototype.trimLeft = function(){ +// return this.replace(/^\s+/, ''); +// } +// } +// +// end + + +/** + * Initialize `Compiler` with the given `node`. + * + * @param {Node} node + * @param {Object} options + * @api public + */ + +var Compiler = module.exports = function Compiler(node, options) { + this.options = options = options || {}; + this.node = node; + this.hasCompiledDoctype = false; + this.hasCompiledTag = false; + this.pp = options.pretty || false; + this.debug = false !== options.compileDebug; + this.indents = 0; + this.parentIndents = 0; + if (options.doctype) this.setDoctype(options.doctype); +}; + +/** + * Compiler prototype. + */ + +Compiler.prototype = { + + /** + * Compile parse tree to JavaScript. + * + * @api public + */ + + compile: function(){ + this.buf = ['var interp;']; + if (this.pp) this.buf.push("var __indent = [];"); + this.lastBufferedIdx = -1; + this.visit(this.node); + return this.buf.join('\n'); + }, + + /** + * Sets the default doctype `name`. Sets terse mode to `true` when + * html 5 is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {string} name + * @api public + */ + + setDoctype: function(name){ + var doctype = doctypes[(name || 'default').toLowerCase()]; + doctype = doctype || ''; + this.doctype = doctype; + this.terse = '5' == name || 'html' == name; + this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) + this.prettyIndent(1, true); + + for (var i = 0; i < len; ++i) { + // Pretty print text + if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) + this.prettyIndent(1, false); + + this.visit(block.nodes[i]); + // Multiple text nodes are separated by newlines + if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) + this.buffer('\\n'); + } + }, + + /** + * Visit `doctype`. Sets terse mode to `true` when html 5 + * is used, causing self-closing tags to end with ">" vs "/>", + * and boolean attributes are not mirrored. + * + * @param {Doctype} doctype + * @api public + */ + + visitDoctype: function(doctype){ + if (doctype && (doctype.val || !this.doctype)) { + this.setDoctype(doctype.val || 'default'); + } + + if (this.doctype) this.buffer(this.doctype); + this.hasCompiledDoctype = true; + }, + + /** + * Visit `mixin`, generating a function that + * may be called within the template. + * + * @param {Mixin} mixin + * @api public + */ + + visitMixin: function(mixin){ + var name = mixin.name.replace(/-/g, '_') + '_mixin' + , args = mixin.args || '' + , block = mixin.block + , attrs = mixin.attrs + , pp = this.pp; + + if (mixin.call) { + if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") + if (block || attrs.length) { + + this.buf.push(name + '.call({'); + + if (block) { + this.buf.push('block: function(){'); + + // Render block with no indents, dynamically added when rendered + this.parentIndents++; + var _indents = this.indents; + this.indents = 0; + this.visit(mixin.block); + this.indents = _indents; + this.parentIndents--; + + if (attrs.length) { + this.buf.push('},'); + } else { + this.buf.push('}'); + } + } + + if (attrs.length) { + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push('attributes: merge({' + val.buf + + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); + } else { + this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); + } + } + + if (args) { + this.buf.push('}, ' + args + ');'); + } else { + this.buf.push('});'); + } + + } else { + this.buf.push(name + '(' + args + ');'); + } + if (pp) this.buf.push("__indent.pop();") + } else { + this.buf.push('var ' + name + ' = function(' + args + '){'); + this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); + this.parentIndents++; + this.visit(block); + this.parentIndents--; + this.buf.push('};'); + } + }, + + /** + * Visit `tag` buffering tag markup, generating + * attributes, visiting the `tag`'s code and block. + * + * @param {Tag} tag + * @api public + */ + + visitTag: function(tag){ + this.indents++; + var name = tag.name + , pp = this.pp; + + if (tag.buffer) name = "' + (" + name + ") + '"; + + if (!this.hasCompiledTag) { + if (!this.hasCompiledDoctype && 'html' == name) { + this.visitDoctype(); + } + this.hasCompiledTag = true; + } + + // pretty print + if (pp && !tag.isInline()) + this.prettyIndent(0, true); + + if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { + this.buffer('<' + name); + this.visitAttributes(tag.attrs); + this.terse + ? this.buffer('>') + : this.buffer('/>'); + } else { + // Optimize attributes buffering + if (tag.attrs.length) { + this.buffer('<' + name); + if (tag.attrs.length) this.visitAttributes(tag.attrs); + this.buffer('>'); + } else { + this.buffer('<' + name + '>'); + } + if (tag.code) this.visitCode(tag.code); + this.escape = 'pre' == tag.name; + this.visit(tag.block); + + // pretty print + if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) + this.prettyIndent(0, true); + + this.buffer(''); + } + this.indents--; + }, + + /** + * Visit `filter`, throwing when the filter does not exist. + * + * @param {Filter} filter + * @api public + */ + + visitFilter: function(filter){ + var fn = filters[filter.name]; + + // unknown filter + if (!fn) { + if (filter.isASTFilter) { + throw new Error('unknown ast filter "' + filter.name + ':"'); + } else { + throw new Error('unknown filter ":' + filter.name + '"'); + } + } + + if (filter.isASTFilter) { + this.buf.push(fn(filter.block, this, filter.attrs)); + } else { + var text = filter.block.nodes.map(function(node){ return node.val }).join('\n'); + filter.attrs = filter.attrs || {}; + filter.attrs.filename = this.options.filename; + this.buffer(utils.text(fn(text, filter.attrs))); + } + }, + + /** + * Visit `text` node. + * + * @param {Text} text + * @api public + */ + + visitText: function(text){ + text = utils.text(text.val.replace(/\\/g, '\\\\')); + if (this.escape) text = escape(text); + this.buffer(text); + }, + + /** + * Visit a `comment`, only buffering when the buffer flag is set. + * + * @param {Comment} comment + * @api public + */ + + visitComment: function(comment){ + if (!comment.buffer) return; + if (this.pp) this.prettyIndent(1, true); + this.buffer(''); + }, + + /** + * Visit a `BlockComment`. + * + * @param {Comment} comment + * @api public + */ + + visitBlockComment: function(comment){ + if (!comment.buffer) return; + if (0 == comment.val.trim().indexOf('if')) { + this.buffer(''); + } else { + this.buffer(''); + } + }, + + /** + * Visit `code`, respecting buffer / escape flags. + * If the code is followed by a block, wrap it in + * a self-calling function. + * + * @param {Code} code + * @api public + */ + + visitCode: function(code){ + // Wrap code blocks with {}. + // we only wrap unbuffered code blocks ATM + // since they are usually flow control + + // Buffer code + if (code.buffer) { + var val = code.val.trimLeft(); + this.buf.push('var __val__ = ' + val); + val = 'null == __val__ ? "" : __val__'; + if (code.escape) val = 'escape(' + val + ')'; + this.buf.push("buf.push(" + val + ");"); + } else { + this.buf.push(code.val); + } + + // Block support + if (code.block) { + if (!code.buffer) this.buf.push('{'); + this.visit(code.block); + if (!code.buffer) this.buf.push('}'); + } + }, + + /** + * Visit `each` block. + * + * @param {Each} each + * @api public + */ + + visitEach: function(each){ + this.buf.push('' + + '// iterate ' + each.obj + '\n' + + ';(function(){\n' + + ' if (\'number\' == typeof ' + each.obj + '.length) {\n' + + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + this.buf.push('' + + ' }\n' + + ' } else {\n' + + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' + // if browser + // + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' + // end + + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); + + this.visit(each.block); + + // if browser + // this.buf.push(' }\n'); + // end + + this.buf.push(' }\n }\n}).call(this);\n'); + }, + + /** + * Visit `attrs`. + * + * @param {Array} attrs + * @api public + */ + + visitAttributes: function(attrs){ + var val = this.attrs(attrs); + if (val.inherits) { + this.buf.push("buf.push(attrs(merge({ " + val.buf + + " }, attributes), merge(" + val.escaped + ", escaped, true)));"); + } else if (val.constant) { + eval('var buf={' + val.buf + '};'); + this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); + } else { + this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); + } + }, + + /** + * Compile attributes. + */ + + attrs: function(attrs){ + var buf = [] + , classes = [] + , escaped = {} + , constant = attrs.every(function(attr){ return isConstant(attr.val) }) + , inherits = false; + + if (this.terse) buf.push('terse: true'); + + attrs.forEach(function(attr){ + if (attr.name == 'attributes') return inherits = true; + escaped[attr.name] = attr.escaped; + if (attr.name == 'class') { + classes.push('(' + attr.val + ')'); + } else { + var pair = "'" + attr.name + "':(" + attr.val + ')'; + buf.push(pair); + } + }); + + if (classes.length) { + classes = classes.join(" + ' ' + "); + buf.push("class: " + classes); + } + + return { + buf: buf.join(', ').replace('class:', '"class":'), + escaped: JSON.stringify(escaped), + inherits: inherits, + constant: constant + }; + } +}; + +/** + * Check if expression can be evaluated to a constant + * + * @param {String} expression + * @return {Boolean} + * @api private + */ + +function isConstant(val){ + // Check strings/literals + if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) + return true; + + // Check numbers + if (!isNaN(Number(val))) + return true; + + // Check arrays + var matches; + if (matches = /^ *\[(.*)\] *$/.exec(val)) + return matches[1].split(',').every(isConstant); + + return false; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +function escape(html){ + return String(html) + .replace(/&(?!\w+;)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/doctypes.js b/node_modules/mocha/node_modules/jade/lib/doctypes.js new file mode 100644 index 00000000..e87ca1e4 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/doctypes.js @@ -0,0 +1,18 @@ + +/*! + * Jade - doctypes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + '5': '' + , 'default': '' + , 'xml': '' + , 'transitional': '' + , 'strict': '' + , 'frameset': '' + , '1.1': '' + , 'basic': '' + , 'mobile': '' +}; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/filters.js b/node_modules/mocha/node_modules/jade/lib/filters.js new file mode 100644 index 00000000..fdb634cb --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/filters.js @@ -0,0 +1,97 @@ + +/*! + * Jade - filters + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = { + + /** + * Wrap text with CDATA block. + */ + + cdata: function(str){ + return ''; + }, + + /** + * Transform sass to css, wrapped in style tags. + */ + + sass: function(str){ + str = str.replace(/\\n/g, '\n'); + var sass = require('sass').render(str).replace(/\n/g, '\\n'); + return ''; + }, + + /** + * Transform stylus to css, wrapped in style tags. + */ + + stylus: function(str, options){ + var ret; + str = str.replace(/\\n/g, '\n'); + var stylus = require('stylus'); + stylus(str, options).render(function(err, css){ + if (err) throw err; + ret = css.replace(/\n/g, '\\n'); + }); + return ''; + }, + + /** + * Transform less to css, wrapped in style tags. + */ + + less: function(str){ + var ret; + str = str.replace(/\\n/g, '\n'); + require('less').render(str, function(err, css){ + if (err) throw err; + ret = ''; + }); + return ret; + }, + + /** + * Transform markdown to html. + */ + + markdown: function(str){ + var md; + + // support markdown / discount + try { + md = require('markdown'); + } catch (err){ + try { + md = require('discount'); + } catch (err) { + try { + md = require('markdown-js'); + } catch (err) { + try { + md = require('marked'); + } catch (err) { + throw new + Error('Cannot find markdown library, install markdown, discount, or marked.'); + } + } + } + } + + str = str.replace(/\\n/g, '\n'); + return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); + }, + + /** + * Transform coffeescript to javascript. + */ + + coffeescript: function(str){ + str = str.replace(/\\n/g, '\n'); + var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); + return ''; + } +}; diff --git a/node_modules/mocha/node_modules/jade/lib/inline-tags.js b/node_modules/mocha/node_modules/jade/lib/inline-tags.js new file mode 100644 index 00000000..491de0b5 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/inline-tags.js @@ -0,0 +1,28 @@ + +/*! + * Jade - inline tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'a' + , 'abbr' + , 'acronym' + , 'b' + , 'br' + , 'code' + , 'em' + , 'font' + , 'i' + , 'img' + , 'ins' + , 'kbd' + , 'map' + , 'samp' + , 'small' + , 'span' + , 'strong' + , 'sub' + , 'sup' +]; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/jade.js b/node_modules/mocha/node_modules/jade/lib/jade.js new file mode 100644 index 00000000..00f0abb1 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/jade.js @@ -0,0 +1,237 @@ +/*! + * Jade + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Parser = require('./parser') + , Lexer = require('./lexer') + , Compiler = require('./compiler') + , runtime = require('./runtime') +// if node + , fs = require('fs'); +// end + +/** + * Library version. + */ + +exports.version = '0.26.3'; + +/** + * Expose self closing tags. + */ + +exports.selfClosing = require('./self-closing'); + +/** + * Default supported doctypes. + */ + +exports.doctypes = require('./doctypes'); + +/** + * Text filters. + */ + +exports.filters = require('./filters'); + +/** + * Utilities. + */ + +exports.utils = require('./utils'); + +/** + * Expose `Compiler`. + */ + +exports.Compiler = Compiler; + +/** + * Expose `Parser`. + */ + +exports.Parser = Parser; + +/** + * Expose `Lexer`. + */ + +exports.Lexer = Lexer; + +/** + * Nodes. + */ + +exports.nodes = require('./nodes'); + +/** + * Jade runtime helpers. + */ + +exports.runtime = runtime; + +/** + * Template function cache. + */ + +exports.cache = {}; + +/** + * Parse the given `str` of jade and return a function body. + * + * @param {String} str + * @param {Object} options + * @return {String} + * @api private + */ + +function parse(str, options){ + try { + // Parse + var parser = new Parser(str, options.filename, options); + + // Compile + var compiler = new (options.compiler || Compiler)(parser.parse(), options) + , js = compiler.compile(); + + // Debug compiler + if (options.debug) { + console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); + } + + return '' + + 'var buf = [];\n' + + (options.self + ? 'var self = locals || {};\n' + js + : 'with (locals || {}) {\n' + js + '\n}\n') + + 'return buf.join("");'; + } catch (err) { + parser = parser.context(); + runtime.rethrow(err, parser.filename, parser.lexer.lineno); + } +} + +/** + * Compile a `Function` representation of the given jade `str`. + * + * Options: + * + * - `compileDebug` when `false` debugging code is stripped from the compiled template + * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` + * for use with the Jade client-side runtime.js + * + * @param {String} str + * @param {Options} options + * @return {Function} + * @api public + */ + +exports.compile = function(str, options){ + var options = options || {} + , client = options.client + , filename = options.filename + ? JSON.stringify(options.filename) + : 'undefined' + , fn; + + if (options.compileDebug !== false) { + fn = [ + 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' + , 'try {' + , parse(String(str), options) + , '} catch (err) {' + , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' + , '}' + ].join('\n'); + } else { + fn = parse(String(str), options); + } + + if (client) { + fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; + } + + fn = new Function('locals, attrs, escape, rethrow, merge', fn); + + if (client) return fn; + + return function(locals){ + return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); + }; +}; + +/** + * Render the given `str` of jade and invoke + * the callback `fn(err, str)`. + * + * Options: + * + * - `cache` enable template caching + * - `filename` filename required for `include` / `extends` and caching + * + * @param {String} str + * @param {Object|Function} options or fn + * @param {Function} fn + * @api public + */ + +exports.render = function(str, options, fn){ + // swap args + if ('function' == typeof options) { + fn = options, options = {}; + } + + // cache requires .filename + if (options.cache && !options.filename) { + return fn(new Error('the "filename" option is required for caching')); + } + + try { + var path = options.filename; + var tmpl = options.cache + ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) + : exports.compile(str, options); + fn(null, tmpl(options)); + } catch (err) { + fn(err); + } +}; + +/** + * Render a Jade file at the given `path` and callback `fn(err, str)`. + * + * @param {String} path + * @param {Object|Function} options or callback + * @param {Function} fn + * @api public + */ + +exports.renderFile = function(path, options, fn){ + var key = path + ':string'; + + if ('function' == typeof options) { + fn = options, options = {}; + } + + try { + options.filename = path; + var str = options.cache + ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) + : fs.readFileSync(path, 'utf8'); + exports.render(str, options, fn); + } catch (err) { + fn(err); + } +}; + +/** + * Express support. + */ + +exports.__express = exports.renderFile; diff --git a/node_modules/mocha/node_modules/jade/lib/lexer.js b/node_modules/mocha/node_modules/jade/lib/lexer.js new file mode 100644 index 00000000..bca314a9 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/lexer.js @@ -0,0 +1,771 @@ + +/*! + * Jade - Lexer + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize `Lexer` with the given `str`. + * + * Options: + * + * - `colons` allow colons for attr delimiters + * + * @param {String} str + * @param {Object} options + * @api private + */ + +var Lexer = module.exports = function Lexer(str, options) { + options = options || {}; + this.input = str.replace(/\r\n|\r/g, '\n'); + this.colons = options.colons; + this.deferredTokens = []; + this.lastIndents = 0; + this.lineno = 1; + this.stash = []; + this.indentStack = []; + this.indentRe = null; + this.pipeless = false; +}; + +/** + * Lexer prototype. + */ + +Lexer.prototype = { + + /** + * Construct a token with the given `type` and `val`. + * + * @param {String} type + * @param {String} val + * @return {Object} + * @api private + */ + + tok: function(type, val){ + return { + type: type + , line: this.lineno + , val: val + } + }, + + /** + * Consume the given `len` of input. + * + * @param {Number} len + * @api private + */ + + consume: function(len){ + this.input = this.input.substr(len); + }, + + /** + * Scan for `type` with the given `regexp`. + * + * @param {String} type + * @param {RegExp} regexp + * @return {Object} + * @api private + */ + + scan: function(regexp, type){ + var captures; + if (captures = regexp.exec(this.input)) { + this.consume(captures[0].length); + return this.tok(type, captures[1]); + } + }, + + /** + * Defer the given `tok`. + * + * @param {Object} tok + * @api private + */ + + defer: function(tok){ + this.deferredTokens.push(tok); + }, + + /** + * 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.next()); + return this.stash[--n]; + }, + + /** + * Return the indexOf `start` / `end` delimiters. + * + * @param {String} start + * @param {String} end + * @return {Number} + * @api private + */ + + indexOfDelimiters: function(start, end){ + var str = this.input + , nstart = 0 + , nend = 0 + , pos = 0; + for (var i = 0, len = str.length; i < len; ++i) { + if (start == str.charAt(i)) { + ++nstart; + } else if (end == str.charAt(i)) { + if (++nend == nstart) { + pos = i; + break; + } + } + } + return pos; + }, + + /** + * Stashed token. + */ + + stashed: function() { + return this.stash.length + && this.stash.shift(); + }, + + /** + * Deferred token. + */ + + deferred: function() { + return this.deferredTokens.length + && this.deferredTokens.shift(); + }, + + /** + * end-of-source. + */ + + eos: function() { + if (this.input.length) return; + if (this.indentStack.length) { + this.indentStack.shift(); + return this.tok('outdent'); + } else { + return this.tok('eos'); + } + }, + + /** + * Blank line. + */ + + blank: function() { + var captures; + if (captures = /^\n *\n/.exec(this.input)) { + this.consume(captures[0].length - 1); + if (this.pipeless) return this.tok('text', ''); + return this.next(); + } + }, + + /** + * Comment. + */ + + comment: function() { + var captures; + if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('comment', captures[2]); + tok.buffer = '-' != captures[1]; + return tok; + } + }, + + /** + * Interpolated tag. + */ + + interpolation: function() { + var captures; + if (captures = /^#\{(.*?)\}/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('interpolation', captures[1]); + } + }, + + /** + * Tag. + */ + + tag: function() { + var captures; + if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { + this.consume(captures[0].length); + var tok, name = captures[1]; + if (':' == name[name.length - 1]) { + name = name.slice(0, -1); + tok = this.tok('tag', name); + this.defer(this.tok(':')); + while (' ' == this.input[0]) this.input = this.input.substr(1); + } else { + tok = this.tok('tag', name); + } + tok.selfClosing = !! captures[2]; + return tok; + } + }, + + /** + * Filter. + */ + + filter: function() { + return this.scan(/^:(\w+)/, 'filter'); + }, + + /** + * Doctype. + */ + + doctype: function() { + return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); + }, + + /** + * Id. + */ + + id: function() { + return this.scan(/^#([\w-]+)/, 'id'); + }, + + /** + * Class. + */ + + className: function() { + return this.scan(/^\.([\w-]+)/, 'class'); + }, + + /** + * Text. + */ + + text: function() { + return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); + }, + + /** + * Extends. + */ + + "extends": function() { + return this.scan(/^extends? +([^\n]+)/, 'extends'); + }, + + /** + * Block prepend. + */ + + prepend: function() { + var captures; + if (captures = /^prepend +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'prepend' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block append. + */ + + append: function() { + var captures; + if (captures = /^append +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = 'append' + , name = captures[1] + , tok = this.tok('block', name); + tok.mode = mode; + return tok; + } + }, + + /** + * Block. + */ + + block: function() { + var captures; + if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var mode = captures[1] || 'replace' + , name = captures[2] + , tok = this.tok('block', name); + + tok.mode = mode; + return tok; + } + }, + + /** + * Yield. + */ + + yield: function() { + return this.scan(/^yield */, 'yield'); + }, + + /** + * Include. + */ + + include: function() { + return this.scan(/^include +([^\n]+)/, 'include'); + }, + + /** + * Case. + */ + + "case": function() { + return this.scan(/^case +([^\n]+)/, 'case'); + }, + + /** + * When. + */ + + when: function() { + return this.scan(/^when +([^:\n]+)/, 'when'); + }, + + /** + * Default. + */ + + "default": function() { + return this.scan(/^default */, 'default'); + }, + + /** + * Assignment. + */ + + assignment: function() { + var captures; + if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { + this.consume(captures[0].length); + var name = captures[1] + , val = captures[2]; + return this.tok('code', 'var ' + name + ' = (' + val + ');'); + } + }, + + /** + * Call mixin. + */ + + call: function(){ + var captures; + if (captures = /^\+([-\w]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('call', captures[1]); + + // Check for args (not attributes) + if (captures = /^ *\((.*?)\)/.exec(this.input)) { + if (!/^ *[-\w]+ *=/.test(captures[1])) { + this.consume(captures[0].length); + tok.args = captures[1]; + } + } + + return tok; + } + }, + + /** + * Mixin. + */ + + mixin: function(){ + var captures; + if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('mixin', captures[1]); + tok.args = captures[2]; + return tok; + } + }, + + /** + * Conditional. + */ + + conditional: function() { + var captures; + if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { + this.consume(captures[0].length); + var type = captures[1] + , js = captures[2]; + + switch (type) { + case 'if': js = 'if (' + js + ')'; break; + case 'unless': js = 'if (!(' + js + '))'; break; + case 'else if': js = 'else if (' + js + ')'; break; + case 'else': js = 'else'; break; + } + + return this.tok('code', js); + } + }, + + /** + * While. + */ + + "while": function() { + var captures; + if (captures = /^while +([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + return this.tok('code', 'while (' + captures[1] + ')'); + } + }, + + /** + * Each. + */ + + each: function() { + var captures; + if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var tok = this.tok('each', captures[1]); + tok.key = captures[2] || '$index'; + tok.code = captures[3]; + return tok; + } + }, + + /** + * Code. + */ + + code: function() { + var captures; + if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { + this.consume(captures[0].length); + var flags = captures[1]; + captures[1] = captures[2]; + var tok = this.tok('code', captures[1]); + tok.escape = flags[0] === '='; + tok.buffer = flags[0] === '=' || flags[1] === '='; + return tok; + } + }, + + /** + * Attributes. + */ + + attrs: function() { + if ('(' == this.input.charAt(0)) { + var index = this.indexOfDelimiters('(', ')') + , str = this.input.substr(1, index-1) + , tok = this.tok('attrs') + , len = str.length + , colons = this.colons + , states = ['key'] + , escapedAttr + , key = '' + , val = '' + , quote + , c + , p; + + function state(){ + return states[states.length - 1]; + } + + function interpolate(attr) { + return attr.replace(/#\{([^}]+)\}/g, function(_, expr){ + return quote + " + (" + expr + ") + " + quote; + }); + } + + this.consume(index + 1); + tok.attrs = {}; + tok.escaped = {}; + + function parse(c) { + var real = c; + // TODO: remove when people fix ":" + if (colons && ':' == c) c = '='; + switch (c) { + case ',': + case '\n': + switch (state()) { + case 'expr': + case 'array': + case 'string': + case 'object': + val += c; + break; + default: + states.push('key'); + val = val.trim(); + key = key.trim(); + if ('' == key) return; + key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); + tok.escaped[key] = escapedAttr; + tok.attrs[key] = '' == val + ? true + : interpolate(val); + key = val = ''; + } + break; + case '=': + switch (state()) { + case 'key char': + key += real; + break; + case 'val': + case 'expr': + case 'array': + case 'string': + case 'object': + val += real; + break; + default: + escapedAttr = '!' != p; + states.push('val'); + } + break; + case '(': + if ('val' == state() + || 'expr' == state()) states.push('expr'); + val += c; + break; + case ')': + if ('expr' == state() + || 'val' == state()) states.pop(); + val += c; + break; + case '{': + if ('val' == state()) states.push('object'); + val += c; + break; + case '}': + if ('object' == state()) states.pop(); + val += c; + break; + case '[': + if ('val' == state()) states.push('array'); + val += c; + break; + case ']': + if ('array' == state()) states.pop(); + val += c; + break; + case '"': + case "'": + switch (state()) { + case 'key': + states.push('key char'); + break; + case 'key char': + states.pop(); + break; + case 'string': + if (c == quote) states.pop(); + val += c; + break; + default: + states.push('string'); + val += c; + quote = c; + } + break; + case '': + break; + default: + switch (state()) { + case 'key': + case 'key char': + key += c; + break; + default: + val += c; + } + } + p = c; + } + + for (var i = 0; i < len; ++i) { + parse(str.charAt(i)); + } + + parse(','); + + if ('/' == this.input.charAt(0)) { + this.consume(1); + tok.selfClosing = true; + } + + return tok; + } + }, + + /** + * Indent | Outdent | Newline. + */ + + indent: function() { + var captures, re; + + // established regexp + if (this.indentRe) { + captures = this.indentRe.exec(this.input); + // determine regexp + } else { + // tabs + re = /^\n(\t*) */; + captures = re.exec(this.input); + + // spaces + if (captures && !captures[1].length) { + re = /^\n( *)/; + captures = re.exec(this.input); + } + + // established + if (captures && captures[1].length) this.indentRe = re; + } + + if (captures) { + var tok + , indents = captures[1].length; + + ++this.lineno; + this.consume(indents + 1); + + if (' ' == this.input[0] || '\t' == this.input[0]) { + throw new Error('Invalid indentation, you can use tabs or spaces but not both'); + } + + // blank line + if ('\n' == this.input[0]) return this.tok('newline'); + + // outdent + if (this.indentStack.length && indents < this.indentStack[0]) { + while (this.indentStack.length && this.indentStack[0] > indents) { + this.stash.push(this.tok('outdent')); + this.indentStack.shift(); + } + tok = this.stash.pop(); + // indent + } else if (indents && indents != this.indentStack[0]) { + this.indentStack.unshift(indents); + tok = this.tok('indent', indents); + // newline + } else { + tok = this.tok('newline'); + } + + return tok; + } + }, + + /** + * Pipe-less text consumed only when + * pipeless is true; + */ + + pipelessText: function() { + if (this.pipeless) { + if ('\n' == this.input[0]) return; + var i = this.input.indexOf('\n'); + if (-1 == i) i = this.input.length; + var str = this.input.substr(0, i); + this.consume(str.length); + return this.tok('text', str); + } + }, + + /** + * ':' + */ + + colon: function() { + return this.scan(/^: */, ':'); + }, + + /** + * Return the next token object, or those + * previously stashed by lookahead. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.stashed() + || this.next(); + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + next: function() { + return this.deferred() + || this.blank() + || this.eos() + || this.pipelessText() + || this.yield() + || this.doctype() + || this.interpolation() + || this["case"]() + || this.when() + || this["default"]() + || this["extends"]() + || this.append() + || this.prepend() + || this.block() + || this.include() + || this.mixin() + || this.call() + || this.conditional() + || this.each() + || this["while"]() + || this.assignment() + || this.tag() + || this.filter() + || this.code() + || this.id() + || this.className() + || this.attrs() + || this.indent() + || this.comment() + || this.colon() + || this.text(); + } +}; diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js b/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js new file mode 100644 index 00000000..5de9b59c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/attrs.js @@ -0,0 +1,77 @@ + +/*! + * Jade - nodes - Attrs + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'), + Block = require('./block'); + +/** + * Initialize a `Attrs` node. + * + * @api public + */ + +var Attrs = module.exports = function Attrs() { + this.attrs = []; +}; + +/** + * Inherit from `Node`. + */ + +Attrs.prototype.__proto__ = Node.prototype; + +/** + * Set attribute `name` to `val`, keep in mind these become + * part of a raw js object literal, so to quote a value you must + * '"quote me"', otherwise or example 'user.name' is literal JavaScript. + * + * @param {String} name + * @param {String} val + * @param {Boolean} escaped + * @return {Tag} for chaining + * @api public + */ + +Attrs.prototype.setAttribute = function(name, val, escaped){ + this.attrs.push({ name: name, val: val, escaped: escaped }); + return this; +}; + +/** + * Remove attribute `name` when present. + * + * @param {String} name + * @api public + */ + +Attrs.prototype.removeAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + delete this.attrs[i]; + } + } +}; + +/** + * Get attribute value by `name`. + * + * @param {String} name + * @return {String} + * @api public + */ + +Attrs.prototype.getAttribute = function(name){ + for (var i = 0, len = this.attrs.length; i < len; ++i) { + if (this.attrs[i] && this.attrs[i].name == name) { + return this.attrs[i].val; + } + } +}; diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js b/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js new file mode 100644 index 00000000..4f41e4a5 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/block-comment.js @@ -0,0 +1,33 @@ + +/*! + * Jade - nodes - BlockComment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `BlockComment` with the given `block`. + * + * @param {String} val + * @param {Block} block + * @param {Boolean} buffer + * @api public + */ + +var BlockComment = module.exports = function BlockComment(val, block, buffer) { + this.block = block; + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +BlockComment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/block.js b/node_modules/mocha/node_modules/jade/lib/nodes/block.js new file mode 100644 index 00000000..bb00a1d9 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/block.js @@ -0,0 +1,121 @@ + +/*! + * Jade - nodes - Block + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Block` with an optional `node`. + * + * @param {Node} node + * @api public + */ + +var Block = module.exports = function Block(node){ + this.nodes = []; + if (node) this.push(node); +}; + +/** + * Inherit from `Node`. + */ + +Block.prototype.__proto__ = Node.prototype; + +/** + * Block flag. + */ + +Block.prototype.isBlock = true; + +/** + * Replace the nodes in `other` with the nodes + * in `this` block. + * + * @param {Block} other + * @api private + */ + +Block.prototype.replace = function(other){ + other.nodes = this.nodes; +}; + +/** + * Pust the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.push = function(node){ + return this.nodes.push(node); +}; + +/** + * Check if this block is empty. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.isEmpty = function(){ + return 0 == this.nodes.length; +}; + +/** + * Unshift the given `node`. + * + * @param {Node} node + * @return {Number} + * @api public + */ + +Block.prototype.unshift = function(node){ + return this.nodes.unshift(node); +}; + +/** + * Return the "last" block, or the first `yield` node. + * + * @return {Block} + * @api private + */ + +Block.prototype.includeBlock = function(){ + var ret = this + , node; + + for (var i = 0, len = this.nodes.length; i < len; ++i) { + node = this.nodes[i]; + if (node.yield) return node; + else if (node.textOnly) continue; + else if (node.includeBlock) ret = node.includeBlock(); + else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); + } + + return ret; +}; + +/** + * Return a clone of this block. + * + * @return {Block} + * @api private + */ + +Block.prototype.clone = function(){ + var clone = new Block; + for (var i = 0, len = this.nodes.length; i < len; ++i) { + clone.push(this.nodes[i].clone()); + } + return clone; +}; + diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/case.js b/node_modules/mocha/node_modules/jade/lib/nodes/case.js new file mode 100644 index 00000000..08ff0337 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/case.js @@ -0,0 +1,43 @@ + +/*! + * Jade - nodes - Case + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Case` with `expr`. + * + * @param {String} expr + * @api public + */ + +var Case = exports = module.exports = function Case(expr, block){ + this.expr = expr; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Case.prototype.__proto__ = Node.prototype; + +var When = exports.When = function When(expr, block){ + this.expr = expr; + this.block = block; + this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +When.prototype.__proto__ = Node.prototype; + diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/code.js b/node_modules/mocha/node_modules/jade/lib/nodes/code.js new file mode 100644 index 00000000..babc6759 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/code.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Code + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Code` node with the given code `val`. + * Code may also be optionally buffered and escaped. + * + * @param {String} val + * @param {Boolean} buffer + * @param {Boolean} escape + * @api public + */ + +var Code = module.exports = function Code(val, buffer, escape) { + this.val = val; + this.buffer = buffer; + this.escape = escape; + if (val.match(/^ *else/)) this.debug = false; +}; + +/** + * Inherit from `Node`. + */ + +Code.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/comment.js b/node_modules/mocha/node_modules/jade/lib/nodes/comment.js new file mode 100644 index 00000000..2e1469e7 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/comment.js @@ -0,0 +1,32 @@ + +/*! + * Jade - nodes - Comment + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Comment` with the given `val`, optionally `buffer`, + * otherwise the comment may render in the output. + * + * @param {String} val + * @param {Boolean} buffer + * @api public + */ + +var Comment = module.exports = function Comment(val, buffer) { + this.val = val; + this.buffer = buffer; +}; + +/** + * Inherit from `Node`. + */ + +Comment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js b/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js new file mode 100644 index 00000000..b8f33e56 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/doctype.js @@ -0,0 +1,29 @@ + +/*! + * Jade - nodes - Doctype + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Doctype` with the given `val`. + * + * @param {String} val + * @api public + */ + +var Doctype = module.exports = function Doctype(val) { + this.val = val; +}; + +/** + * Inherit from `Node`. + */ + +Doctype.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/each.js b/node_modules/mocha/node_modules/jade/lib/nodes/each.js new file mode 100644 index 00000000..f54101f1 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/each.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Each + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize an `Each` node, representing iteration + * + * @param {String} obj + * @param {String} val + * @param {String} key + * @param {Block} block + * @api public + */ + +var Each = module.exports = function Each(obj, val, key, block) { + this.obj = obj; + this.val = val; + this.key = key; + this.block = block; +}; + +/** + * Inherit from `Node`. + */ + +Each.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/filter.js b/node_modules/mocha/node_modules/jade/lib/nodes/filter.js new file mode 100644 index 00000000..851a0040 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/filter.js @@ -0,0 +1,35 @@ + +/*! + * Jade - nodes - Filter + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , Block = require('./block'); + +/** + * Initialize a `Filter` node with the given + * filter `name` and `block`. + * + * @param {String} name + * @param {Block|Node} block + * @api public + */ + +var Filter = module.exports = function Filter(name, block, attrs) { + this.name = name; + this.block = block; + this.attrs = attrs; + this.isASTFilter = !block.nodes.every(function(node){ return node.isText }); +}; + +/** + * Inherit from `Node`. + */ + +Filter.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/index.js b/node_modules/mocha/node_modules/jade/lib/nodes/index.js new file mode 100644 index 00000000..386ad2f9 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/index.js @@ -0,0 +1,20 @@ + +/*! + * Jade - nodes + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +exports.Node = require('./node'); +exports.Tag = require('./tag'); +exports.Code = require('./code'); +exports.Each = require('./each'); +exports.Case = require('./case'); +exports.Text = require('./text'); +exports.Block = require('./block'); +exports.Mixin = require('./mixin'); +exports.Filter = require('./filter'); +exports.Comment = require('./comment'); +exports.Literal = require('./literal'); +exports.BlockComment = require('./block-comment'); +exports.Doctype = require('./doctype'); diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/literal.js b/node_modules/mocha/node_modules/jade/lib/nodes/literal.js new file mode 100644 index 00000000..fde586be --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/literal.js @@ -0,0 +1,32 @@ + +/*! + * Jade - nodes - Literal + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Literal` node with the given `str. + * + * @param {String} str + * @api public + */ + +var Literal = module.exports = function Literal(str) { + this.str = str + .replace(/\\/g, "\\\\") + .replace(/\n|\r\n/g, "\\n") + .replace(/'/g, "\\'"); +}; + +/** + * Inherit from `Node`. + */ + +Literal.prototype.__proto__ = Node.prototype; diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js b/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js new file mode 100644 index 00000000..8407bc79 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/mixin.js @@ -0,0 +1,36 @@ + +/*! + * Jade - nodes - Mixin + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'); + +/** + * Initialize a new `Mixin` with `name` and `block`. + * + * @param {String} name + * @param {String} args + * @param {Block} block + * @api public + */ + +var Mixin = module.exports = function Mixin(name, args, block, call){ + this.name = name; + this.args = args; + this.block = block; + this.attrs = []; + this.call = call; +}; + +/** + * Inherit from `Attrs`. + */ + +Mixin.prototype.__proto__ = Attrs.prototype; + diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/node.js b/node_modules/mocha/node_modules/jade/lib/nodes/node.js new file mode 100644 index 00000000..e98f042c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/node.js @@ -0,0 +1,25 @@ + +/*! + * Jade - nodes - Node + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Initialize a `Node`. + * + * @api public + */ + +var Node = module.exports = function Node(){}; + +/** + * Clone this node (return itself) + * + * @return {Node} + * @api private + */ + +Node.prototype.clone = function(){ + return this; +}; diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/tag.js b/node_modules/mocha/node_modules/jade/lib/nodes/tag.js new file mode 100644 index 00000000..4b6728ad --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/tag.js @@ -0,0 +1,95 @@ + +/*! + * Jade - nodes - Tag + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Attrs = require('./attrs'), + Block = require('./block'), + inlineTags = require('../inline-tags'); + +/** + * Initialize a `Tag` node with the given tag `name` and optional `block`. + * + * @param {String} name + * @param {Block} block + * @api public + */ + +var Tag = module.exports = function Tag(name, block) { + this.name = name; + this.attrs = []; + this.block = block || new Block; +}; + +/** + * Inherit from `Attrs`. + */ + +Tag.prototype.__proto__ = Attrs.prototype; + +/** + * Clone this tag. + * + * @return {Tag} + * @api private + */ + +Tag.prototype.clone = function(){ + var clone = new Tag(this.name, this.block.clone()); + clone.line = this.line; + clone.attrs = this.attrs; + clone.textOnly = this.textOnly; + return clone; +}; + +/** + * Check if this tag is an inline tag. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.isInline = function(){ + return ~inlineTags.indexOf(this.name); +}; + +/** + * Check if this tag's contents can be inlined. Used for pretty printing. + * + * @return {Boolean} + * @api private + */ + +Tag.prototype.canInline = function(){ + var nodes = this.block.nodes; + + function isInline(node){ + // Recurse if the node is a block + if (node.isBlock) return node.nodes.every(isInline); + return node.isText || (node.isInline && node.isInline()); + } + + // Empty tag + if (!nodes.length) return true; + + // Text-only or inline-only tag + if (1 == nodes.length) return isInline(nodes[0]); + + // Multi-line inline-only tag + if (this.block.nodes.every(isInline)) { + for (var i = 1, len = nodes.length; i < len; ++i) { + if (nodes[i-1].isText && nodes[i].isText) + return false; + } + return true; + } + + // Mixed tag + return false; +}; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/nodes/text.js b/node_modules/mocha/node_modules/jade/lib/nodes/text.js new file mode 100644 index 00000000..3b5dd557 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/nodes/text.js @@ -0,0 +1,36 @@ + +/*! + * Jade - nodes - Text + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a `Text` node with optional `line`. + * + * @param {String} line + * @api public + */ + +var Text = module.exports = function Text(line) { + this.val = ''; + if ('string' == typeof line) this.val = line; +}; + +/** + * Inherit from `Node`. + */ + +Text.prototype.__proto__ = Node.prototype; + +/** + * Flag as text. + */ + +Text.prototype.isText = true; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/parser.js b/node_modules/mocha/node_modules/jade/lib/parser.js new file mode 100644 index 00000000..92f2af0c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/parser.js @@ -0,0 +1,710 @@ + +/*! + * Jade - Parser + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Lexer = require('./lexer') + , nodes = require('./nodes'); + +/** + * Initialize `Parser` with the given input `str` and `filename`. + * + * @param {String} str + * @param {String} filename + * @param {Object} options + * @api public + */ + +var Parser = exports = module.exports = function Parser(str, filename, options){ + this.input = str; + this.lexer = new Lexer(str, options); + this.filename = filename; + this.blocks = {}; + this.mixins = {}; + this.options = options; + this.contexts = [this]; +}; + +/** + * Tags that may not contain tags. + */ + +var textOnly = exports.textOnly = ['script', 'style']; + +/** + * Parser prototype. + */ + +Parser.prototype = { + + /** + * Push `parser` onto the context stack, + * or pop and return a `Parser`. + */ + + context: function(parser){ + if (parser) { + this.contexts.push(parser); + } else { + return this.contexts.pop(); + } + }, + + /** + * Return the next token object. + * + * @return {Object} + * @api private + */ + + advance: function(){ + return this.lexer.advance(); + }, + + /** + * Skip `n` tokens. + * + * @param {Number} n + * @api private + */ + + skip: function(n){ + while (n--) this.advance(); + }, + + /** + * Single token lookahead. + * + * @return {Object} + * @api private + */ + + peek: function() { + return this.lookahead(1); + }, + + /** + * Return lexer lineno. + * + * @return {Number} + * @api private + */ + + line: function() { + return this.lexer.lineno; + }, + + /** + * `n` token lookahead. + * + * @param {Number} n + * @return {Object} + * @api private + */ + + lookahead: function(n){ + return this.lexer.lookahead(n); + }, + + /** + * Parse input returning a string of js for evaluation. + * + * @return {String} + * @api public + */ + + parse: function(){ + var block = new nodes.Block, parser; + block.line = this.line(); + + while ('eos' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + + if (parser = this.extending) { + this.context(parser); + var ast = parser.parse(); + this.context(); + // hoist mixins + for (var name in this.mixins) + ast.unshift(this.mixins[name]); + return ast; + } + + return block; + }, + + /** + * Expect the given type, or throw an exception. + * + * @param {String} type + * @api private + */ + + expect: function(type){ + if (this.peek().type === type) { + return this.advance(); + } else { + throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); + } + }, + + /** + * Accept the given `type`. + * + * @param {String} type + * @api private + */ + + accept: function(type){ + if (this.peek().type === type) { + return this.advance(); + } + }, + + /** + * tag + * | doctype + * | mixin + * | include + * | filter + * | comment + * | text + * | each + * | code + * | yield + * | id + * | class + * | interpolation + */ + + parseExpr: function(){ + switch (this.peek().type) { + case 'tag': + return this.parseTag(); + case 'mixin': + return this.parseMixin(); + case 'block': + return this.parseBlock(); + case 'case': + return this.parseCase(); + case 'when': + return this.parseWhen(); + case 'default': + return this.parseDefault(); + case 'extends': + return this.parseExtends(); + case 'include': + return this.parseInclude(); + case 'doctype': + return this.parseDoctype(); + case 'filter': + return this.parseFilter(); + case 'comment': + return this.parseComment(); + case 'text': + return this.parseText(); + case 'each': + return this.parseEach(); + case 'code': + return this.parseCode(); + case 'call': + return this.parseCall(); + case 'interpolation': + return this.parseInterpolation(); + case 'yield': + this.advance(); + var block = new nodes.Block; + block.yield = true; + return block; + case 'id': + case 'class': + var tok = this.advance(); + this.lexer.defer(this.lexer.tok('tag', 'div')); + this.lexer.defer(tok); + return this.parseExpr(); + default: + throw new Error('unexpected token "' + this.peek().type + '"'); + } + }, + + /** + * Text + */ + + parseText: function(){ + var tok = this.expect('text') + , node = new nodes.Text(tok.val); + node.line = this.line(); + return node; + }, + + /** + * ':' expr + * | block + */ + + parseBlockExpansion: function(){ + if (':' == this.peek().type) { + this.advance(); + return new nodes.Block(this.parseExpr()); + } else { + return this.block(); + } + }, + + /** + * case + */ + + parseCase: function(){ + var val = this.expect('case').val + , node = new nodes.Case(val); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * when + */ + + parseWhen: function(){ + var val = this.expect('when').val + return new nodes.Case.When(val, this.parseBlockExpansion()); + }, + + /** + * default + */ + + parseDefault: function(){ + this.expect('default'); + return new nodes.Case.When('default', this.parseBlockExpansion()); + }, + + /** + * code + */ + + parseCode: function(){ + var tok = this.expect('code') + , node = new nodes.Code(tok.val, tok.buffer, tok.escape) + , block + , i = 1; + node.line = this.line(); + while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; + block = 'indent' == this.lookahead(i).type; + if (block) { + this.skip(i-1); + node.block = this.block(); + } + return node; + }, + + /** + * comment + */ + + parseComment: function(){ + var tok = this.expect('comment') + , node; + + if ('indent' == this.peek().type) { + node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); + } else { + node = new nodes.Comment(tok.val, tok.buffer); + } + + node.line = this.line(); + return node; + }, + + /** + * doctype + */ + + parseDoctype: function(){ + var tok = this.expect('doctype') + , node = new nodes.Doctype(tok.val); + node.line = this.line(); + return node; + }, + + /** + * filter attrs? text-block + */ + + parseFilter: function(){ + var block + , tok = this.expect('filter') + , attrs = this.accept('attrs'); + + this.lexer.pipeless = true; + block = this.parseTextBlock(); + this.lexer.pipeless = false; + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * tag ':' attrs? block + */ + + parseASTFilter: function(){ + var block + , tok = this.expect('tag') + , attrs = this.accept('attrs'); + + this.expect(':'); + block = this.block(); + + var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); + node.line = this.line(); + return node; + }, + + /** + * each block + */ + + parseEach: function(){ + var tok = this.expect('each') + , node = new nodes.Each(tok.code, tok.val, tok.key); + node.line = this.line(); + node.block = this.block(); + return node; + }, + + /** + * 'extends' name + */ + + parseExtends: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + if (!this.filename) + throw new Error('the "filename" option is required to extend templates'); + + var path = this.expect('extends').val.trim() + , dir = dirname(this.filename); + + var path = join(dir, path + '.jade') + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + + parser.blocks = this.blocks; + parser.contexts = this.contexts; + this.extending = parser; + + // TODO: null node + return new nodes.Literal(''); + }, + + /** + * 'block' name block + */ + + parseBlock: function(){ + var block = this.expect('block') + , mode = block.mode + , name = block.val.trim(); + + block = 'indent' == this.peek().type + ? this.block() + : new nodes.Block(new nodes.Literal('')); + + var prev = this.blocks[name]; + + if (prev) { + switch (prev.mode) { + case 'append': + block.nodes = block.nodes.concat(prev.nodes); + prev = block; + break; + case 'prepend': + block.nodes = prev.nodes.concat(block.nodes); + prev = block; + break; + } + } + + block.mode = mode; + return this.blocks[name] = prev || block; + }, + + /** + * include block? + */ + + parseInclude: function(){ + var path = require('path') + , fs = require('fs') + , dirname = path.dirname + , basename = path.basename + , join = path.join; + + var path = this.expect('include').val.trim() + , dir = dirname(this.filename); + + if (!this.filename) + throw new Error('the "filename" option is required to use includes'); + + // no extension + if (!~basename(path).indexOf('.')) { + path += '.jade'; + } + + // non-jade + if ('.jade' != path.substr(-5)) { + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8'); + return new nodes.Literal(str); + } + + var path = join(dir, path) + , str = fs.readFileSync(path, 'utf8') + , parser = new Parser(str, path, this.options); + parser.blocks = this.blocks; + parser.mixins = this.mixins; + + this.context(parser); + var ast = parser.parse(); + this.context(); + ast.filename = path; + + if ('indent' == this.peek().type) { + ast.includeBlock().push(this.block()); + } + + return ast; + }, + + /** + * call ident block + */ + + parseCall: function(){ + var tok = this.expect('call') + , name = tok.val + , args = tok.args + , mixin = new nodes.Mixin(name, args, new nodes.Block, true); + + this.tag(mixin); + if (mixin.block.isEmpty()) mixin.block = null; + return mixin; + }, + + /** + * mixin block + */ + + parseMixin: function(){ + var tok = this.expect('mixin') + , name = tok.val + , args = tok.args + , mixin; + + // definition + if ('indent' == this.peek().type) { + mixin = new nodes.Mixin(name, args, this.block(), false); + this.mixins[name] = mixin; + return mixin; + // call + } else { + return new nodes.Mixin(name, args, null, true); + } + }, + + /** + * indent (text | newline)* outdent + */ + + parseTextBlock: function(){ + var block = new nodes.Block; + block.line = this.line(); + var spaces = this.expect('indent').val; + if (null == this._spaces) this._spaces = spaces; + var indent = Array(spaces - this._spaces + 1).join(' '); + while ('outdent' != this.peek().type) { + switch (this.peek().type) { + case 'newline': + this.advance(); + break; + case 'indent': + this.parseTextBlock().nodes.forEach(function(node){ + block.push(node); + }); + break; + default: + var text = new nodes.Text(indent + this.advance().val); + text.line = this.line(); + block.push(text); + } + } + + if (spaces == this._spaces) this._spaces = null; + this.expect('outdent'); + return block; + }, + + /** + * indent expr* outdent + */ + + block: function(){ + var block = new nodes.Block; + block.line = this.line(); + this.expect('indent'); + while ('outdent' != this.peek().type) { + if ('newline' == this.peek().type) { + this.advance(); + } else { + block.push(this.parseExpr()); + } + } + this.expect('outdent'); + return block; + }, + + /** + * interpolation (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseInterpolation: function(){ + var tok = this.advance(); + var tag = new nodes.Tag(tok.val); + tag.buffer = true; + return this.tag(tag); + }, + + /** + * tag (attrs | class | id)* (text | code | ':')? newline* block? + */ + + parseTag: function(){ + // ast-filter look-ahead + var i = 2; + if ('attrs' == this.lookahead(i).type) ++i; + if (':' == this.lookahead(i).type) { + if ('indent' == this.lookahead(++i).type) { + return this.parseASTFilter(); + } + } + + var tok = this.advance() + , tag = new nodes.Tag(tok.val); + + tag.selfClosing = tok.selfClosing; + + return this.tag(tag); + }, + + /** + * Parse tag. + */ + + tag: function(tag){ + var dot; + + tag.line = this.line(); + + // (attrs | class | id)* + out: + while (true) { + switch (this.peek().type) { + case 'id': + case 'class': + var tok = this.advance(); + tag.setAttribute(tok.type, "'" + tok.val + "'"); + continue; + case 'attrs': + var tok = this.advance() + , obj = tok.attrs + , escaped = tok.escaped + , names = Object.keys(obj); + + if (tok.selfClosing) tag.selfClosing = true; + + for (var i = 0, len = names.length; i < len; ++i) { + var name = names[i] + , val = obj[name]; + tag.setAttribute(name, val, escaped[name]); + } + continue; + default: + break out; + } + } + + // check immediate '.' + if ('.' == this.peek().val) { + dot = tag.textOnly = true; + this.advance(); + } + + // (text | code | ':')? + switch (this.peek().type) { + case 'text': + tag.block.push(this.parseText()); + break; + case 'code': + tag.code = this.parseCode(); + break; + case ':': + this.advance(); + tag.block = new nodes.Block; + tag.block.push(this.parseExpr()); + break; + } + + // newline* + while ('newline' == this.peek().type) this.advance(); + + tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); + + // script special-case + if ('script' == tag.name) { + var type = tag.getAttribute('type'); + if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { + tag.textOnly = false; + } + } + + // block? + if ('indent' == this.peek().type) { + if (tag.textOnly) { + this.lexer.pipeless = true; + tag.block = this.parseTextBlock(); + this.lexer.pipeless = false; + } else { + var block = this.block(); + if (tag.block) { + for (var i = 0, len = block.nodes.length; i < len; ++i) { + tag.block.push(block.nodes[i]); + } + } else { + tag.block = block; + } + } + } + + return tag; + } +}; diff --git a/node_modules/mocha/node_modules/jade/lib/runtime.js b/node_modules/mocha/node_modules/jade/lib/runtime.js new file mode 100644 index 00000000..fb711f5e --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/runtime.js @@ -0,0 +1,174 @@ + +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; diff --git a/node_modules/mocha/node_modules/jade/lib/self-closing.js b/node_modules/mocha/node_modules/jade/lib/self-closing.js new file mode 100644 index 00000000..05487712 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/self-closing.js @@ -0,0 +1,19 @@ + +/*! + * Jade - self closing tags + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = [ + 'meta' + , 'img' + , 'link' + , 'input' + , 'source' + , 'area' + , 'base' + , 'col' + , 'br' + , 'hr' +]; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/lib/utils.js b/node_modules/mocha/node_modules/jade/lib/utils.js new file mode 100644 index 00000000..ff46d022 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/lib/utils.js @@ -0,0 +1,49 @@ + +/*! + * Jade - utils + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Convert interpolation in the given string to JavaScript. + * + * @param {String} str + * @return {String} + * @api private + */ + +var interpolate = exports.interpolate = function(str){ + return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){ + return escape + ? str + : "' + " + + ('!' == flag ? '' : 'escape') + + "((interp = " + code.replace(/\\'/g, "'") + + ") == null ? '' : interp) + '"; + }); +}; + +/** + * Escape single quotes in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +var escape = exports.escape = function(str) { + return str.replace(/'/g, "\\'"); +}; + +/** + * Interpolate, and escape the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.text = function(str){ + return interpolate(escape(str)); +}; \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/.npmignore b/node_modules/mocha/node_modules/jade/node_modules/commander/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/.travis.yml b/node_modules/mocha/node_modules/jade/node_modules/commander/.travis.yml new file mode 100644 index 00000000..f1d0f13c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/History.md b/node_modules/mocha/node_modules/jade/node_modules/commander/History.md new file mode 100644 index 00000000..4961d2e2 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/History.md @@ -0,0 +1,107 @@ + +0.6.1 / 2012-06-01 +================== + + * Added: append (yes or no) on confirmation + * Added: allow node.js v0.7.x + +0.6.0 / 2012-04-10 +================== + + * Added `.prompt(obj, callback)` support. Closes #49 + * Added default support to .choose(). Closes #41 + * Fixed the choice example + +0.5.1 / 2011-12-20 +================== + + * Fixed `password()` for recent nodes. Closes #36 + +0.5.0 / 2011-12-04 +================== + + * Added sub-command option support [itay] + +0.4.3 / 2011-12-04 +================== + + * Fixed custom help ordering. Closes #32 + +0.4.2 / 2011-11-24 +================== + + * Added travis support + * Fixed: line-buffered input automatically trimmed. Closes #31 + +0.4.1 / 2011-11-18 +================== + + * Removed listening for "close" on --help + +0.4.0 / 2011-11-15 +================== + + * Added support for `--`. Closes #24 + +0.3.3 / 2011-11-14 +================== + + * Fixed: wait for close event when writing help info [Jerry Hamlet] + +0.3.2 / 2011-11-01 +================== + + * Fixed long flag definitions with values [felixge] + +0.3.1 / 2011-10-31 +================== + + * Changed `--version` short flag to `-V` from `-v` + * Changed `.version()` so it's configurable [felixge] + +0.3.0 / 2011-10-31 +================== + + * Added support for long flags only. Closes #18 + +0.2.1 / 2011-10-24 +================== + + * "node": ">= 0.4.x < 0.7.0". Closes #20 + +0.2.0 / 2011-09-26 +================== + + * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] + +0.1.0 / 2011-08-24 +================== + + * Added support for custom `--help` output + +0.0.5 / 2011-08-18 +================== + + * Changed: when the user enters nothing prompt for password again + * Fixed issue with passwords beginning with numbers [NuckChorris] + +0.0.4 / 2011-08-15 +================== + + * Fixed `Commander#args` + +0.0.3 / 2011-08-15 +================== + + * Added default option value support + +0.0.2 / 2011-08-15 +================== + + * Added mask support to `Command#password(str[, mask], fn)` + * Added `Command#password(str, fn)` + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/Makefile b/node_modules/mocha/node_modules/jade/node_modules/commander/Makefile new file mode 100644 index 00000000..00746255 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/Makefile @@ -0,0 +1,7 @@ + +TESTS = $(shell find test/test.*.js) + +test: + @./test/run $(TESTS) + +.PHONY: test \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/Readme.md b/node_modules/mocha/node_modules/jade/node_modules/commander/Readme.md new file mode 100644 index 00000000..b8328c37 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/Readme.md @@ -0,0 +1,262 @@ +# Commander.js + + The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). + + [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) + +## Installation + + $ npm install commander + +## Option parsing + + Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('commander'); + +program + .version('0.0.1') + .option('-p, --peppers', 'Add peppers') + .option('-P, --pineapple', 'Add pineapple') + .option('-b, --bbq', 'Add bbq sauce') + .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') + .parse(process.argv); + +console.log('you ordered a pizza with:'); +if (program.peppers) console.log(' - peppers'); +if (program.pineapple) console.log(' - pineappe'); +if (program.bbq) console.log(' - bbq'); +console.log(' - %s cheese', program.cheese); +``` + + Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +``` + $ ./examples/pizza --help + + Usage: pizza [options] + + Options: + + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineappe + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese [marble] + -h, --help output usage information + +``` + +## Coercion + +```js +function range(val) { + return val.split('..').map(Number); +} + +function list(val) { + return val.split(','); +} + +program + .version('0.0.1') + .usage('[options] ') + .option('-i, --integer ', 'An integer argument', parseInt) + .option('-f, --float ', 'A float argument', parseFloat) + .option('-r, --range ..', 'A range', range) + .option('-l, --list ', 'A list', list) + .option('-o, --optional [value]', 'An optional value') + .parse(process.argv); + +console.log(' int: %j', program.integer); +console.log(' float: %j', program.float); +console.log(' optional: %j', program.optional); +program.range = program.range || []; +console.log(' range: %j..%j', program.range[0], program.range[1]); +console.log(' list: %j', program.list); +console.log(' args: %j', program.args); +``` + +## Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviours, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var program = require('../'); + +function list(val) { + return val.split(',').map(Number); +} + +program + .version('0.0.1') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log(' Examples:'); + console.log(''); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); + console.log(''); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +yielding the following help output: + +``` + +Usage: custom-help [options] + +Options: + + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + + $ custom-help --help + $ custom-help -h + +``` + +## .prompt(msg, fn) + + Single-line prompt: + +```js +program.prompt('name: ', function(name){ + console.log('hi %s', name); +}); +``` + + Multi-line prompt: + +```js +program.prompt('description:', function(name){ + console.log('hi %s', name); +}); +``` + + Coercion: + +```js +program.prompt('Age: ', Number, function(age){ + console.log('age: %j', age); +}); +``` + +```js +program.prompt('Birthdate: ', Date, function(date){ + console.log('date: %s', date); +}); +``` + +## .password(msg[, mask], fn) + +Prompt for password without echoing: + +```js +program.password('Password: ', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +Prompt for password with mask char "*": + +```js +program.password('Password: ', '*', function(pass){ + console.log('got "%s"', pass); + process.stdin.destroy(); +}); +``` + +## .confirm(msg, fn) + + Confirm with the given `msg`: + +```js +program.confirm('continue? ', function(ok){ + console.log(' got %j', ok); +}); +``` + +## .choose(list, fn) + + Let the user choose from a `list`: + +```js +var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + +console.log('Choose the coolest pet:'); +program.choose(list, function(i){ + console.log('you chose %d "%s"', i, list[i]); +}); +``` + +## Links + + - [API documentation](http://visionmedia.github.com/commander.js/) + - [ascii tables](https://github.com/LearnBoost/cli-table) + - [progress bars](https://github.com/visionmedia/node-progress) + - [more progress bars](https://github.com/substack/node-multimeter) + - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) + +## License + +(The MIT License) + +Copyright (c) 2011 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. \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/index.js b/node_modules/mocha/node_modules/jade/node_modules/commander/index.js new file mode 100644 index 00000000..06ec1e4b --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/index.js @@ -0,0 +1,2 @@ + +module.exports = require('./lib/commander'); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/lib/commander.js b/node_modules/mocha/node_modules/jade/node_modules/commander/lib/commander.js new file mode 100644 index 00000000..5ba87ebb --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/lib/commander.js @@ -0,0 +1,1026 @@ + +/*! + * commander + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter + , path = require('path') + , tty = require('tty') + , basename = path.basename; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command; + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = ~flags.indexOf('<'); + this.optional = ~flags.indexOf('['); + this.bool = !~flags.indexOf('-no-'); + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function(){ + return this.long + .replace('--', '') + .replace('no-', ''); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg){ + return arg == this.short + || arg == this.long; +}; + +/** + * Initialize a new `Command`. + * + * @param {String} name + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this.args = []; + this.name = name; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Command.prototype.__proto__ = EventEmitter.prototype; + +/** + * Add command `name`. + * + * The `.action()` callback is invoked when the + * command `name` is specified via __ARGV__, + * and the remaining arguments are applied to the + * function for access. + * + * When the `name` is "*" an un-matched command + * will be passed as the first arg, followed by + * the rest of __ARGV__ remaining. + * + * Examples: + * + * program + * .version('0.0.1') + * .option('-C, --chdir ', 'change the working directory') + * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + * .option('-T, --no-tests', 'ignore test hook') + * + * program + * .command('setup') + * .description('run remote setup commands') + * .action(function(){ + * console.log('setup'); + * }); + * + * program + * .command('exec ') + * .description('run the given remote command') + * .action(function(cmd){ + * console.log('exec "%s"', cmd); + * }); + * + * program + * .command('*') + * .description('deploy the given env') + * .action(function(env){ + * console.log('deploying "%s"', env); + * }); + * + * program.parse(process.argv); + * + * @param {String} name + * @return {Command} the new command + * @api public + */ + +Command.prototype.command = function(name){ + var args = name.split(/ +/); + var cmd = new Command(args.shift()); + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + return cmd; +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args){ + if (!args.length) return; + var self = this; + args.forEach(function(arg){ + switch (arg[0]) { + case '<': + self.args.push({ required: true, name: arg.slice(1, -1) }); + break; + case '[': + self.args.push({ required: false, name: arg.slice(1, -1) }); + break; + } + }); + return this; +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function(){ + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn){ + var self = this; + this.parent.on(this.name, function(args, unknown){ + // Parse any so-far unknown options + unknown = unknown || []; + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfNecessary(self, parsed.unknown); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + self.args.forEach(function(arg, i){ + if (arg.required && null == args[i]) { + self.missingArgument(arg.name); + } + }); + + // Always append ourselves to the end of the arguments, + // to make sure we match the number of arguments the user + // expects + if (self.args.length) { + args[self.args.length] = self; + } else { + args.push(self); + } + + fn.apply(this, args); + }); + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to false + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => true + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|Mixed} fn or default + * @param {Mixed} defaultValue + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue){ + var self = this + , option = new Option(flags, description) + , oname = option.name() + , name = camelcase(oname); + + // default as 3rd arg + if ('function' != typeof fn) defaultValue = fn, fn = null; + + // preassign default value only for --no-*, [optional], or + if (false == option.bool || option.optional || option.required) { + // when --no-* we make sure default is true + if (false == option.bool) defaultValue = true; + // preassign only if we have a default + if (undefined !== defaultValue) self[name] = defaultValue; + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on(oname, function(val){ + // coercion + if (null != val && fn) val = fn(val); + + // unassigned or bool + if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { + // if no value, bool true, and we have a default, then use it! + if (null == val) { + self[name] = option.bool + ? defaultValue || true + : false; + } else { + self[name] = val; + } + } else if (null !== val) { + // reassign + self[name] = val; + } + }); + + return this; +}; + +/** + * Parse `argv`, settings options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv){ + // store raw args + this.rawArgs = argv; + + // guess name + if (!this.name) this.name = basename(argv[1]); + + // process argv + var parsed = this.parseOptions(this.normalize(argv.slice(2))); + this.args = parsed.args; + return this.parseArgs(this.args, parsed.unknown); +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args){ + var ret = [] + , arg; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { + arg.slice(1).split('').forEach(function(c){ + ret.push('-' + c); + }); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown){ + var cmds = this.commands + , len = cmds.length + , name; + + if (args.length) { + name = args[0]; + if (this.listeners(name).length) { + this.emit(args.shift(), args, unknown); + } else { + this.emit('*', args); + } + } else { + outputHelpIfNecessary(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0) { + this.unknownOption(unknown[0]); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg){ + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {Array} + * @api public + */ + +Command.prototype.parseOptions = function(argv){ + var args = [] + , len = argv.length + , literal + , option + , arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if ('--' == arg) { + literal = true; + continue; + } + + if (literal) { + args.push(arg); + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (null == arg) return this.optionMissingArgument(option); + if ('-' == arg[0]) return this.optionMissingArgument(option, arg); + this.emit(option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i+1]; + if (null == arg || '-' == arg[0]) { + arg = null; + } else { + ++i; + } + this.emit(option.name(), arg); + // bool + } else { + this.emit(option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && '-' == arg[0]) { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if (argv[i+1] && '-' != argv[i+1][0]) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name){ + console.error(); + console.error(" error: missing required argument `%s'", name); + console.error(); + process.exit(1); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {String} option + * @param {String} flag + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag){ + console.error(); + if (flag) { + console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); + } else { + console.error(" error: option `%s' argument missing", option.flags); + } + console.error(); + process.exit(1); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag){ + console.error(); + console.error(" error: unknown option `%s'", flag); + console.error(); + process.exit(1); +}; + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * @param {String} str + * @param {String} flags + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags){ + if (0 == arguments.length) return this._version; + this._version = str; + flags = flags || '-V, --version'; + this.option(flags, 'output the version number'); + this.on('version', function(){ + console.log(str); + process.exit(0); + }); + return this; +}; + +/** + * Set the description `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str){ + if (0 == arguments.length) return this._description; + this._description = str; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} str + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str){ + var args = this.args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }); + + var usage = '[options' + + (this.commands.length ? '] [command' : '') + + ']' + + (this.args.length ? ' ' + args : ''); + if (0 == arguments.length) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function(){ + return this.options.reduce(function(max, option){ + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function(){ + var width = this.largestOptionLength(); + + // Prepend the help information + return [pad('-h, --help', width) + ' ' + 'output usage information'] + .concat(this.options.map(function(option){ + return pad(option.flags, width) + + ' ' + option.description; + })) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function(){ + if (!this.commands.length) return ''; + return [ + '' + , ' Commands:' + , '' + , this.commands.map(function(cmd){ + var args = cmd.args.map(function(arg){ + return arg.required + ? '<' + arg.name + '>' + : '[' + arg.name + ']'; + }).join(' '); + + return cmd.name + + (cmd.options.length + ? ' [options]' + : '') + ' ' + args + + (cmd.description() + ? '\n' + cmd.description() + : ''); + }).join('\n\n').replace(/^/gm, ' ') + , '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function(){ + return [ + '' + , ' Usage: ' + this.name + ' ' + this.usage() + , '' + this.commandHelp() + , ' Options:' + , '' + , '' + this.optionHelp().replace(/^/gm, ' ') + , '' + , '' + ].join('\n'); +}; + +/** + * Prompt for a `Number`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForNumber = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseNumber(val){ + val = Number(val); + if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); + fn(val); + }); +}; + +/** + * Prompt for a `Date`. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptForDate = function(str, fn){ + var self = this; + this.promptSingleLine(str, function parseDate(val){ + val = new Date(val); + if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); + fn(val); + }); +}; + +/** + * Single-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptSingleLine = function(str, fn){ + if ('function' == typeof arguments[2]) { + return this['promptFor' + (fn.name || fn)](str, arguments[2]); + } + + process.stdout.write(str); + process.stdin.setEncoding('utf8'); + process.stdin.once('data', function(val){ + fn(val.trim()); + }).resume(); +}; + +/** + * Multi-line prompt. + * + * @param {String} str + * @param {Function} fn + * @api private + */ + +Command.prototype.promptMultiLine = function(str, fn){ + var buf = []; + console.log(str); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function(val){ + if ('\n' == val || '\r\n' == val) { + process.stdin.removeAllListeners('data'); + fn(buf.join('\n')); + } else { + buf.push(val.trimRight()); + } + }).resume(); +}; + +/** + * Prompt `str` and callback `fn(val)` + * + * Commander supports single-line and multi-line prompts. + * To issue a single-line prompt simply add white-space + * to the end of `str`, something like "name: ", whereas + * for a multi-line prompt omit this "description:". + * + * + * Examples: + * + * program.prompt('Username: ', function(name){ + * console.log('hi %s', name); + * }); + * + * program.prompt('Description:', function(desc){ + * console.log('description was "%s"', desc.trim()); + * }); + * + * @param {String|Object} str + * @param {Function} fn + * @api public + */ + +Command.prototype.prompt = function(str, fn){ + var self = this; + + if ('string' == typeof str) { + if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); + this.promptMultiLine(str, fn); + } else { + var keys = Object.keys(str) + , obj = {}; + + function next() { + var key = keys.shift() + , label = str[key]; + + if (!key) return fn(obj); + self.prompt(label, function(val){ + obj[key] = val; + next(); + }); + } + + next(); + } +}; + +/** + * Prompt for password with `str`, `mask` char and callback `fn(val)`. + * + * The mask string defaults to '', aka no output is + * written while typing, you may want to use "*" etc. + * + * Examples: + * + * program.password('Password: ', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * program.password('Password: ', '*', function(pass){ + * console.log('got "%s"', pass); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {String} mask + * @param {Function} fn + * @api public + */ + +Command.prototype.password = function(str, mask, fn){ + var self = this + , buf = ''; + + // default mask + if ('function' == typeof mask) { + fn = mask; + mask = ''; + } + + process.stdin.resume(); + tty.setRawMode(true); + process.stdout.write(str); + + // keypress + process.stdin.on('keypress', function(c, key){ + if (key && 'enter' == key.name) { + console.log(); + process.stdin.removeAllListeners('keypress'); + tty.setRawMode(false); + if (!buf.trim().length) return self.password(str, mask, fn); + fn(buf); + return; + } + + if (key && key.ctrl && 'c' == key.name) { + console.log('%s', buf); + process.exit(); + } + + process.stdout.write(mask); + buf += c; + }).resume(); +}; + +/** + * Confirmation prompt with `str` and callback `fn(bool)` + * + * Examples: + * + * program.confirm('continue? ', function(ok){ + * console.log(' got %j', ok); + * process.stdin.destroy(); + * }); + * + * @param {String} str + * @param {Function} fn + * @api public + */ + + +Command.prototype.confirm = function(str, fn, verbose){ + var self = this; + this.prompt(str, function(ok){ + if (!ok.trim()) { + if (!verbose) str += '(yes or no) '; + return self.confirm(str, fn, true); + } + fn(parseBool(ok)); + }); +}; + +/** + * Choice prompt with `list` of items and callback `fn(index, item)` + * + * Examples: + * + * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; + * + * console.log('Choose the coolest pet:'); + * program.choose(list, function(i){ + * console.log('you chose %d "%s"', i, list[i]); + * process.stdin.destroy(); + * }); + * + * @param {Array} list + * @param {Number|Function} index or fn + * @param {Function} fn + * @api public + */ + +Command.prototype.choose = function(list, index, fn){ + var self = this + , hasDefault = 'number' == typeof index; + + if (!hasDefault) { + fn = index; + index = null; + } + + list.forEach(function(item, i){ + if (hasDefault && i == index) { + console.log('* %d) %s', i + 1, item); + } else { + console.log(' %d) %s', i + 1, item); + } + }); + + function again() { + self.prompt(' : ', function(val){ + val = parseInt(val, 10) - 1; + if (hasDefault && isNaN(val)) val = index; + + if (null == list[val]) { + again(); + } else { + fn(val, list[val]); + } + }); + } + + again(); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word){ + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Parse a boolean `str`. + * + * @param {String} str + * @return {Boolean} + * @api private + */ + +function parseBool(str) { + return /^y|yes|ok|true$/i.test(str); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Output help information if necessary + * + * @param {Command} command to output help for + * @param {Array} array of options to search for -h or --help + * @api private + */ + +function outputHelpIfNecessary(cmd, options) { + options = options || []; + for (var i = 0; i < options.length; i++) { + if (options[i] == '--help' || options[i] == '-h') { + process.stdout.write(cmd.helpInformation()); + cmd.emit('--help'); + process.exit(0); + } + } +} diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/package.json b/node_modules/mocha/node_modules/jade/node_modules/commander/package.json new file mode 100644 index 00000000..92f2ed79 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/package.json @@ -0,0 +1,39 @@ +{ + "name": "commander", + "version": "0.6.1", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "command", + "option", + "parser", + "prompt", + "stdin" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "https://github.com/visionmedia/commander.js.git" + }, + "dependencies": {}, + "devDependencies": { + "should": ">= 0.0.1" + }, + "scripts": { + "test": "make test" + }, + "main": "index", + "engines": { + "node": ">= 0.4.x" + }, + "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "homepage": "https://github.com/visionmedia/commander.js", + "_id": "commander@0.6.1", + "_from": "commander@0.6.1" +} diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.orig @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej new file mode 100644 index 00000000..69244ff8 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.gitignore.rej @@ -0,0 +1,5 @@ +--- /dev/null ++++ .gitignore +@@ -0,0 +1,2 @@ ++node_modules/ ++npm-debug.log \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000..432d1aeb --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +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/mocha/node_modules/jade/node_modules/mkdirp/README.markdown b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown new file mode 100644 index 00000000..b4dd75fd --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/README.markdown @@ -0,0 +1,54 @@ +mkdirp +====== + +Like `mkdir -p`, but in node.js! + +example +======= + +pow.js +------ + var mkdirp = require('mkdirp'); + + mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') + }); + +Output + pow! + +And now /tmp/foo/bar/baz exists, huzzah! + +methods +======= + +var mkdirp = require('mkdirp'); + +mkdirp(dir, mode, cb) +--------------------- + +Create a new directory and any necessary subdirectories at `dir` with octal +permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +mkdirp.sync(dir, mode) +---------------------- + +Synchronously create a new directory and any necessary subdirectories at `dir` +with octal permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +install +======= + +With [npm](http://npmjs.org) do: + + npm install mkdirp + +license +======= + +MIT/X11 diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js new file mode 100644 index 00000000..e6924212 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig new file mode 100644 index 00000000..77414622 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej new file mode 100644 index 00000000..81e7f431 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej @@ -0,0 +1,19 @@ +--- examples/pow.js ++++ examples/pow.js +@@ -1,6 +1,15 @@ +-var mkdirp = require('mkdirp').mkdirp; ++var mkdirp = require('../').mkdirp, ++ mkdirpSync = require('../').mkdirpSync; + + mkdirp('/tmp/foo/bar/baz', 0755, function (err) { + if (err) console.error(err) + else console.log('pow!') + }); ++ ++try { ++ mkdirpSync('/tmp/bar/foo/baz', 0755); ++ console.log('double pow!'); ++} ++catch (ex) { ++ console.log(ex); ++} \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js new file mode 100644 index 00000000..25f43adf --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/index.js @@ -0,0 +1,79 @@ +var path = require('path'); +var fs = require('fs'); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, mode, f) { + if (typeof mode === 'function' || mode === undefined) { + f = mode; + mode = 0777 & (~process.umask()); + } + + var cb = f || function () {}; + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + fs.mkdir(p, mode, function (er) { + if (!er) return cb(); + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), mode, function (er) { + if (er) cb(er); + else mkdirP(p, mode, cb); + }); + break; + + case 'EEXIST': + fs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original EEXIST be the failure reason. + if (er2 || !stat.isDirectory()) cb(er) + else cb(); + }); + break; + + default: + cb(er); + break; + } + }); +} + +mkdirP.sync = function sync (p, mode) { + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + try { + fs.mkdirSync(p, mode) + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + var err1 = sync(path.dirname(p), mode) + if (err1) throw err1; + else return sync(p, mode); + break; + + case 'EEXIST' : + var stat; + try { + stat = fs.statSync(p); + } + catch (err1) { + throw err0 + } + if (!stat.isDirectory()) throw err0; + else return null; + break; + default : + throw err0 + break; + } + } + + return null; +}; diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json new file mode 100644 index 00000000..78638866 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json @@ -0,0 +1,37 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": [ + "mkdir", + "directory" + ], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "devDependencies": { + "tap": "0.0.x" + }, + "license": "MIT/X11", + "engines": { + "node": "*" + }, + "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", + "readmeFilename": "README.markdown", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.3.0", + "_from": "mkdirp@0.3.0" +} diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js new file mode 100644 index 00000000..520dcb8e --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/chmod.js @@ -0,0 +1,38 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +test('chmod-pre', function (t) { + var mode = 0744 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); + t.end(); + }); + }); +}); + +test('chmod', function (t) { + var mode = 0755 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.end(); + }); + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js new file mode 100644 index 00000000..0eb70998 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/clobber.js @@ -0,0 +1,37 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +// a file in the way +var itw = ps.slice(0, 3).join('/'); + + +test('clobber-pre', function (t) { + console.error("about to write to "+itw) + fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); + + fs.stat(itw, function (er, stat) { + t.ifError(er) + t.ok(stat && stat.isFile(), 'should be file') + t.end() + }) +}) + +test('clobber', function (t) { + t.plan(2); + mkdirp(file, 0755, function (err) { + t.ok(err); + t.equal(err.code, 'ENOTDIR'); + t.end(); + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js new file mode 100644 index 00000000..b07cd70c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/mkdirp.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('woo', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js new file mode 100644 index 00000000..23a7abbd --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('async perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); + +test('async root perm', function (t) { + mkdirp('/tmp', 0755, function (err) { + if (err) t.fail(err); + t.end(); + }); + t.end(); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js new file mode 100644 index 00000000..f685f609 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/perm_sync.js @@ -0,0 +1,39 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; + + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); + +test('sync root perm', function (t) { + t.plan(1); + + var file = '/tmp'; + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js new file mode 100644 index 00000000..96a04476 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/race.js @@ -0,0 +1,41 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('race', function (t) { + t.plan(4); + var ps = [ '', 'tmp' ]; + + for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); + } + var file = ps.join('/'); + + var res = 2; + mk(file, function () { + if (--res === 0) t.end(); + }); + + mk(file, function () { + if (--res === 0) t.end(); + }); + + function mk (file, cb) { + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + if (cb) cb(); + } + }) + }) + }); + } +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js new file mode 100644 index 00000000..79858243 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/rel.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('rel', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var cwd = process.cwd(); + process.chdir('/tmp'); + + var file = [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + process.chdir(cwd); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js new file mode 100644 index 00000000..e0e389de --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/sync.js @@ -0,0 +1,27 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + var err = mkdirp.sync(file, 0755); + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js new file mode 100644 index 00000000..64ccafe2 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('implicit mode from umask', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0777 & (~process.umask())); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js new file mode 100644 index 00000000..83cba560 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/test/umask_sync.js @@ -0,0 +1,27 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('umask sync modes', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + var err = mkdirp.sync(file); + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, (0777 & (~process.umask()))); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) +}); diff --git a/node_modules/mocha/node_modules/jade/package.json b/node_modules/mocha/node_modules/jade/package.json new file mode 100644 index 00000000..689d82d7 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/package.json @@ -0,0 +1,48 @@ +{ + "name": "jade", + "description": "Jade template engine", + "version": "0.26.3", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/jade" + }, + "main": "./index.js", + "bin": { + "jade": "./bin/jade" + }, + "man": [ + "./jade.1" + ], + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "devDependencies": { + "mocha": "*", + "markdown": "*", + "stylus": "*", + "uubench": "*", + "should": "*", + "less": "*", + "uglify-js": "*" + }, + "component": { + "scripts": { + "jade": "runtime.js" + } + }, + "scripts": { + "prepublish": "npm prune" + }, + "bugs": { + "url": "https://github.com/visionmedia/jade/issues" + }, + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/visionmedia/jade", + "_id": "jade@0.26.3", + "_from": "jade@0.26.3" +} diff --git a/node_modules/mocha/node_modules/jade/runtime.js b/node_modules/mocha/node_modules/jade/runtime.js new file mode 100644 index 00000000..0f549077 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/runtime.js @@ -0,0 +1,179 @@ + +jade = (function(exports){ +/*! + * Jade - runtime + * Copyright(c) 2010 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Lame Array.isArray() polyfill for now. + */ + +if (!Array.isArray) { + Array.isArray = function(arr){ + return '[object Array]' == Object.prototype.toString.call(arr); + }; +} + +/** + * Lame Object.keys() polyfill for now. + */ + +if (!Object.keys) { + Object.keys = function(obj){ + var arr = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + } +} + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = function merge(a, b) { + var ac = a['class']; + var bc = b['class']; + + if (ac || bc) { + ac = ac || []; + bc = bc || []; + if (!Array.isArray(ac)) ac = [ac]; + if (!Array.isArray(bc)) bc = [bc]; + ac = ac.filter(nulls); + bc = bc.filter(nulls); + a['class'] = ac.concat(bc).join(' '); + } + + for (var key in b) { + if (key != 'class') { + a[key] = b[key]; + } + } + + return a; +}; + +/** + * Filter null `val`s. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function nulls(val) { + return val != null; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} escaped + * @return {String} + * @api private + */ + +exports.attrs = function attrs(obj, escaped){ + var buf = [] + , terse = obj.terse; + + delete obj.terse; + var keys = Object.keys(obj) + , len = keys.length; + + if (len) { + buf.push(''); + for (var i = 0; i < len; ++i) { + var key = keys[i] + , val = obj[key]; + + if ('boolean' == typeof val || null == val) { + if (val) { + terse + ? buf.push(key) + : buf.push(key + '="' + key + '"'); + } + } else if (0 == key.indexOf('data') && 'string' != typeof val) { + buf.push(key + "='" + JSON.stringify(val) + "'"); + } else if ('class' == key && Array.isArray(val)) { + buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); + } else if (escaped && escaped[key]) { + buf.push(key + '="' + exports.escape(val) + '"'); + } else { + buf.push(key + '="' + val + '"'); + } + } + } + + return buf.join(' '); +}; + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function escape(html){ + return String(html) + .replace(/&(?!(\w+|\#\d+);)/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +}; + +/** + * Re-throw the given `err` in context to the + * the jade in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @api private + */ + +exports.rethrow = function rethrow(err, filename, lineno){ + if (!filename) throw err; + + var context = 3 + , str = require('fs').readFileSync(filename, 'utf8') + , lines = str.split('\n') + , start = Math.max(lineno - context, 0) + , end = Math.min(lines.length, lineno + context); + + // Error context + var context = lines.slice(start, end).map(function(line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'Jade') + ':' + lineno + + '\n' + context + '\n\n' + err.message; + throw err; +}; + + return exports; + +})({}); diff --git a/node_modules/mocha/node_modules/jade/runtime.min.js b/node_modules/mocha/node_modules/jade/runtime.min.js new file mode 100644 index 00000000..1714efb0 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/runtime.min.js @@ -0,0 +1 @@ +jade=function(exports){Array.isArray||(Array.isArray=function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}),Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),exports.merge=function merge(a,b){var ac=a["class"],bc=b["class"];if(ac||bc)ac=ac||[],bc=bc||[],Array.isArray(ac)||(ac=[ac]),Array.isArray(bc)||(bc=[bc]),ac=ac.filter(nulls),bc=bc.filter(nulls),a["class"]=ac.concat(bc).join(" ");for(var key in b)key!="class"&&(a[key]=b[key]);return a};function nulls(val){return val!=null}return exports.attrs=function attrs(obj,escaped){var buf=[],terse=obj.terse;delete obj.terse;var keys=Object.keys(obj),len=keys.length;if(len){buf.push("");for(var i=0;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err},exports}({}); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/test.jade b/node_modules/mocha/node_modules/jade/test.jade new file mode 100644 index 00000000..b3a89889 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/test.jade @@ -0,0 +1,7 @@ +p. + This is a large + body of text for + this tag. + + Nothing too + exciting. \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/testing/head.jade b/node_modules/mocha/node_modules/jade/testing/head.jade new file mode 100644 index 00000000..85154062 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/head.jade @@ -0,0 +1,5 @@ +head + script(src='/jquery.js') + yield + if false + script(src='/jquery.ui.js') diff --git a/node_modules/mocha/node_modules/jade/testing/index.jade b/node_modules/mocha/node_modules/jade/testing/index.jade new file mode 100644 index 00000000..1032c5fa --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/index.jade @@ -0,0 +1,22 @@ + +tag = 'p' +foo = 'bar' + +#{tag} value +#{tag}(foo='bar') value +#{foo ? 'a' : 'li'}(something) here + +mixin item(icon) + li + if attributes.href + a(attributes) + img.icon(src=icon) + block + else + span(attributes) + img.icon(src=icon) + block + +ul + +item('contact') Contact + +item(href='/contact') Contact diff --git a/node_modules/mocha/node_modules/jade/testing/index.js b/node_modules/mocha/node_modules/jade/testing/index.js new file mode 100644 index 00000000..226e8c01 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/index.js @@ -0,0 +1,11 @@ + +/** + * Module dependencies. + */ + +var jade = require('../'); + +jade.renderFile('testing/index.jade', { pretty: true, debug: true, compileDebug: false }, function(err, str){ + if (err) throw err; + console.log(str); +}); \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/testing/layout.jade b/node_modules/mocha/node_modules/jade/testing/layout.jade new file mode 100644 index 00000000..6923cf15 --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/layout.jade @@ -0,0 +1,6 @@ +html + include head + script(src='/caustic.js') + script(src='/app.js') + body + block content \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/testing/user.jade b/node_modules/mocha/node_modules/jade/testing/user.jade new file mode 100644 index 00000000..3c636b7c --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/user.jade @@ -0,0 +1,7 @@ +h1 Tobi +p Is a ferret + +ul + li: a foo + li: a bar + li: a baz \ No newline at end of file diff --git a/node_modules/mocha/node_modules/jade/testing/user.js b/node_modules/mocha/node_modules/jade/testing/user.js new file mode 100644 index 00000000..2ecc45ed --- /dev/null +++ b/node_modules/mocha/node_modules/jade/testing/user.js @@ -0,0 +1,27 @@ +function anonymous(locals, attrs, escape, rethrow) { +var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow; +var __jade = [{ lineno: 1, filename: "testing/user.jade" }]; +try { +var buf = []; +with (locals || {}) { +var interp; +__jade.unshift({ lineno: 1, filename: __jade[0].filename }); +__jade.unshift({ lineno: 1, filename: __jade[0].filename }); +buf.push('

        Tobi'); +__jade.unshift({ lineno: undefined, filename: __jade[0].filename }); +__jade.shift(); +buf.push('

        '); +__jade.shift(); +__jade.unshift({ lineno: 2, filename: __jade[0].filename }); +buf.push('

        Is a ferret'); +__jade.unshift({ lineno: undefined, filename: __jade[0].filename }); +__jade.shift(); +buf.push('

        '); +__jade.shift(); +__jade.shift(); +} +return buf.join(""); +} catch (err) { + rethrow(err, __jade[0].filename, __jade[0].lineno); +} +} \ No newline at end of file diff --git a/node_modules/mocha/node_modules/mkdirp/.npmignore b/node_modules/mocha/node_modules/mkdirp/.npmignore new file mode 100644 index 00000000..9303c347 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/mocha/node_modules/mkdirp/.travis.yml b/node_modules/mocha/node_modules/mkdirp/.travis.yml new file mode 100644 index 00000000..84fd7ca2 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - 0.9 diff --git a/node_modules/mocha/node_modules/mkdirp/LICENSE b/node_modules/mocha/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000..432d1aeb --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +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/mocha/node_modules/mkdirp/examples/pow.js b/node_modules/mocha/node_modules/mkdirp/examples/pow.js new file mode 100644 index 00000000..e6924212 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/examples/pow.js @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/mocha/node_modules/mkdirp/index.js b/node_modules/mocha/node_modules/mkdirp/index.js new file mode 100644 index 00000000..fda6de8a --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/index.js @@ -0,0 +1,82 @@ +var path = require('path'); +var fs = require('fs'); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, mode, f, made) { + if (typeof mode === 'function' || mode === undefined) { + f = mode; + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + fs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), mode, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, mode, cb, made); + }); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + fs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} + +mkdirP.sync = function sync (p, mode, made) { + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + if (typeof mode === 'string') mode = parseInt(mode, 8); + p = path.resolve(p); + + try { + fs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), mode, made); + sync(p, mode, made); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = fs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } + + return made; +}; diff --git a/node_modules/mocha/node_modules/mkdirp/package.json b/node_modules/mocha/node_modules/mkdirp/package.json new file mode 100644 index 00000000..a71d8b77 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/package.json @@ -0,0 +1,34 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.5", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": [ + "mkdir", + "directory" + ], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "devDependencies": { + "tap": "~0.4.0" + }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.3.5", + "_from": "mkdirp@0.3.5" +} diff --git a/node_modules/mocha/node_modules/mkdirp/readme.markdown b/node_modules/mocha/node_modules/mkdirp/readme.markdown new file mode 100644 index 00000000..83b0216a --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/readme.markdown @@ -0,0 +1,63 @@ +# mkdirp + +Like `mkdir -p`, but in node.js! + +[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) + +# example + +## pow.js + +```js +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); +``` + +Output + +``` +pow! +``` + +And now /tmp/foo/bar/baz exists, huzzah! + +# methods + +```js +var mkdirp = require('mkdirp'); +``` + +## mkdirp(dir, mode, cb) + +Create a new directory and any necessary subdirectories at `dir` with octal +permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +`cb(err, made)` fires with the error or the first directory `made` +that had to be created, if any. + +## mkdirp.sync(dir, mode) + +Synchronously create a new directory and any necessary subdirectories at `dir` +with octal permission string `mode`. + +If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +Returns the first directory that had to be created, if any. + +# install + +With [npm](http://npmjs.org) do: + +``` +npm install mkdirp +``` + +# license + +MIT diff --git a/node_modules/mocha/node_modules/mkdirp/test/chmod.js b/node_modules/mocha/node_modules/mkdirp/test/chmod.js new file mode 100644 index 00000000..520dcb8e --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/chmod.js @@ -0,0 +1,38 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +test('chmod-pre', function (t) { + var mode = 0744 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); + t.end(); + }); + }); +}); + +test('chmod', function (t) { + var mode = 0755 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.end(); + }); + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/clobber.js b/node_modules/mocha/node_modules/mkdirp/test/clobber.js new file mode 100644 index 00000000..0eb70998 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/clobber.js @@ -0,0 +1,37 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +// a file in the way +var itw = ps.slice(0, 3).join('/'); + + +test('clobber-pre', function (t) { + console.error("about to write to "+itw) + fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); + + fs.stat(itw, function (er, stat) { + t.ifError(er) + t.ok(stat && stat.isFile(), 'should be file') + t.end() + }) +}) + +test('clobber', function (t) { + t.plan(2); + mkdirp(file, 0755, function (err) { + t.ok(err); + t.equal(err.code, 'ENOTDIR'); + t.end(); + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/mkdirp.js b/node_modules/mocha/node_modules/mkdirp/test/mkdirp.js new file mode 100644 index 00000000..b07cd70c --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/mkdirp.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('woo', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/perm.js b/node_modules/mocha/node_modules/mkdirp/test/perm.js new file mode 100644 index 00000000..23a7abbd --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/perm.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('async perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); + +test('async root perm', function (t) { + mkdirp('/tmp', 0755, function (err) { + if (err) t.fail(err); + t.end(); + }); + t.end(); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/perm_sync.js b/node_modules/mocha/node_modules/mkdirp/test/perm_sync.js new file mode 100644 index 00000000..f685f609 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/perm_sync.js @@ -0,0 +1,39 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync perm', function (t) { + t.plan(2); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; + + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); + +test('sync root perm', function (t) { + t.plan(1); + + var file = '/tmp'; + mkdirp.sync(file, 0755); + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/race.js b/node_modules/mocha/node_modules/mkdirp/test/race.js new file mode 100644 index 00000000..96a04476 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/race.js @@ -0,0 +1,41 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('race', function (t) { + t.plan(4); + var ps = [ '', 'tmp' ]; + + for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); + } + var file = ps.join('/'); + + var res = 2; + mk(file, function () { + if (--res === 0) t.end(); + }); + + mk(file, function () { + if (--res === 0) t.end(); + }); + + function mk (file, cb) { + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + if (cb) cb(); + } + }) + }) + }); + } +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/rel.js b/node_modules/mocha/node_modules/mkdirp/test/rel.js new file mode 100644 index 00000000..79858243 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/rel.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('rel', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var cwd = process.cwd(); + process.chdir('/tmp'); + + var file = [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + process.chdir(cwd); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/return.js b/node_modules/mocha/node_modules/mkdirp/test/return.js new file mode 100644 index 00000000..bce68e56 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/return.js @@ -0,0 +1,25 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(4); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, '/tmp/' + x); + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, null); + }); + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/return_sync.js b/node_modules/mocha/node_modules/mkdirp/test/return_sync.js new file mode 100644 index 00000000..7c222d35 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/return_sync.js @@ -0,0 +1,24 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + // Note that this will throw on failure, which will fail the test. + var made = mkdirp.sync(file); + t.equal(made, '/tmp/' + x); + + // making the same file again should have no effect. + made = mkdirp.sync(file); + t.equal(made, null); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/root.js b/node_modules/mocha/node_modules/mkdirp/test/root.js new file mode 100644 index 00000000..97ad7a2f --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/root.js @@ -0,0 +1,18 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('root', function (t) { + // '/' on unix, 'c:/' on windows. + var file = path.resolve('/'); + + mkdirp(file, 0755, function (err) { + if (err) throw err + fs.stat(file, function (er, stat) { + if (er) throw er + t.ok(stat.isDirectory(), 'target is a directory'); + t.end(); + }) + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/sync.js b/node_modules/mocha/node_modules/mkdirp/test/sync.js new file mode 100644 index 00000000..7530cada --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/sync.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('sync', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file, 0755); + } catch (err) { + t.fail(err); + return t.end(); + } + + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }); + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/umask.js b/node_modules/mocha/node_modules/mkdirp/test/umask.js new file mode 100644 index 00000000..64ccafe2 --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/umask.js @@ -0,0 +1,28 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('implicit mode from umask', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, function (err) { + if (err) t.fail(err); + else path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, 0777 & (~process.umask())); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }) + }) + }); +}); diff --git a/node_modules/mocha/node_modules/mkdirp/test/umask_sync.js b/node_modules/mocha/node_modules/mkdirp/test/umask_sync.js new file mode 100644 index 00000000..35bd5cbb --- /dev/null +++ b/node_modules/mocha/node_modules/mkdirp/test/umask_sync.js @@ -0,0 +1,32 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('umask sync modes', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file); + } catch (err) { + t.fail(err); + return t.end(); + } + + path.exists(file, function (ex) { + if (!ex) t.fail('file not created') + else fs.stat(file, function (err, stat) { + if (err) t.fail(err) + else { + t.equal(stat.mode & 0777, (0777 & (~process.umask()))); + t.ok(stat.isDirectory(), 'target not a directory'); + t.end(); + } + }); + }); +}); diff --git a/node_modules/mocha/package.json b/node_modules/mocha/package.json new file mode 100644 index 00000000..8bc51678 --- /dev/null +++ b/node_modules/mocha/package.json @@ -0,0 +1,60 @@ +{ + "name": "mocha", + "version": "1.17.1", + "description": "simple, flexible, fun test framework", + "keywords": [ + "mocha", + "test", + "bdd", + "tdd", + "tap" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/mocha.git" + }, + "main": "./index", + "bin": { + "mocha": "./bin/mocha", + "_mocha": "./bin/_mocha" + }, + "engines": { + "node": ">= 0.4.x" + }, + "scripts": { + "test": "make test-all" + }, + "dependencies": { + "commander": "2.0.0", + "growl": "1.7.x", + "jade": "0.26.3", + "diff": "1.0.7", + "debug": "*", + "mkdirp": "0.3.5", + "glob": "3.2.3" + }, + "devDependencies": { + "should": ">= 2.0.x", + "coffee-script": "1.2" + }, + "files": [ + "bin", + "images", + "lib", + "index.js", + "mocha.css", + "mocha.js" + ], + "readme": " [![Build Status](https://secure.travis-ci.org/visionmedia/mocha.png)](http://travis-ci.org/visionmedia/mocha)\n\n [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://visionmedia.github.io/mocha)\n\n Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://visionmedia.github.io/mocha).\n\n## Contributors\n\n```\n\n project : mocha\n repo age : 2 years, 4 months ago\n commits : 1314\n active : 372 days\n files : 141\n authors :\n 582 TJ Holowaychuk 44.3%\n 389 Tj Holowaychuk 29.6%\n 46 Travis Jeffery 3.5%\n 31 Guillermo Rauch 2.4%\n 13 Attila Domokos 1.0%\n 10 John Firebaugh 0.8%\n 8 Jo Liss 0.6%\n 7 Nathan Rajlich 0.5%\n 6 Mike Pennisi 0.5%\n 6 James Carr 0.5%\n 6 Brendan Nee 0.5%\n 5 Aaron Heckmann 0.4%\n 5 Ryunosuke SATO 0.4%\n 4 hokaccha 0.3%\n 4 Joshua Krall 0.3%\n 4 Xavier Antoviaque 0.3%\n 3 Jesse Dailey 0.2%\n 3 Forbes Lindesay 0.2%\n 3 Sindre Sorhus 0.2%\n 3 Cory Thomas 0.2%\n 3 Fredrik Enestad 0.2%\n 3 Ben Lindsey 0.2%\n 3 Tyson Tate 0.2%\n 3 Mathieu Desvé 0.2%\n 3 Valentin Agachi 0.2%\n 3 Wil Moore III 0.2%\n 3 Merrick Christensen 0.2%\n 3 eiji.ienaga 0.2%\n 3 fool2fish 0.2%\n 3 Nathan Bowser 0.2%\n 3 Paul Miller 0.2%\n 2 Juzer Ali 0.2%\n 2 Pete Hawkins 0.2%\n 2 Jonas Westerlund 0.2%\n 2 Arian Stolwijk 0.2%\n 2 Quang Van 0.2%\n 2 Glen Mailer 0.2%\n 2 Justin DuJardin 0.2%\n 2 FARKAS Máté 0.2%\n 2 Raynos 0.2%\n 2 Michael Riley 0.2%\n 2 Michael Schoonmaker 0.2%\n 2 Domenic Denicola 0.2%\n 2 Simon Gaeremynck 0.2%\n 2 Konstantin Käfer 0.2%\n 2 domenic 0.2%\n 2 Paul Armstrong 0.2%\n 2 fcrisci 0.2%\n 2 Alexander Early 0.2%\n 2 Shawn Krisman 0.2%\n 2 Brian Beck 0.2%\n 2 Nathan Alderson 0.2%\n 2 David Henderson 0.2%\n 2 Timo Tijhof 0.2%\n 2 Ian Storm Taylor 0.2%\n 2 travis jeffery 0.2%\n 1 Matt Smith 0.1%\n 1 Matthew Shanley 0.1%\n 1 Nathan Black 0.1%\n 1 Phil Sung 0.1%\n 1 R56 0.1%\n 1 Refael Ackermann 0.1%\n 1 Richard Dingwall 0.1%\n 1 Romain Prieto 0.1%\n 1 Roman Neuhauser 0.1%\n 1 Roman Shtylman 0.1%\n 1 Russ Bradberry 0.1%\n 1 Russell Munson 0.1%\n 1 Rustem Mustafin 0.1%\n 1 Salehen Shovon Rahman 0.1%\n 1 Sasha Koss 0.1%\n 1 Seiya Konno 0.1%\n 1 Simon Goumaz 0.1%\n 1 Standa Opichal 0.1%\n 1 Stephen Mathieson 0.1%\n 1 Steve Mason 0.1%\n 1 Tapiwa Kelvin 0.1%\n 1 Teddy Zeenny 0.1%\n 1 Tim Ehat 0.1%\n 1 Vadim Nikitin 0.1%\n 1 Victor Costan 0.1%\n 1 Will Langstroth 0.1%\n 1 Yanis Wang 0.1%\n 1 Yuest Wang 0.1%\n 1 abrkn 0.1%\n 1 airportyh 0.1%\n 1 badunk 0.1%\n 1 fengmk2 0.1%\n 1 grasGendarme 0.1%\n 1 lodr 0.1%\n 1 tgautier@yahoo.com 0.1%\n 1 traleig1 0.1%\n 1 vlad 0.1%\n 1 yuitest 0.1%\n 1 Adam Crabtree 0.1%\n 1 Andreas Brekken 0.1%\n 1 Andreas Lind Petersen 0.1%\n 1 Andrew Nesbitt 0.1%\n 1 Andrey Popp 0.1%\n 1 Arnaud Brousseau 0.1%\n 1 Atsuya Takagi 0.1%\n 1 Austin Birch 0.1%\n 1 Bjørge Næss 0.1%\n 1 Brian Lalor 0.1%\n 1 Brian M. Carlson 0.1%\n 1 Brian Moore 0.1%\n 1 Bryan Donovan 0.1%\n 1 Casey Foster 0.1%\n 1 ChrisWren 0.1%\n 1 Corey Butler 0.1%\n 1 Daniel Stockman 0.1%\n 1 Dave McKenna 0.1%\n 1 Di Wu 0.1%\n 1 Dmitry Shirokov 0.1%\n 1 Fedor Indutny 0.1%\n 1 Florian Margaine 0.1%\n 1 Frederico Silva 0.1%\n 1 Fredrik Lindin 0.1%\n 1 Gareth Murphy 0.1%\n 1 Gavin Mogan 0.1%\n 1 Glen Huang 0.1%\n 1 Greg Perkins 0.1%\n 1 Harry Brundage 0.1%\n 1 Herman Junge 0.1%\n 1 Ian Young 0.1%\n 1 Ivan 0.1%\n 1 JP Bochi 0.1%\n 1 Jaakko Salonen 0.1%\n 1 Jakub Nešetřil 0.1%\n 1 James Bowes 0.1%\n 1 James Lal 0.1%\n 1 Jason Barry 0.1%\n 1 Javier Aranda 0.1%\n 1 Jeff Kunkle 0.1%\n 1 Jeremy Martin 0.1%\n 1 Jimmy Cuadra 0.1%\n 1 Jonathan Creamer 0.1%\n 1 Jussi Virtanen 0.1%\n 1 Katie Gengler 0.1%\n 1 Kazuhito Hokamura 0.1%\n 1 Kirill Korolyov 0.1%\n 1 Koen Punt 0.1%\n 1 Laszlo Bacsi 0.1%\n 1 Liam Newman 0.1%\n 1 László Bácsi 0.1%\n 1 Maciej Małecki 0.1%\n 1 Mal Graty 0.1%\n 1 Marc Kuo 0.1%\n 1 Matt Robenolt 0.1%\n```\n\n## Links\n\n - [Google Group](http://groups.google.com/group/mochajs)\n - [Wiki](https://github.com/visionmedia/mocha/wiki)\n - Mocha [Extensions and reporters](https://github.com/visionmedia/mocha/wiki)\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/mocha/issues" + }, + "homepage": "https://github.com/visionmedia/mocha", + "_id": "mocha@1.17.1", + "_from": "mocha@" +} diff --git a/node_modules/should/.idea/.name b/node_modules/should/.idea/.name new file mode 100644 index 00000000..d1c5fd31 --- /dev/null +++ b/node_modules/should/.idea/.name @@ -0,0 +1 @@ +should.js \ No newline at end of file diff --git a/node_modules/should/.idea/codeStyleSettings.xml b/node_modules/should/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..771ca3ab --- /dev/null +++ b/node_modules/should/.idea/codeStyleSettings.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/node_modules/should/.idea/encodings.xml b/node_modules/should/.idea/encodings.xml new file mode 100644 index 00000000..e206d70d --- /dev/null +++ b/node_modules/should/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/node_modules/should/.idea/inspectionProfiles/Project_Default.xml b/node_modules/should/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..9cc3673b --- /dev/null +++ b/node_modules/should/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/node_modules/should/.idea/inspectionProfiles/profiles_settings.xml b/node_modules/should/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..3b312839 --- /dev/null +++ b/node_modules/should/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/node_modules/should/.idea/jsLibraryMappings.xml b/node_modules/should/.idea/jsLibraryMappings.xml new file mode 100644 index 00000000..4e262aa4 --- /dev/null +++ b/node_modules/should/.idea/jsLibraryMappings.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/node_modules/should/.idea/jsLinters/jshint.xml b/node_modules/should/.idea/jsLinters/jshint.xml new file mode 100644 index 00000000..4c0f7760 --- /dev/null +++ b/node_modules/should/.idea/jsLinters/jshint.xml @@ -0,0 +1,68 @@ + + + + + + diff --git a/node_modules/should/.idea/libraries/Node_js_Dependencies_for_should_js.xml b/node_modules/should/.idea/libraries/Node_js_Dependencies_for_should_js.xml new file mode 100644 index 00000000..e639fbb8 --- /dev/null +++ b/node_modules/should/.idea/libraries/Node_js_Dependencies_for_should_js.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/node_modules/should/.idea/misc.xml b/node_modules/should/.idea/misc.xml new file mode 100644 index 00000000..1162f438 --- /dev/null +++ b/node_modules/should/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/node_modules/should/.idea/modules.xml b/node_modules/should/.idea/modules.xml new file mode 100644 index 00000000..032a2af8 --- /dev/null +++ b/node_modules/should/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/node_modules/should/.idea/scopes/scope_settings.xml b/node_modules/should/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..922003b8 --- /dev/null +++ b/node_modules/should/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/node_modules/should/.idea/should.js.iml b/node_modules/should/.idea/should.js.iml new file mode 100644 index 00000000..30573aa7 --- /dev/null +++ b/node_modules/should/.idea/should.js.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/node_modules/should/.idea/vcs.xml b/node_modules/should/.idea/vcs.xml new file mode 100644 index 00000000..c80f2198 --- /dev/null +++ b/node_modules/should/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/node_modules/should/.idea/workspace.xml b/node_modules/should/.idea/workspace.xml new file mode 100644 index 00000000..90f3b660 --- /dev/null +++ b/node_modules/should/.idea/workspace.xml @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bash + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1378708904520 + 1378708904520 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/should/.npmignore b/node_modules/should/.npmignore new file mode 100644 index 00000000..3a32276d --- /dev/null +++ b/node_modules/should/.npmignore @@ -0,0 +1,2 @@ +examples +test \ No newline at end of file diff --git a/node_modules/should/History.md b/node_modules/should/History.md new file mode 100644 index 00000000..b9848dbe --- /dev/null +++ b/node_modules/should/History.md @@ -0,0 +1,222 @@ +3.1.2 / 2014-01-28 +================== + + * Fix for adding .inspect for JQuery object only in case when it is exist + +3.1.1 / 2014-01-28 +================== + + * Fix for HTMLElement in DOM less environments + +3.1.0 / 2014-01-23 +================== + + * Added jquery based broser extension + +3.0.1 / 2014-01-17 +================== + + * Fix: .lengthOf() + +3.0.0 / 2014-01-17 +================== + + * Split everything to smaller files + * Added huge extension to .match and .matchEach. Thanks @alsotang for initial code and idea. + * Added .containDeep and .containEql + * Separate build for browser and node.js + * Basic plugin system + * Breaking change: .Object now do not fail on arrays + * Breaking change: Additional messages now replaces generated and do not added + * Breaking change: .keys now check as is - no keys in args means no keys in object + * Deprecated: assert extension + * Deprecated: .include and .includeEql + * Now all assertions define only positive cases, should.js take care about negations and chains + +2.1.1 / 2013-12-05 +================== + + * Move date formatting out of should.inspect + +2.1.0 / 2013-11-11 +================== + + * Override .inspect for Date's to convert them to ISOString + +2.0.2 / 2013-10-21 +================== + + * Add '#of' as getter for chaining. + * Exclude browser script for .npmignore. + +2.0.1 / 2013-10-10 +================== + + * Fix wrong path in .npmignore. + +2.0.0 / 2013-10-10 +================== + + * breaking change: #a now getter like #an. Was replaced with #type(str) + * breaking change: #empty does not check length for objects. Now it check if object do not have own properties. + * #properties check if object have some properties + * util.inspect now exposed as should.inspect + * assertions for NaN, Infinity, Array, Object, String, Boolean, Number, Error, Function + * #equal got alias #exactly + +1.3.0 / 2013-09-13 +================== + + * fix doc for .keys. Closes #108. + * add #endWith() + * add .startWith (#119) + +1.2.2 / 2013-02-19 +================== + + * fix should.be.instanceOf() failure on Date + +1.2.1 / 2012-11-02 +================== + + * add .showDiff + * Make instanceOf and throwError be aliased like others [alFReD-NSH] + * Fix should[.not].exist not having stack trace #84 [alFReD-NSH] + +1.2.0 / 2012-09-21 +================== + + * Added #approximately(value, delta, description) for doing assertions on results of operations with numbers. [titarenko] + +1.1.1 / 2012-09-19 +================== + + * add .type for eql()s assert + +1.1.0 / 2012-07-30 +================== + + * add enclosing of failure message functions. Closes #81 + * add mocha .actual / .expected string support for all assertion values + +0.7.0 / 2012-07-17 +================== + + * add `.throw(Constructor)` support [snakamura] + +0.6.3 / 2012-04-26 +================== + + * Added object inclusion support back + +0.6.2 / 2012-04-26 +================== + + * Added homepage to package.json + * Fixed .equal() with dates. Closes #63 + +0.6.1 / 2012-04-10 +================== + + * package: add "repository" section [TooTallNate] + * use valueOf() to get the reference the object [TooTallNate] + +0.6.0 / 2012-03-01 +================== + + * Added `err.actual` and `err.expected` for .{eql,equal}() + * Added 'return this;' to 'get json' and 'get html' in order to provide chaining for should.be.json and should.be.html + +0.5.1 / 2012-01-13 +================== + + * Added better `.json` + * Added better `.html` + +0.5.0 / 2012-01-12 +================== + + * Added string matching to `.throw()` [serby] + * Added regexp matching to `.throw()` [serby] + * Added `.includeEql()` [RubenVerborgh] + * Added `.should.be.html` + * Added `.should.be.json` + * Added optional description args to most matchers [Mike Swift] + +0.4.2 / 2011-12-17 +================== + + * Fixed .header() for realzzz + +0.4.1 / 2011-12-16 +================== + + * Fixed: chain .header() to retain negation + +0.4.0 / 2011-12-16 +================== + + * Added `.should.throw()` + * Added `.include()` support for strings + * Added `.include()` support for arrays + * Removed `keys()` `.include` modifier support + * Removed `.object()` + * Removed `.string()` + * Removed `.contain()` + * Removed `.respondTo()` rubyism + * expresso -> mocha + +0.3.2 / 2011-10-24 +================== + + * Fixed tests for 0.5.x + * Fixed sys warning + +0.3.1 / 2011-08-22 +================== + + * configurable + +0.3.0 / 2011-08-20 +================== + + * Added assertion for inclusion of an object: `foo.should.include.object({ foo: 'bar' })` + +0.2.1 / 2011-05-13 +================== + + * Fixed .status(code). Closes #18 + +0.2.0 / 2011-04-17 +================== + + * Added `res.should.have.status(code)` method + * Added `res.should.have.header(field, val)` method + +0.1.0 / 2011-04-06 +================== + + * Added `should.exist(obj)` [aseemk] + * Added `should.not.exist(obj)` [aseemk] + +0.0.4 / 2010-11-24 +================== + + * Added `.ok` to assert truthfulness + * Added `.arguments` + * Fixed double required bug. [thanks dominictarr] + +0.0.3 / 2010-11-19 +================== + + * Added `true` / `false` assertions + +0.0.2 / 2010-11-19 +================== + + * Added chaining support + +0.0.1 / 2010-11-19 +================== + + * Initial release diff --git a/node_modules/should/Makefile b/node_modules/should/Makefile new file mode 100644 index 00000000..e4295ad1 --- /dev/null +++ b/node_modules/should/Makefile @@ -0,0 +1,10 @@ +TESTS=$(shell find test -name *.test.js) + +test: + @browserify lib/browser.js -s Should --dg false -o should.js.for-tests + @./node_modules/.bin/mocha --ui exports --recursive $(TESTS) + +browser: + @browserify lib/browser.js -s Should --dg false -o should.js + +.PHONY: test browser \ No newline at end of file diff --git a/node_modules/should/Readme.md b/node_modules/should/Readme.md new file mode 100644 index 00000000..eb77b680 --- /dev/null +++ b/node_modules/should/Readme.md @@ -0,0 +1,644 @@ +# should.js + +_should_ is an expressive, readable, test framework agnostic, assertion library. Main goals of this library __to be expressive__ and __to be helpful__. It means test code should be clean, and error messages enough helpfull to understand error. + +It extends the `Object.prototype` with a single non-enumerable getter that allows you to express how that object should behave, also it returns itself when required with `require`. + +## Example +```javascript +var should = require('should'); + +var user = { + name: 'tj' + , pets: ['tobi', 'loki', 'jane', 'bandit'] +}; + +user.should.have.property('name', 'tj'); +user.should.have.property('pets').with.lengthOf(4); + +// if the object was created with Object.create(null) +// then it doesn't inherit `Object` and have the `should` getter +// so you can do: + +should(user).have.property('name', 'tj'); +should(true).ok; + +someAsyncTask(foo, function(err, result){ + should.not.exist(err); + should.exist(result); + result.bar.should.equal(foo); +}); +``` +## To begin + + 1. Install it: + + $ npm install should --save-dev + + 2. Require it and use: + +```javascript +var should = require('should'); + +(5).should.be.exactly(5).and.be.a.Number; +``` + +## In browser + +If you want to use _should_ in browser, use version that is in root of repository (or build it yourself). It is builded with browserify (see [Makefile](https://github.com/visionmedia/should.js/blob/master/Makefile)). To build fresh version: + +```bash +# you should have browserify +npm install -g browserify +make browser +``` + +This script exported to `window.Should`. It is the same as use `should` statically: + +```js +Should(5).be.exactly(5) +``` + +Also as for node.js case `Object.prototype` extended with `should` (that is why `window.Should` used): + +```js +window.should.be.exactly(window); +// the same +// window is host object +should.be.exactly(window); +// you should not really care about it + +(5).should.be.exactly(5); +``` + +*should.js* uses EcmaScript 5 very extensively so any browser that support ES5 is supported. (IE <=8 not supported). +See [kangax's compat table](http://kangax.github.io/es5-compat-table) to know which exactly. + +You can easy install it with again npm or bower: +``` +npm install should --save-dev +# or +bower install visionmedia/should.js +``` + +## Static should and assert module + +For some rare cases should can be used statically, without `Object.prototype`. +It can be replacement for node assert module: + +```javascript +assert.fail(actual, expected, message, operator) // just write wrong should assertion +assert(value, message), assert.ok(value, [message]) // should(value).ok +assert.equal(actual, expected, [message]) // should(actual).eql(expected, [message]) +assert.notEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message]) +assert.deepEqual(actual, expected, [message]) // should(actual).eql(expected, [message]) +assert.notDeepEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message]) +assert.strictEqual(actual, expected, [message]) // should(actual).equal(expected, [message]) +assert.notStrictEqual(actual, expected, [message]) // should(actual).not.equal(expected, [message]) +assert.throws(block, [error], [message]) // should(block).throw([error]) +assert.doesNotThrow(block, [message]) // should(block).not.throw([error]) +assert.ifError(value) // should(value).Error (to check if it is error) or should(value).not.ok (to check that it is falsy) +``` + +## .not + +`.not` negate current assertion. + +# Assertions +## chaining assertions + +Every assertion will return a `should.js`-wrapped Object, so assertions can be chained. +You can use this helpers to just chain: `.an`, `.of`, `.a`, `.and`, `.be`, `.have`, `.with`, `.is`, `.which`. Use them for better readability, they do nothing at all. +For example: +```js +user.should.be.an.instanceOf(Object).and.have.property('name', 'tj'); +user.pets.should.be.instanceof(Array).and.have.lengthOf(4); +``` +Almost all assertions return the same object - so you can easy chain them. But some move assertion object to property value. See feather, it will be mention if object chainged. + +## .ok + +Assert if asseted object is truthy in javascript meaning of truthy ('', null, undefined, 0 , NaN, Infinity - is falsy, so all others are truthy). + +Assert truthfulness: + +```javascript +true.should.be.ok; +'yay'.should.be.ok; +(1).should.be.ok; +({}).should.be.ok; +``` + +or negated: + +```javascript +false.should.not.be.ok; +''.should.not.be.ok; +(0).should.not.be.ok; +``` + +## .true + +Assert if asseted object === true: + +```javascript +true.should.be.true; +'1'.should.not.be.true; +``` + +## .false + +Assert if asseted object === false: + +```javascript +false.should.be.false; +(0).should.not.be.false; +``` + +## .eql(otherValue) + +Assert if asserted object is *equal* to otherValue. This means that object compared by its actual content, not just reference equality. + +```javascript +({ foo: 'bar' }).should.eql({ foo: 'bar' }); +[1,2,3].should.eql([1,2,3]); +// see next example it is correct, even if it is different types, but actual content the same +[1, 2, 3].should.eql({ '0': 1, '1': 2, '2': 3 }); +``` +## .equal(otherValue) and .exactly(otherValue) + +Assert if asserted object strictly equal to `otherValue` (using `===` - no type conversion for primitive types and reference equivalence for reference types). + +```javascript +(4).should.equal(4); +'test'.should.equal('test'); +[1,2,3].should.not.equal([1,2,3]); +(4).should.be.exactly(4); +``` + +## .startWith(str) + +Assert that string starts with `str`. + +```javascript +'foobar'.should.startWith('foo'); +'foobar'.should.not.startWith('bar'); +``` +## .endWith(str) + +Assert that string ends with `str`. + +```javascript +'foobar'.should.endWith('bar'); +'foobar'.should.not.endWith('foo'); +``` + +## .within(from, to) + +Assert inclusive numeric range (`<= to` and `>= from`): +```javascript +user.age.should.be.within(5, 50); +(5).should.be.within(5, 10).and.within(5, 5); +``` + +## .approximately(num, delta) + +Assert floating point number near `num` within `delta` margin: + +```javascript +(99.99).should.be.approximately(100, 0.1); +``` + +## .above(num) and .greaterThan(num) + +Assert numeric value above the given value (`> num`): + +```javascript +user.age.should.be.above(5); +user.age.should.not.be.above(100); +(5).should.be.above(0); +(5).should.not.be.above(5); +``` + +## .below(num) and .lessThan(num) + +Assert numeric value below the given value (`< num`): + +```javascript +user.age.should.be.below(100); +user.age.should.not.be.below(5); +(5).should.be.below(6); +(5).should.not.be.below(5); +``` + +## .NaN + +Assert numeric value is NaN: + +```javascript +(undefined + 0).should.be.NaN; +``` + +## .Infinity + +Assert numeric value is Infinity: + +```javascript +(1/0).should.be.Infinity; +``` + +## .type(str) + +Assert given value have such type (using __typeof__ operator): +```javascript +user.should.be.type('object'); +'test'.should.be.type('string'); +``` + +## .instanceof(constructor) and .instanceOf(constructor) + +Assert given value is instance of `constructor` (using __instanceof__ operator): + +```javascript +user.should.be.an.instanceof(User); +[].should.be.an.instanceOf(Array); +``` + +## .arguments + +Assert given object is an `Arguments`: + +```javascript +var args = (function(){ return arguments; })(1,2,3); +args.should.be.arguments; +[].should.not.be.arguments; +``` + +## .Object, .Number, .Array, .Boolean, .Function, .String, .Error + +Assert given object is instance of such constructor (shortcut for `.instanceof` assertion). + +```javascript +({}).should.be.an.Object; +(1).should.be.a.Number; +[].should.be.an.Array.and.an.Object; +(true).should.be.a.Boolean; +''.should.be.a.String; +``` + +## .property(name[, value]) + +Assert property exists and has optional value(compare using `.eql`): +```javascript +user.should.have.property('name'); +user.should.have.property('age', 15); +user.should.not.have.property('rawr'); +user.should.not.have.property('age', 0); +[1, 2].should.have.property('0', 1); +``` + +__NB__ `.property` change object to actual property value! + +## .properties(propName1, propName2, ...) or .properties([propName1, propName2, ...]) or .properties(obj) + +`obj` it is object that map properties to their actual values. + +Assert all given properties exists and have given values (compare using `.eql`): + +```javascript +user.should.have.properties('name', 'age'); +user.should.have.properties(['name', 'age']); +user.should.have.properties({ + name: 'denis', + age: 24 +}); +``` + +## .length(number) and .lengthOf(number) + +Assert _length_ property exists and has a value of the given number (shortcut for `.property('length', number)`): +```javascript +user.pets.should.have.length(5); +user.pets.should.have.a.lengthOf(5); +({ length: 10}).should.have.length(10); +``` + +__NB__ `.length` change object to actual property value! + +## .ownProperty(str) and .hasOwnProperty(str) + +Assert given object has own property (using `.hasOwnProperty`): +```javascript +({ foo: 'bar' }).should.have.ownProperty('foo').equal('bar'); +``` + +__NB__ `.length` change object to actual property value! + +## .empty + +Assert given value is empty. It means for strings, arrays, arguments length == 0 and for object do not have own properties. + +```javascript +[].should.be.empty; +''.should.be.empty; +({}).should.be.empty; +(function() { + arguments.should.be.empty; +})(); +``` + +## .keys([key1, key2, ...]) and .keys(key1, key2, ...) and .key(key) + +Assert own object keys, which must match _exactly_, +and will fail if you omit a key or two: + +```javascript +var obj = { foo: 'bar', baz: 'raz' }; +obj.should.have.keys('foo', 'baz'); +obj.should.have.keys(['foo', 'baz']); +({}).should.have.keys(); +({}).should.have.keys('key'); //fail AssertionError: expected {} to have key 'key'missing keys: 'key' +``` + +## .containEql(otherValue) + +Assert given value to contain something *.eql* to otherValue. See examples to understand better: + +```javascript +'hello boy'.should.containEql('boy'); +[1,2,3].should.containEql(3); +[[1],[2],[3]].should.containEql([3]); +[[1],[2],[3, 4]].should.not.containEql([3]); + +({ b: 10 }).should.containEql({ b: 10 }); +([1, 2, { a: 10 }]).should.containEql({ a: 10 }); +[1, 2, 3].should.not.containEql({ a: 1 }); + +[{a: 'a'}, {b: 'b', c: 'c'}].should.containEql({a: 'a'}); +[{a: 'a'}, {b: 'b', c: 'c'}].should.not.containEql({b: 'b'}); +``` + +## .containDeep(otherValue) + +Assert given value to contain something *.eql* to otherValue within depth. +Again see examples: + +```javascript +'hello boy'.should.containDeep('boy'); +[1,2,3].should.containDeep([3]); +[1,2,3].should.containDeep([1, 3]); +//but not +[1,2,3].should.containDeep([3, 1]); + +({ a: { b: 10 }, b: { c: 10, d: 11, a: { b: 10, c: 11} }}).should + .containDeep({ a: { b: 10 }, b: { c: 10, a: { c: 11 }}}); + +[1, 2, 3, { a: { b: { d: 12 }}}].should.containDeep([{ a: { b: {d: 12}}}]); + +[[1],[2],[3]].should.containDeep([[3]]); +[[1],[2],[3, 4]].should.containDeep([[3]]); +[{a: 'a'}, {b: 'b', c: 'c'}].should.containDeep([{a: 'a'}]); +[{a: 'a'}, {b: 'b', c: 'c'}].should.containDeep([{b: 'b'}]); +``` + +It does not search somewhere in depth it check all pattern in depth. Object checked +by properties key and value, arrays checked like sub sequences. Everyting compared using .eql. +Main difference with `.containEql` is that this assertion require full type chain - +if asserted value is an object, otherValue should be also an object (which is sub object of given). +The same true for arrays, otherValue should be an array which compared to be subsequence of given object. + +## .match(otherValue) + +Assert given object to match `otherValue`. + +Given: String, otherValue: regexp. Uses `RegExp#exec(str)`: +```javascript +username.should.match(/^\w+$/) +``` + +Given: Array, otherValue: regexp - assert each value match to regexp. +```javascript +['a', 'b', 'c'].should.match(/[a-z]/); +['a', 'b', 'c'].should.not.match(/[d-z]/); +``` + +Given: Object, otherValue: regexp - assert own property's values to match regexp. +```javascript +({ a: 'foo', c: 'barfoo' }).should.match(/foo$/); +({ a: 'a' }).should.not.match(/^http/); +``` + +Given: Anything, otherValue: function - assert if given value matched to function. + +Function can use .should inside or return 'true' or 'false', in all other cases it do nothing. If you return value that return assertion, you will receive better error messages. + +```javascript +(5).should.match(function(n) { return n > 0; }); +(5).should.not.match(function(n) { return n < 0; }); +(5).should.not.match(function(it) { it.should.be.an.Array; }); +(5).should.match(function(it) { return it.should.be.a.Number; }); +``` + +Now compare messages: +```javascript +(5).should.not.match(function(it) { it.should.be.a.Number; }); +//AssertionError: expected 5 not to match [Function] +(5).should.not.match(function(it) { return it.should.be.a.Number; }); +//AssertionError: expected 5 not to match [Function] +// expected 5 to be a number +``` + +Given: object, otherValue: another object - assert that object properties match to properties of another object in meaning that describe above cases. See examples: + +```javascript +({ a: 10, b: 'abc', c: { d: 10 }, d: 0 }).should + .match({ a: 10, b: /c$/, c: function(it) { return it.should.have.property('d', 10); }}); + +[10, 'abc', { d: 10 }, 0].should + .match({ '0': 10, '1': /c$/, '2': function(it) { return it.should.have.property('d', 10); } }); + +[10, 'abc', { d: 10 }, 0].should + .match([10, /c$/, function(it) { return it.should.have.property('d', 10); }]); +``` + +## .matchEach(otherValue) + +Assert given property keys and values each match given check object. + +If `otherValue` is RegExp, then each property value checked to match it: +```javascript +(['a', 'b', 'c']).should.matchEach(/[a-c]/); +``` + +If `otherValue` is Function, then check each property value and key matched it: +```javascript +[10, 11, 12].should.matchEach(function(it) { return it >= 10; }); +[10, 11, 12].should.matchEach(function(it) { return it >= 10; }); +``` + +In other cases it check that each property value is `.eql` to `otherValue`: +```javascript +[10, 10].should.matchEach(10); +``` +## .throw() and throwError() + +Assert an exception is thrown: + +```js +(function(){ + throw new Error('fail'); +}).should.throw(); +``` + +Assert an exception is not thrown: + +```js +(function(){ + +}).should.not.throw(); +``` +Assert exception message matches string: + +```js +(function(){ + throw new Error('fail'); +}).should.throw('fail'); +``` + +Assert exepection message matches regexp: + +```js +(function(){ + throw new Error('failed to foo'); +}).should.throw(/^fail/); +``` + +If you need to pass arguments and/or context to execute function use `Function#bind(context, arg1, ...)`: +```js +function isPositive(n) { + if(n <= 0) throw new Error('Given number is not positive') +} + +isPositive.bind(null, 10).should.not.throw(); +isPositive.bind(null, -10).should.throw(); +``` + +If you need to check something in asynchronous function it is required to do in 2 steps: + +```js +// first we need to check that function is called +var called = false; +collection.findOne({ _id: 10 }, function(err, res) { + called = true; + + //second we test what you want + res.should.be.... +}); + +called.should.be.true; +``` + +In case you are using something like `Mocha`, you should use asynchronous test and call `done()` in proper place to make sure that you asynchronous function is called before test is finished. +```js +collection.findOne({ _id: 10 }, function(err, res) { + if(err) return done(err); + //second we test what you want + res.should.be.... + + done(); +}); +``` + +In general case if you need to check that something is executed you need such thing as `spies`, good example is an [sinon](http://sinonjs.org/). + +## .status(code) + +Asserts that `.statusCode` is `code`: +```javascript +res.should.have.status(200); +``` + +Not included in browser build. + +## .header(field[, value]) + +Asserts that a `.headers` object with `field` and optional `value` are present: +```javascript +res.should.have.header('content-length'); +res.should.have.header('Content-Length', '123'); +``` + +Not included in browser build. + +## .json + +Assert that Content-Type is "application/json; charset=utf-8" + +```javascript +res.should.be.json +``` + +Not included in browser build. + +## .html + +Assert that Content-Type is "text/html; charset=utf-8" +```javascript +res.should.be.html +``` + +Not included in browser build. + +## Optional Error description + +As it can often be difficult to ascertain exactly where failed assertions are coming from in your tests, an optional description parameter can be passed to several should matchers. The description will follow the failed assertion in the error: + + (1).should.eql(0, 'some useful description') + + AssertionError: some useful description + at Object.eql (/Users/swift/code/should.js/node_modules/should/lib/should.js:280:10) + ... + +The methods that support this optional description are: `eql`, `equal`, `within`, `instanceof`, `above`, `below`, `match`, `length`, `property`, `ownProperty`. + +## Mocha example + +For example you can use should with the [Mocha test framework](http://visionmedia.github.io/mocha/) by simply including it: + +```javascript +var should = require('should'); +var mylib = require('mylib'); + + +describe('mylib', function () { + it('should have a version with the format #.#.#', function() { + lib.version.should.match(/^\d+\.\d+\.\d+$/); + } +}); +``` + +## Contributions + +[Actual list of contributors](https://github.com/visionmedia/should.js/graphs/contributors) if you want to show it your friends. + +To run the tests for _should_ simply run: + + $ make test + +Before contribute something: + +1. Your code looks like all other code - all project should look like it was written by one man, always. +2. If you want propose something - just create issue and describe your question with much description as you can. +3. Please never send issues or pull requests about code style, jshint violations etc - i do not accept it (and you will spend your time for free). +4. If you think you have some general receipt, consider create PR with it. +5. If you not sure if you receipt enough general just create your own plugin for should.js. (see should.use and Assertion.add usage). +6. If you add new code it should be covered by tests, no tests - no code. +7. If you find bug (or at least you think it is a bug), create issue with library version and test case that I can run and see what are you talking about, or at least full steps that I can reproduce it. + +## OMG IT EXTENDS OBJECT???!?!@ + +Yes, yes it does, with a single getter _should_, and no it won't break your code, because it does this **properly** with a non-enumerable property. + +## License + +MIT diff --git a/node_modules/should/index.js b/node_modules/should/index.js new file mode 100644 index 00000000..2bb5c331 --- /dev/null +++ b/node_modules/should/index.js @@ -0,0 +1,2 @@ + +module.exports = require('./lib/node.js'); \ No newline at end of file diff --git a/node_modules/should/lib/browser.js b/node_modules/should/lib/browser.js new file mode 100644 index 00000000..4fdb15e5 --- /dev/null +++ b/node_modules/should/lib/browser.js @@ -0,0 +1,23 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var should = require('./should'); + +should + .use(require('./ext/assert')) + .use(require('./ext/chain')) + .use(require('./ext/bool')) + .use(require('./ext/number')) + .use(require('./ext/eql')) + .use(require('./ext/type')) + .use(require('./ext/string')) + .use(require('./ext/property')) + .use(require('./ext/error')) + .use(require('./ext/match')) + .use(require('./ext/browser/jquery')) + .use(require('./ext/deprecated')); + + module.exports = should; \ No newline at end of file diff --git a/node_modules/should/lib/eql.js b/node_modules/should/lib/eql.js new file mode 100644 index 00000000..17bd0fdd --- /dev/null +++ b/node_modules/should/lib/eql.js @@ -0,0 +1,102 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +// Taken from node's assert module, because it sucks +// and exposes next to nothing useful. +var util = require('./util'); + +module.exports = _deepEqual; + +var pSlice = Array.prototype.slice; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + + +function objEquiv (a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (util.isArguments(a)) { + if (!util.isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try{ + var ka = Object.keys(a), + kb = Object.keys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} diff --git a/node_modules/should/lib/ext/assert.js b/node_modules/should/lib/ext/assert.js new file mode 100644 index 00000000..9bf436f4 --- /dev/null +++ b/node_modules/should/lib/ext/assert.js @@ -0,0 +1,57 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util') + , assert = require('assert') + , AssertionError = assert.AssertionError; + +module.exports = function(should) { + var i = should.format; + + /** + * Expose assert to should + * + * This allows you to do things like below + * without require()ing the assert module. + * + * should.equal(foo.bar, undefined); + * + */ + util.merge(should, assert); + + + /** + * Assert _obj_ exists, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + should.exist = should.exists = function(obj, msg) { + if(null == obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to exist'), stackStartFunction: should.exist + }); + } + }; + + /** + * Asserts _obj_ does not exist, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + + should.not = {}; + should.not.exist = should.not.exists = function(obj, msg) { + if(null != obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to not exist'), stackStartFunction: should.not.exist + }); + } + }; +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/bool.js b/node_modules/should/lib/ext/bool.js new file mode 100644 index 00000000..04da82b3 --- /dev/null +++ b/node_modules/should/lib/ext/bool.js @@ -0,0 +1,21 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('true', function() { + this.is.exactly(true) + }, true); + + Assertion.add('false', function() { + this.is.exactly(false) + }, true); + + Assertion.add('ok', function() { + this.params = { operator: 'to be truthy' }; + + this.assert(this.obj); + }, true); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/browser/jquery.js b/node_modules/should/lib/ext/browser/jquery.js new file mode 100644 index 00000000..cf58203e --- /dev/null +++ b/node_modules/should/lib/ext/browser/jquery.js @@ -0,0 +1,229 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/*! + * Portions copyright (c) 2010, 2011, 2012 Wojciech Zawistowski, Travis Jeffery + * From the jasmine-jquery project under the MIT License. + */ + +var util = require('../../util'); + +module.exports = function(should, Assertion) { + var i = should.format; + var $ = this.jQuery || this.$; + + /* Otherwise, node's util.inspect loops hangs */ + if (typeof HTMLElement !== "undefined" && HTMLElement && !HTMLElement.prototype.inspect) { + HTMLElement.prototype.inspect = function () { + return this.outerHTML; + }; + } + + if (typeof jQuery !== "undefined" && jQuery && !jQuery.prototype.inspect) { + jQuery.fn.inspect = function () { + var elementList = this.toArray().map(function (e) { + return util.inspect(e); + }).join(", "); + if (this.selector) { + return "SELECTOR(" + this.selector + ") matching " + this.length + " elements" + (elementList.length ? ": " + elementList : ""); + } else { + return elementList; + } + }; + } + + function jQueryAttributeTestHelper(method, singular, plural, nameOrHash, value) { + var keys = util.isObject(nameOrHash) ? Object.keys(nameOrHash) : [nameOrHash]; + var allRelevantAttributes = keys.reduce(function (memo, key) { + var value = $(this.obj)[method](key); + if (typeof value !== 'undefined') { + memo[key] = value; + } + return memo; + }.bind(this), {}); + + if (arguments.length === 4 && util.isObject(nameOrHash)) { + this.params = { operator: 'to have ' + plural + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.properties(nameOrHash); + } else if (arguments.length === 4) { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.property(nameOrHash); + } else { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) + ' with value ' + i(value) }; + allRelevantAttributes.should.have.property(nameOrHash, value); + } + } + + var browserTagCaseIndependentHtml = function (html) { + return $('
        ').append(html).html(); + }; + + var addJqPredicateAssertion = function (predicate, nameOverride, operatorOverride) { + Assertion.add(nameOverride || predicate, function() { + this.params = { operator: 'to be ' + (operatorOverride || predicate) }; + this.assert($(this.obj).is(':' + predicate)); + }, true); + } + + Assertion.add('className', function(className) { + this.params = { operator: 'to have class ' + className }; + this.assert($(this.obj).hasClass(className)); + }); + + Assertion.add('css', function(css) { + this.params = { operator: 'to have css ' + i(css) }; + for (var prop in css) { + var value = css[prop]; + if (value === 'auto' && $(this.obj).get(0).style[prop] === 'auto') { + continue; + } + $(this.obj).css(prop).should.eql(value); + } + }); + + addJqPredicateAssertion('visible'); + addJqPredicateAssertion('hidden'); + addJqPredicateAssertion('selected'); + addJqPredicateAssertion('checked'); + addJqPredicateAssertion('disabled'); + addJqPredicateAssertion('empty', 'emptyJq'); + addJqPredicateAssertion('focus', 'focused', 'focused'); + + Assertion.add('inDOM', function() { + this.params = { operator: 'to be in the DOM' }; + this.assert($.contains(document.documentElement, $(this.obj)[0])); + }, true); + + Assertion.add('exist', function() { + this.params = { operator: 'to exist' }; + $(this.obj).should.not.have.length(0); + }, true); + + Assertion.add('attr', function() { + var args = [ + 'attr', + 'attribute', + 'attributes' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('prop', function() { + var args = [ + 'prop', + 'property', + 'properties' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('elementId', function(id) { + this.params = { operator: 'to have ID ' + i(id) }; + this.obj.should.have.attr('id', id); + }); + + Assertion.add('html', function(html) { + this.params = { operator: 'to have HTML ' + i(html) }; + $(this.obj).html().should.eql(browserTagCaseIndependentHtml(html)); + }); + + Assertion.add('containHtml', function(html) { + this.params = { operator: 'to contain HTML ' + i(html) }; + $(this.obj).html().indexOf(browserTagCaseIndependentHtml(html)).should.be.above(-1); + }); + + Assertion.add('text', function(text) { + this.params = { operator: 'to have text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.should.eql(text); + } + }); + + Assertion.add('containText', function(text) { + this.params = { operator: 'to contain text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.indexOf(text).should.be.above(-1); + } + }); + + Assertion.add('value', function(val) { + this.params = { operator: 'to have value ' + i(val) }; + $(this.obj).val().should.eql(val); + }); + + Assertion.add('data', function() { + var args = [ + 'data', + 'data', + 'data' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('containElement', function(target) { + this.params = { operator: 'to contain ' + $(target).inspect() }; + $(this.obj).find(target).should.not.have.length(0); + }); + + Assertion.add('matchedBy', function(selector) { + this.params = { operator: 'to be matched by selector ' + selector }; + $(this.obj).filter(selector).should.not.have.length(0); + }); + + Assertion.add('handle', function(event) { + this.params = { operator: 'to handle ' + event }; + + var events = $._data($(this.obj).get(0), "events"); + + if (!events || !event || typeof event !== "string") { + return this.assert(false); + } + + var namespaces = event.split("."), + eventType = namespaces.shift(), + sortedNamespaces = namespaces.slice(0).sort(), + namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + if (events[eventType] && namespaces.length) { + for (var i = 0; i < events[eventType].length; i++) { + var namespace = events[eventType][i].namespace; + + if (namespaceRegExp.test(namespace)) { + return; + } + } + } else { + events.should.have.property(eventType); + events[eventType].should.not.have.length(0); + return; + } + + this.assert(false); + }); + + Assertion.add('handleWith', function(eventName, eventHandler) { + this.params = { operator: 'to handle ' + eventName + ' with ' + eventHandler }; + + var normalizedEventName = eventName.split('.')[0], + stack = $._data($(this.obj).get(0), "events")[normalizedEventName]; + + for (var i = 0; i < stack.length; i++) { + if (stack[i].handler == eventHandler) { + return; + } + } + + this.assert(false); + }); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/chain.js b/node_modules/should/lib/ext/chain.js new file mode 100644 index 00000000..301c38e1 --- /dev/null +++ b/node_modules/should/lib/ext/chain.js @@ -0,0 +1,18 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + + function addLink(name) { + Object.defineProperty(Assertion.prototype, name, { + get: function() { + return this; + } + }); + } + + ['an', 'of', 'a', 'and', 'be', 'have', 'with', 'is', 'which'].forEach(addLink); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/deprecated.js b/node_modules/should/lib/ext/deprecated.js new file mode 100644 index 00000000..3656d077 --- /dev/null +++ b/node_modules/should/lib/ext/deprecated.js @@ -0,0 +1,33 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('include', function(obj, description) { + if(!Array.isArray(this.obj) && !util.isString(this.obj)) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + var cmp = {}; + for(var key in obj) cmp[key] = this.obj[key]; + this.assert(eql(cmp, obj)); + } else { + this.params = { operator: 'to include ' + i(obj), message: description }; + + this.assert(~this.obj.indexOf(obj)); + } + }); + + Assertion.add('includeEql', function(obj, description) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + + this.assert(this.obj.some(function(item) { + return eql(obj, item); + })); + }); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/eql.js b/node_modules/should/lib/ext/eql.js new file mode 100644 index 00000000..e3b03e50 --- /dev/null +++ b/node_modules/should/lib/ext/eql.js @@ -0,0 +1,23 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var eql = require('../eql'); + +module.exports = function(should, Assertion) { + Assertion.add('eql', function(val, description) { + this.params = { operator: 'to equal', expected: val, showDiff: true, message: description }; + + this.assert(eql(val, this.obj)); + }); + + Assertion.add('equal', function(val, description) { + this.params = { operator: 'to be', expected: val, showDiff: true, message: description }; + + this.assert(val === this.obj); + }); + + Assertion.alias('equal', 'exactly'); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/error.js b/node_modules/should/lib/ext/error.js new file mode 100644 index 00000000..eac98e4c --- /dev/null +++ b/node_modules/should/lib/ext/error.js @@ -0,0 +1,51 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('throw', function(message) { + var fn = this.obj + , err = {} + , errorInfo = '' + , ok = true; + + try { + fn(); + ok = false; + } catch(e) { + err = e; + } + + if(ok) { + if('string' == typeof message) { + ok = message == err.message; + } else if(message instanceof RegExp) { + ok = message.test(err.message); + } else if('function' == typeof message) { + ok = err instanceof message; + } + + if(message && !ok) { + if('string' == typeof message) { + errorInfo = " with a message matching '" + message + "', but got '" + err.message + "'"; + } else if(message instanceof RegExp) { + errorInfo = " with a message matching " + message + ", but got '" + err.message + "'"; + } else if('function' == typeof message) { + errorInfo = " of type " + message.name + ", but got " + err.constructor.name; + } + } else { + errorInfo = " (got " + i(err) + ")"; + } + } + + this.params = { operator: 'to throw exception' + errorInfo }; + + this.assert(ok); + }); + + Assertion.alias('throw', 'throwError'); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/http.js b/node_modules/should/lib/ext/http.js new file mode 100644 index 00000000..f5d24fc6 --- /dev/null +++ b/node_modules/should/lib/ext/http.js @@ -0,0 +1,33 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +//var statusCodes = require('http').STATUS_CODES; + +module.exports = function(should, Assertion) { + + Assertion.add('header', function(field, val) { + this + .have.property('headers') + .and.have.property(field.toLowerCase(), val); + }); + + Assertion.add('status', function(code) { + //this.params = { operator: 'to have response code ' + code + ' ' + i(statusCodes[code]) + // + ', but got ' + this.obj.statusCode + ' ' + i(statusCodes[this.obj.statusCode]) } + + this.have.property('statusCode', code); + }); + + Assertion.add('json', function() { + this.have.property('headers') + .and.have.property('content-type').include('application/json'); + }, true); + + Assertion.add('html', function() { + this.have.property('headers') + .and.have.property('content-type').include('text/html'); + }, true); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/match.js b/node_modules/should/lib/ext/match.js new file mode 100644 index 00000000..f0322ae8 --- /dev/null +++ b/node_modules/should/lib/ext/match.js @@ -0,0 +1,112 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('match', function(other, description) { + this.params = { operator: 'to match ' + i(other), message: description }; + + if(!eql(this.obj, other)) { + if(util.isRegExp(other)) { // something - regex + + if(util.isString(this.obj)) { + + this.assert(other.exec(this.obj)); + } else if(Array.isArray(this.obj)) { + + this.obj.forEach(function(item) { + this.assert(other.exec(item));// should we try to convert to String and exec? + }, this); + } else if(util.isObject(this.obj)) { + + var notMatchedProps = [], matchedProps = []; + util.forOwn(this.obj, function(value, name) { + if(other.exec(value)) matchedProps.push(i(name)); + else notMatchedProps.push(i(name)); + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } // should we try to convert to String and exec? + } else if(util.isFunction(other)) { + var res; + try { + res = other(this.obj); + } catch(e) { + if(e instanceof should.AssertionError) { + this.params.operator += '\n\t' + e.message; + } + throw e; + } + + if(res instanceof Assertion) { + this.params.operator += '\n\t' + res.getMessage(); + } + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + } else if(util.isObject(other)) { // try to match properties (for Object and Array) + notMatchedProps = []; matchedProps = []; + + util.forOwn(other, function(value, key) { + try { + this.obj[key].should.match(value); + matchedProps.push(key); + } catch(e) { + if(e instanceof should.AssertionError) { + notMatchedProps.push(key); + } else { + throw e; + } + } + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } else { + this.assert(false); + } + } + }); + + Assertion.add('matchEach', function(other, description) { + this.params = { operator: 'to match each ' + i(other), message: description }; + + var f = other; + + if(util.isRegExp(other)) + f = function(it) { + return !!other.exec(it); + }; + else if(!util.isFunction(other)) + f = function(it) { + return eql(it, other); + }; + + util.forOwn(this.obj, function(value, key) { + var res = f(value, key); + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + }, this); + }); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/number.js b/node_modules/should/lib/ext/number.js new file mode 100644 index 00000000..3b59c879 --- /dev/null +++ b/node_modules/should/lib/ext/number.js @@ -0,0 +1,50 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('NaN', function() { + this.params = { operator: 'to be NaN' }; + + this.is.a.Number + .and.assert(isNaN(this.obj)); + }, true); + + Assertion.add('Infinity', function() { + this.params = { operator: 'to be Infinity' }; + + this.is.a.Number + .and.not.a.NaN + .and.assert(!isFinite(this.obj)); + }, true); + + Assertion.add('within', function(start, finish, description) { + this.params = { operator: 'to be within ' + start + '..' + finish, message: description }; + + this.assert(this.obj >= start && this.obj <= finish); + }); + + Assertion.add('approximately', function(value, delta, description) { + this.params = { operator: 'to be approximately ' + value + " ±" + delta, message: description }; + + this.assert(Math.abs(this.obj - value) <= delta); + }); + + Assertion.add('above', function(n, description) { + this.params = { operator: 'to be above ' + n, message: description }; + + this.assert(this.obj > n); + }); + + Assertion.add('below', function(n, description) { + this.params = { operator: 'to be below ' + n, message: description }; + + this.assert(this.obj < n); + }); + + Assertion.alias('above', 'greaterThan'); + Assertion.alias('below', 'lessThan'); + +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/property.js b/node_modules/should/lib/ext/property.js new file mode 100644 index 00000000..57ca828b --- /dev/null +++ b/node_modules/should/lib/ext/property.js @@ -0,0 +1,215 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +var aSlice = Array.prototype.slice; + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('property', function(name, val) { + if(arguments.length > 1) { + var p = {}; + p[name] = val; + this.have.properties(p); + } else { + this.have.properties(name); + } + this.obj = this.obj[name]; + }); + + Assertion.add('properties', function(names) { + var values = {}; + if(arguments.length > 1) { + names = aSlice.call(arguments); + } else if(!Array.isArray(names)) { + if(util.isString(names)) { + names = [names]; + } else { + values = names; + names = Object.keys(names); + } + } + + var obj = Object(this.obj), missingProperties = []; + + //just enumerate properties and check if they all present + names.forEach(function(name) { + if(!(name in obj)) missingProperties.push(i(name)); + }); + + var props = missingProperties; + if(props.length === 0) { + props = names.map(i); + } + + var operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(missingProperties.length === 0); + + // check if values in object matched expected + var valueCheckNames = Object.keys(values); + if(valueCheckNames.length) { + var wrongValues = []; + props = []; + + // now check values, as there we have all properties + valueCheckNames.forEach(function(name) { + var value = values[name]; + if(!eql(obj[name], value)) { + wrongValues.push(i(name) + ' of ' + i(value) + ' (got ' + i(obj[name]) + ')'); + } else { + props.push(i(name) + ' of ' + i(value)); + } + }); + + if(wrongValues.length > 0) { + props = wrongValues; + } + + operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(wrongValues.length === 0); + } + }); + + Assertion.add('length', function(n, description) { + this.have.property('length', n, description); + }); + + Assertion.alias('length', 'lengthOf'); + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + Assertion.add('ownProperty', function(name, description) { + this.params = { operator: 'to have own property ' + i(name), message: description }; + + this.assert(hasOwnProperty.call(this.obj, name)); + + this.obj = this.obj[name]; + }); + + Assertion.alias('hasOwnProperty', 'ownProperty'); + + Assertion.add('empty', function() { + this.params = { operator: 'to be empty' }; + + if(util.isString(this.obj) || Array.isArray(this.obj) || util.isArguments(this.obj)) { + this.have.property('length', 0); + } else { + var obj = Object(this.obj); // wrap to reference for booleans and numbers + for(var prop in obj) { + this.have.not.ownProperty(prop); + } + } + }, true); + + Assertion.add('keys', function(keys) { + if(arguments.length > 1) keys = aSlice.call(arguments); + else if(arguments.length === 1 && util.isString(keys)) keys = [ keys ]; + else if(arguments.length === 0) keys = []; + + var obj = Object(this.obj); + + // first check if some keys are missing + var missingKeys = []; + keys.forEach(function(key) { + if(!hasOwnProperty.call(this.obj, key)) + missingKeys.push(i(key)); + }, this); + + // second check for extra keys + var extraKeys = []; + Object.keys(obj).forEach(function(key) { + if(keys.indexOf(key) < 0) { + extraKeys.push(i(key)); + } + }); + + var verb = keys.length === 0 ? 'to be empty' : + 'to have ' + (keys.length === 1 ? 'key ' : 'keys '); + + this.params = { operator: verb + keys.map(i).join(', ')}; + + if(missingKeys.length > 0) + this.params.operator += '\n\tmissing keys: ' + missingKeys.join(', '); + + if(extraKeys.length > 0) + this.params.operator += '\n\textra keys: ' + extraKeys.join(', '); + + this.assert(missingKeys.length === 0 && extraKeys.length === 0); + }); + + Assertion.alias("keys", "key"); + + Assertion.add('containEql', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + var obj = this.obj; + if(Array.isArray(obj)) { + this.assert(obj.some(function(item) { + return eql(item, other); + })); + } else if(util.isString(obj)) { + // expect obj to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) { + // object contains object case + util.forOwn(other, function(value, key) { + obj[key].should.eql(value); + }); + } else { + //other uncovered cases + this.assert(false); + } + }); + + Assertion.add('containDeep', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + + var obj = this.obj; + if(Array.isArray(obj)) { + if(Array.isArray(other)) { + var otherIdx = 0; + obj.forEach(function(item) { + try { + should(item).not.be.null.and.containDeep(other[otherIdx]); + otherIdx++; + } catch(e) { + if(e instanceof should.AssertionError) { + return; + } + throw e; + } + }); + this.assert(otherIdx == other.length); + //search array contain other as sub sequence + } else { + this.assert(false); + } + } else if(util.isString(obj)) {// expect other to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) {// object contains object case + if(util.isObject(other)) { + util.forOwn(other, function(value, key) { + should(obj[key]).not.be.null.and.containDeep(value); + }); + } else {//one of the properties contain value + this.assert(false); + } + } else { + this.eql(other); + } + }); + +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/string.js b/node_modules/should/lib/ext/string.js new file mode 100644 index 00000000..c3c6fead --- /dev/null +++ b/node_modules/should/lib/ext/string.js @@ -0,0 +1,19 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('startWith', function(str, description) { + this.params = { operator: 'to start with ' + should.format(str), message: description }; + + this.assert(0 === this.obj.indexOf(str)); + }); + + Assertion.add('endWith', function(str, description) { + this.params = { operator: 'to end with ' + should.format(str), message: description }; + + this.assert(this.obj.indexOf(str, this.obj.length - str.length) >= 0); + }); +}; \ No newline at end of file diff --git a/node_modules/should/lib/ext/type.js b/node_modules/should/lib/ext/type.js new file mode 100644 index 00000000..9ab9adfe --- /dev/null +++ b/node_modules/should/lib/ext/type.js @@ -0,0 +1,77 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'); + +module.exports = function(should, Assertion) { + Assertion.add('Number', function() { + this.params = { operator: 'to be a number' }; + + this.assert(util.isNumber(this.obj)); + }, true); + + Assertion.add('arguments', function() { + this.params = { operator: 'to be arguments' }; + + this.assert(util.isArguments(this.obj)); + }, true); + + Assertion.add('type', function(type, description) { + this.params = { operator: 'to have type ' + type, message: description }; + + (typeof this.obj).should.be.exactly(type, description); + }); + + Assertion.add('instanceof', function(constructor, description) { + this.params = { operator: 'to be an instance of ' + constructor.name, message: description }; + + this.assert(Object(this.obj) instanceof constructor); + }); + + Assertion.add('Function', function() { + this.params = { operator: 'to be a function' }; + + this.assert(util.isFunction(this.obj)); + }, true); + + Assertion.add('Object', function() { + this.params = { operator: 'to be an object' }; + + this.assert(util.isObject(this.obj)); + }, true); + + Assertion.add('String', function() { + this.params = { operator: 'to be a string' }; + + this.assert(util.isString(this.obj)); + }, true); + + Assertion.add('Array', function() { + this.params = { operator: 'to be an array' }; + + this.assert(Array.isArray(this.obj)); + }, true); + + Assertion.add('Boolean', function() { + this.params = { operator: 'to be a boolean' }; + + this.assert(util.isBoolean(this.obj)); + }, true); + + Assertion.add('Error', function() { + this.params = { operator: 'to be an error' }; + + this.assert(util.isError(this.obj)); + }, true); + + Assertion.add('null', function() { + this.params = { operator: 'to be null' }; + + this.assert(this.obj === null); + }, true); + + Assertion.alias('instanceof', 'instanceOf'); +}; \ No newline at end of file diff --git a/node_modules/should/lib/node.js b/node_modules/should/lib/node.js new file mode 100644 index 00000000..be2b5fba --- /dev/null +++ b/node_modules/should/lib/node.js @@ -0,0 +1,23 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var should = require('./should'); + +should + .use(require('./ext/assert')) + .use(require('./ext/chain')) + .use(require('./ext/bool')) + .use(require('./ext/number')) + .use(require('./ext/eql')) + .use(require('./ext/type')) + .use(require('./ext/string')) + .use(require('./ext/property')) + .use(require('./ext/http')) + .use(require('./ext/error')) + .use(require('./ext/match')) + .use(require('./ext/deprecated')); + + module.exports = should; \ No newline at end of file diff --git a/node_modules/should/lib/should.js b/node_modules/should/lib/should.js new file mode 100644 index 00000000..816c6173 --- /dev/null +++ b/node_modules/should/lib/should.js @@ -0,0 +1,169 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + + +var util = require('./util') + , AssertionError = util.AssertionError + , inspect = util.inspect; + +/** + * Our function should + * @param obj + * @returns {Assertion} + */ +var should = function(obj) { + return new Assertion(util.isWrapperType(obj) ? obj.valueOf(): obj); +}; + +/** + * Initialize a new `Assertion` with the given _obj_. + * + * @param {*} obj + * @api private + */ + +var Assertion = should.Assertion = function Assertion(obj) { + this.obj = obj; +}; + + +/** + Way to extend Assertion function. It uses some logic + to define only positive assertions and itself rule with negative assertion. + + All actions happen in subcontext and this method take care about negation. + Potentially we can add some more modifiers that does not depends from state of assertion. +*/ +Assertion.add = function(name, f, isGetter) { + var prop = {}; + prop[isGetter ? 'get' : 'value'] = function() { + var context = new Assertion(this.obj); + context.copy = context.copyIfMissing; + + try { + f.apply(context, arguments); + } catch(e) { + //copy data from sub context to this + this.copy(context); + + //check for fail + if(e instanceof should.AssertionError) { + //negative fail + if(this.negate) { + this.obj = context.obj; + this.negate = false; + return this; + } + this.assert(false); + } + // throw if it is another exception + throw e; + } + //copy data from sub context to this + this.copy(context); + if(this.negate) { + this.assert(false); + } + + this.obj = context.obj; + this.negate = false; + return this; + }; + + Object.defineProperty(Assertion.prototype, name, prop); +}; + +Assertion.alias = function(from, to) { + Assertion.prototype[to] = Assertion.prototype[from] +}; + +should.AssertionError = AssertionError; +var i = should.format = function i(value) { + if(util.isDate(value) && typeof value.inspect !== 'function') return value.toISOString(); //show millis in dates + return inspect(value, { depth: null }); +}; + +should.use = function(f) { + f(this, Assertion); + return this; +}; + + +/** + * Expose should to external world. + */ +exports = module.exports = should; + + +/** + * Expose api via `Object#should`. + * + * @api public + */ + +Object.defineProperty(Object.prototype, 'should', { + set: function(){}, + get: function(){ + return should(this); + }, + configurable: true +}); + + +Assertion.prototype = { + constructor: Assertion, + + assert: function(expr) { + if(expr) return; + + var params = this.params; + + var msg = params.message, generatedMessage = false; + if(!msg) { + msg = this.getMessage(); + generatedMessage = true; + } + + var err = new AssertionError({ + message: msg + , actual: this.obj + , expected: params.expected + , stackStartFunction: this.assert + }); + + err.showDiff = params.showDiff; + err.operator = params.operator; + err.generatedMessage = generatedMessage; + + throw err; + }, + + getMessage: function() { + return 'expected ' + i(this.obj) + (this.negate ? ' not ': ' ') + + this.params.operator + ('expected' in this.params ? ' ' + i(this.params.expected) : ''); + }, + + copy: function(other) { + this.params = other.params; + }, + + copyIfMissing: function(other) { + if(!this.params) this.params = other.params; + }, + + + /** + * Negation modifier. + * + * @api public + */ + + get not() { + this.negate = !this.negate; + return this; + } +}; + diff --git a/node_modules/should/lib/util.js b/node_modules/should/lib/util.js new file mode 100644 index 00000000..2fdddd52 --- /dev/null +++ b/node_modules/should/lib/util.js @@ -0,0 +1,119 @@ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Check if given obj just a primitive type wrapper + * @param {Object} obj + * @returns {boolean} + * @api private + */ +exports.isWrapperType = function(obj) { + return isNumber(obj) || isString(obj) || isBoolean(obj); +}; + +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * utils.merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api private + */ + +exports.merge = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; + +function isNumber(arg) { + return typeof arg === 'number' || arg instanceof Number; +} + +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string' || arg instanceof String; +} + +function isBoolean(arg) { + return typeof arg === 'boolean' || arg instanceof Boolean; +} +exports.isBoolean = isBoolean; + +exports.isString = isString; + +function isBuffer(arg) { + return typeof Buffer !== 'undefined' && arg instanceof Buffer; +} + +exports.isBuffer = isBuffer; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} + +exports.isDate = isDate; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +exports.isObject = isObject; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} + +exports.isRegExp = isRegExp; + +function isNullOrUndefined(arg) { + return arg == null; +} + +exports.isNullOrUndefined = isNullOrUndefined; + +function isArguments(object) { + return objectToString(object) === '[object Arguments]'; +} + +exports.isArguments = isArguments; + +exports.isFunction = function(arg) { + return typeof arg === 'function' || arg instanceof Function; +}; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +exports.inspect = require('util').inspect; + +exports.AssertionError = require('assert').AssertionError; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +exports.forOwn = function(obj, f, context) { + for(var prop in obj) { + if(hasOwnProperty.call(obj, prop)) { + f.call(context, obj[prop], prop); + } + } +}; \ No newline at end of file diff --git a/node_modules/should/package.json b/node_modules/should/package.json new file mode 100644 index 00000000..faca2010 --- /dev/null +++ b/node_modules/should/package.json @@ -0,0 +1,38 @@ +{ + "name": "should", + "description": "test framework agnostic BDD-style assertions", + "version": "3.1.2", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/should.js.git" + }, + "homepage": "https://github.com/visionmedia/should.js", + "scripts": { + "test": "make test" + }, + "devDependencies": { + "mocha": "*", + "jsdom": "*", + "jquery": "*" + }, + "keywords": [ + "test", + "bdd", + "assert" + ], + "main": "./lib/node.js", + "engines": { + "node": ">= 0.2.0" + }, + "readme": "# should.js\n\n_should_ is an expressive, readable, test framework agnostic, assertion library. Main goals of this library __to be expressive__ and __to be helpful__. It means test code should be clean, and error messages enough helpfull to understand error.\n\nIt extends the `Object.prototype` with a single non-enumerable getter that allows you to express how that object should behave, also it returns itself when required with `require`.\n\n## Example\n```javascript\nvar should = require('should');\n\nvar user = {\n name: 'tj'\n , pets: ['tobi', 'loki', 'jane', 'bandit']\n};\n\nuser.should.have.property('name', 'tj');\nuser.should.have.property('pets').with.lengthOf(4);\n\n// if the object was created with Object.create(null)\n// then it doesn't inherit `Object` and have the `should` getter\n// so you can do:\n\nshould(user).have.property('name', 'tj');\nshould(true).ok;\n\nsomeAsyncTask(foo, function(err, result){\n should.not.exist(err);\n should.exist(result);\n result.bar.should.equal(foo);\n});\n```\n## To begin\n\n 1. Install it:\n \n $ npm install should --save-dev\n \n 2. Require it and use:\n\n```javascript\nvar should = require('should');\n\n(5).should.be.exactly(5).and.be.a.Number;\n```\n\n## In browser\n\nIf you want to use _should_ in browser, use version that is in root of repository (or build it yourself). It is builded with browserify (see [Makefile](https://github.com/visionmedia/should.js/blob/master/Makefile)). To build fresh version:\n\n```bash\n# you should have browserify\nnpm install -g browserify\nmake browser\n```\n\nThis script exported to `window.Should`. It is the same as use `should` statically:\n\n```js\nShould(5).be.exactly(5)\n```\n\nAlso as for node.js case `Object.prototype` extended with `should` (that is why `window.Should` used):\n\n```js\nwindow.should.be.exactly(window);\n// the same\n// window is host object \nshould.be.exactly(window);\n// you should not really care about it\n\n(5).should.be.exactly(5);\n```\n\n*should.js* uses EcmaScript 5 very extensively so any browser that support ES5 is supported. (IE <=8 not supported).\nSee [kangax's compat table](http://kangax.github.io/es5-compat-table) to know which exactly.\n\nYou can easy install it with again npm or bower:\n```\nnpm install should --save-dev\n# or\nbower install visionmedia/should.js\n```\n\n## Static should and assert module\n\nFor some rare cases should can be used statically, without `Object.prototype`.\nIt can be replacement for node assert module:\n\n```javascript\nassert.fail(actual, expected, message, operator) // just write wrong should assertion\nassert(value, message), assert.ok(value, [message]) // should(value).ok\nassert.equal(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.deepEqual(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notDeepEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.strictEqual(actual, expected, [message]) // should(actual).equal(expected, [message])\nassert.notStrictEqual(actual, expected, [message]) // should(actual).not.equal(expected, [message])\nassert.throws(block, [error], [message]) // should(block).throw([error])\nassert.doesNotThrow(block, [message]) // should(block).not.throw([error])\nassert.ifError(value) // should(value).Error (to check if it is error) or should(value).not.ok (to check that it is falsy)\n```\n\t\n## .not\n\n`.not` negate current assertion.\n\n# Assertions\n## chaining assertions\n\nEvery assertion will return a `should.js`-wrapped Object, so assertions can be chained.\nYou can use this helpers to just chain: `.an`, `.of`, `.a`, `.and`, `.be`, `.have`, `.with`, `.is`, `.which`. Use them for better readability, they do nothing at all.\nFor example:\n```js\nuser.should.be.an.instanceOf(Object).and.have.property('name', 'tj');\nuser.pets.should.be.instanceof(Array).and.have.lengthOf(4);\n```\nAlmost all assertions return the same object - so you can easy chain them. But some move assertion object to property value. See feather, it will be mention if object chainged.\n\n## .ok\n\nAssert if asseted object is truthy in javascript meaning of truthy ('', null, undefined, 0 , NaN, Infinity - is falsy, so all others are truthy).\n\nAssert truthfulness:\n\n```javascript\ntrue.should.be.ok;\n'yay'.should.be.ok;\n(1).should.be.ok;\n({}).should.be.ok;\n```\n\nor negated:\n\n```javascript\nfalse.should.not.be.ok;\n''.should.not.be.ok;\n(0).should.not.be.ok;\n```\n\n## .true\n\nAssert if asseted object === true:\n\n```javascript\ntrue.should.be.true;\n'1'.should.not.be.true;\n```\n\n## .false\n\nAssert if asseted object === false:\n\n```javascript\nfalse.should.be.false;\n(0).should.not.be.false;\n```\n\n## .eql(otherValue)\n\nAssert if asserted object is *equal* to otherValue. This means that object compared by its actual content, not just reference equality.\n \n```javascript\n({ foo: 'bar' }).should.eql({ foo: 'bar' });\n[1,2,3].should.eql([1,2,3]);\n// see next example it is correct, even if it is different types, but actual content the same\n[1, 2, 3].should.eql({ '0': 1, '1': 2, '2': 3 });\n```\n## .equal(otherValue) and .exactly(otherValue)\n\nAssert if asserted object strictly equal to `otherValue` (using `===` - no type conversion for primitive types and reference equivalence for reference types).\n\n```javascript\n(4).should.equal(4);\n'test'.should.equal('test');\n[1,2,3].should.not.equal([1,2,3]);\n(4).should.be.exactly(4);\n```\n\n## .startWith(str)\n\nAssert that string starts with `str`.\n\n```javascript\n'foobar'.should.startWith('foo');\n'foobar'.should.not.startWith('bar');\n```\n## .endWith(str)\n\nAssert that string ends with `str`.\n\n```javascript\n'foobar'.should.endWith('bar');\n'foobar'.should.not.endWith('foo');\n```\n\n## .within(from, to)\n\nAssert inclusive numeric range (`<= to` and `>= from`):\n```javascript\nuser.age.should.be.within(5, 50);\n(5).should.be.within(5, 10).and.within(5, 5);\n```\n\n## .approximately(num, delta)\n\nAssert floating point number near `num` within `delta` margin:\n\n```javascript\n(99.99).should.be.approximately(100, 0.1);\n```\n\n## .above(num) and .greaterThan(num)\n\nAssert numeric value above the given value (`> num`):\n\n```javascript\nuser.age.should.be.above(5);\nuser.age.should.not.be.above(100);\n(5).should.be.above(0);\n(5).should.not.be.above(5);\n```\n\n## .below(num) and .lessThan(num)\n\nAssert numeric value below the given value (`< num`):\n\n```javascript\nuser.age.should.be.below(100);\nuser.age.should.not.be.below(5);\n(5).should.be.below(6);\n(5).should.not.be.below(5);\n```\n\n## .NaN\n\nAssert numeric value is NaN:\n\n```javascript\n(undefined + 0).should.be.NaN;\n```\n\n## .Infinity\n\nAssert numeric value is Infinity:\n\n```javascript\n(1/0).should.be.Infinity;\n```\n\n## .type(str)\n\nAssert given value have such type (using __typeof__ operator):\n```javascript\nuser.should.be.type('object');\n'test'.should.be.type('string');\n```\n\n## .instanceof(constructor) and .instanceOf(constructor)\n\nAssert given value is instance of `constructor` (using __instanceof__ operator):\n\n```javascript\nuser.should.be.an.instanceof(User);\n[].should.be.an.instanceOf(Array);\n```\n\n## .arguments\n\nAssert given object is an `Arguments`:\n\n```javascript\nvar args = (function(){ return arguments; })(1,2,3);\nargs.should.be.arguments;\n[].should.not.be.arguments;\n```\n\n## .Object, .Number, .Array, .Boolean, .Function, .String, .Error\n\nAssert given object is instance of such constructor (shortcut for `.instanceof` assertion).\n\n```javascript\n({}).should.be.an.Object;\n(1).should.be.a.Number;\n[].should.be.an.Array.and.an.Object;\n(true).should.be.a.Boolean;\n''.should.be.a.String;\n```\n\n## .property(name[, value])\n\nAssert property exists and has optional value(compare using `.eql`):\n```javascript\nuser.should.have.property('name');\nuser.should.have.property('age', 15);\nuser.should.not.have.property('rawr');\nuser.should.not.have.property('age', 0);\n[1, 2].should.have.property('0', 1);\n```\n\n__NB__ `.property` change object to actual property value!\n\n## .properties(propName1, propName2, ...) or .properties([propName1, propName2, ...]) or .properties(obj)\n\n`obj` it is object that map properties to their actual values.\n\nAssert all given properties exists and have given values (compare using `.eql`):\n\n```javascript\nuser.should.have.properties('name', 'age');\nuser.should.have.properties(['name', 'age']);\nuser.should.have.properties({\n name: 'denis',\n age: 24\n});\n```\n\n## .length(number) and .lengthOf(number)\n\nAssert _length_ property exists and has a value of the given number (shortcut for `.property('length', number)`):\n```javascript\nuser.pets.should.have.length(5);\nuser.pets.should.have.a.lengthOf(5);\n({ length: 10}).should.have.length(10);\n```\n\n__NB__ `.length` change object to actual property value!\n\n## .ownProperty(str) and .hasOwnProperty(str)\n\nAssert given object has own property (using `.hasOwnProperty`):\n```javascript\n({ foo: 'bar' }).should.have.ownProperty('foo').equal('bar');\n```\n\n__NB__ `.length` change object to actual property value!\n\n## .empty\n\nAssert given value is empty. It means for strings, arrays, arguments length == 0 and for object do not have own properties.\n\n```javascript\n[].should.be.empty;\n''.should.be.empty;\n({}).should.be.empty;\n(function() {\n arguments.should.be.empty;\n})();\n```\n\n## .keys([key1, key2, ...]) and .keys(key1, key2, ...) and .key(key)\n\nAssert own object keys, which must match _exactly_,\nand will fail if you omit a key or two:\n\n```javascript\nvar obj = { foo: 'bar', baz: 'raz' };\nobj.should.have.keys('foo', 'baz');\nobj.should.have.keys(['foo', 'baz']);\n({}).should.have.keys();\n({}).should.have.keys('key'); //fail AssertionError: expected {} to have key 'key'missing keys: 'key'\n```\n\n## .containEql(otherValue)\n\nAssert given value to contain something *.eql* to otherValue. See examples to understand better:\n\n```javascript\n'hello boy'.should.containEql('boy');\n[1,2,3].should.containEql(3);\n[[1],[2],[3]].should.containEql([3]);\n[[1],[2],[3, 4]].should.not.containEql([3]);\n\n({ b: 10 }).should.containEql({ b: 10 });\n([1, 2, { a: 10 }]).should.containEql({ a: 10 });\n[1, 2, 3].should.not.containEql({ a: 1 });\n\n[{a: 'a'}, {b: 'b', c: 'c'}].should.containEql({a: 'a'});\n[{a: 'a'}, {b: 'b', c: 'c'}].should.not.containEql({b: 'b'});\n```\n\n## .containDeep(otherValue)\n\nAssert given value to contain something *.eql* to otherValue within depth.\nAgain see examples:\n\n```javascript\n'hello boy'.should.containDeep('boy');\n[1,2,3].should.containDeep([3]);\n[1,2,3].should.containDeep([1, 3]);\n//but not\n[1,2,3].should.containDeep([3, 1]);\n\n({ a: { b: 10 }, b: { c: 10, d: 11, a: { b: 10, c: 11} }}).should\n .containDeep({ a: { b: 10 }, b: { c: 10, a: { c: 11 }}});\n\n[1, 2, 3, { a: { b: { d: 12 }}}].should.containDeep([{ a: { b: {d: 12}}}]);\n\n[[1],[2],[3]].should.containDeep([[3]]);\n[[1],[2],[3, 4]].should.containDeep([[3]]);\n[{a: 'a'}, {b: 'b', c: 'c'}].should.containDeep([{a: 'a'}]);\n[{a: 'a'}, {b: 'b', c: 'c'}].should.containDeep([{b: 'b'}]);\n```\n\nIt does not search somewhere in depth it check all pattern in depth. Object checked\nby properties key and value, arrays checked like sub sequences. Everyting compared using .eql.\nMain difference with `.containEql` is that this assertion require full type chain -\nif asserted value is an object, otherValue should be also an object (which is sub object of given).\nThe same true for arrays, otherValue should be an array which compared to be subsequence of given object.\n\n## .match(otherValue)\n\nAssert given object to match `otherValue`.\n\nGiven: String, otherValue: regexp. Uses `RegExp#exec(str)`:\n```javascript\nusername.should.match(/^\\w+$/)\n```\n\nGiven: Array, otherValue: regexp - assert each value match to regexp.\n```javascript\n['a', 'b', 'c'].should.match(/[a-z]/);\n['a', 'b', 'c'].should.not.match(/[d-z]/);\n```\n\nGiven: Object, otherValue: regexp - assert own property's values to match regexp.\n```javascript\n({ a: 'foo', c: 'barfoo' }).should.match(/foo$/);\n({ a: 'a' }).should.not.match(/^http/);\n```\n\nGiven: Anything, otherValue: function - assert if given value matched to function.\n\nFunction can use .should inside or return 'true' or 'false', in all other cases it do nothing. If you return value that return assertion, you will receive better error messages.\n\n```javascript\n(5).should.match(function(n) { return n > 0; });\n(5).should.not.match(function(n) { return n < 0; });\n(5).should.not.match(function(it) { it.should.be.an.Array; });\n(5).should.match(function(it) { return it.should.be.a.Number; });\n```\n\nNow compare messages:\n```javascript\n(5).should.not.match(function(it) { it.should.be.a.Number; });\n//AssertionError: expected 5 not to match [Function]\n(5).should.not.match(function(it) { return it.should.be.a.Number; });\n//AssertionError: expected 5 not to match [Function]\n//\texpected 5 to be a number\n```\n\nGiven: object, otherValue: another object - assert that object properties match to properties of another object in meaning that describe above cases. See examples:\n\n```javascript\n({ a: 10, b: 'abc', c: { d: 10 }, d: 0 }).should\n .match({ a: 10, b: /c$/, c: function(it) { return it.should.have.property('d', 10); }});\n\n[10, 'abc', { d: 10 }, 0].should\n\t.match({ '0': 10, '1': /c$/, '2': function(it) { return it.should.have.property('d', 10); } });\n\n[10, 'abc', { d: 10 }, 0].should\n .match([10, /c$/, function(it) { return it.should.have.property('d', 10); }]); \n```\n\n## .matchEach(otherValue)\n\nAssert given property keys and values each match given check object.\n\nIf `otherValue` is RegExp, then each property value checked to match it:\n```javascript\n(['a', 'b', 'c']).should.matchEach(/[a-c]/);\n```\n\nIf `otherValue` is Function, then check each property value and key matched it:\n```javascript\n[10, 11, 12].should.matchEach(function(it) { return it >= 10; });\n[10, 11, 12].should.matchEach(function(it) { return it >= 10; });\n```\n\nIn other cases it check that each property value is `.eql` to `otherValue`:\n```javascript\n[10, 10].should.matchEach(10);\n```\n## .throw() and throwError()\n\nAssert an exception is thrown:\n\n```js\n(function(){\n throw new Error('fail');\n}).should.throw();\n```\n\nAssert an exception is not thrown:\n\n```js\n(function(){\n\n}).should.not.throw();\n```\nAssert exception message matches string:\n\n```js\n(function(){\n throw new Error('fail');\n}).should.throw('fail');\n```\n\nAssert exepection message matches regexp:\n\n```js\n(function(){\n throw new Error('failed to foo');\n}).should.throw(/^fail/);\n```\n\nIf you need to pass arguments and/or context to execute function use `Function#bind(context, arg1, ...)`:\n```js\nfunction isPositive(n) {\n if(n <= 0) throw new Error('Given number is not positive')\n}\n\nisPositive.bind(null, 10).should.not.throw();\nisPositive.bind(null, -10).should.throw();\n```\n\nIf you need to check something in asynchronous function it is required to do in 2 steps:\n\n```js\n// first we need to check that function is called\nvar called = false;\ncollection.findOne({ _id: 10 }, function(err, res) {\n called = true;\n \n //second we test what you want\n res.should.be....\n});\n\ncalled.should.be.true;\n```\n\nIn case you are using something like `Mocha`, you should use asynchronous test and call `done()` in proper place to make sure that you asynchronous function is called before test is finished.\n```js\ncollection.findOne({ _id: 10 }, function(err, res) {\n if(err) return done(err);\n //second we test what you want\n res.should.be....\n \n done();\n});\n```\n\nIn general case if you need to check that something is executed you need such thing as `spies`, good example is an [sinon](http://sinonjs.org/).\n\n## .status(code)\n\nAsserts that `.statusCode` is `code`:\n```javascript\nres.should.have.status(200);\n```\n\nNot included in browser build.\n\n## .header(field[, value])\n\nAsserts that a `.headers` object with `field` and optional `value` are present:\n```javascript\nres.should.have.header('content-length');\nres.should.have.header('Content-Length', '123');\n```\n\nNot included in browser build.\n\n## .json\n\nAssert that Content-Type is \"application/json; charset=utf-8\"\n\n```javascript\nres.should.be.json\n```\n\nNot included in browser build.\n\n## .html\n\nAssert that Content-Type is \"text/html; charset=utf-8\"\n```javascript\nres.should.be.html\n```\n\nNot included in browser build.\n\n## Optional Error description\n\nAs it can often be difficult to ascertain exactly where failed assertions are coming from in your tests, an optional description parameter can be passed to several should matchers. The description will follow the failed assertion in the error:\n\n (1).should.eql(0, 'some useful description')\n\n AssertionError: some useful description\n at Object.eql (/Users/swift/code/should.js/node_modules/should/lib/should.js:280:10)\n ...\n\nThe methods that support this optional description are: `eql`, `equal`, `within`, `instanceof`, `above`, `below`, `match`, `length`, `property`, `ownProperty`.\n\n## Mocha example\n\nFor example you can use should with the [Mocha test framework](http://visionmedia.github.io/mocha/) by simply including it:\n\n```javascript\nvar should = require('should');\nvar mylib = require('mylib');\n\n\ndescribe('mylib', function () {\n it('should have a version with the format #.#.#', function() {\n lib.version.should.match(/^\\d+\\.\\d+\\.\\d+$/);\n }\n});\n```\n\n## Contributions\n\n[Actual list of contributors](https://github.com/visionmedia/should.js/graphs/contributors) if you want to show it your friends.\n\nTo run the tests for _should_ simply run:\n\n $ make test\n \nBefore contribute something:\n\n1. Your code looks like all other code - all project should look like it was written by one man, always.\n2. If you want propose something - just create issue and describe your question with much description as you can.\n3. Please never send issues or pull requests about code style, jshint violations etc - i do not accept it (and you will spend your time for free).\n4. If you think you have some general receipt, consider create PR with it.\n5. If you not sure if you receipt enough general just create your own plugin for should.js. (see should.use and Assertion.add usage).\n6. If you add new code it should be covered by tests, no tests - no code. \n7. If you find bug (or at least you think it is a bug), create issue with library version and test case that I can run and see what are you talking about, or at least full steps that I can reproduce it.\n\n## OMG IT EXTENDS OBJECT???!?!@\n\nYes, yes it does, with a single getter _should_, and no it won't break your code, because it does this **properly** with a non-enumerable property.\n\n## License\n\nMIT\n", + "readmeFilename": "Readme.md", + "bugs": { + "url": "https://github.com/visionmedia/should.js/issues" + }, + "_id": "should@3.1.2", + "_from": "should@" +} diff --git a/node_modules/should/should.js b/node_modules/should/should.js new file mode 100644 index 00000000..44160f8d --- /dev/null +++ b/node_modules/should/should.js @@ -0,0 +1,2321 @@ +!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Should=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + * MIT Licensed + */ + +var should = require('./should'); + +should + .use(require('./ext/assert')) + .use(require('./ext/chain')) + .use(require('./ext/bool')) + .use(require('./ext/number')) + .use(require('./ext/eql')) + .use(require('./ext/type')) + .use(require('./ext/string')) + .use(require('./ext/property')) + .use(require('./ext/error')) + .use(require('./ext/match')) + .use(require('./ext/browser/jquery')) + .use(require('./ext/deprecated')); + + module.exports = should; +},{"./ext/assert":3,"./ext/bool":4,"./ext/browser/jquery":5,"./ext/chain":6,"./ext/deprecated":7,"./ext/eql":8,"./ext/error":9,"./ext/match":10,"./ext/number":11,"./ext/property":12,"./ext/string":13,"./ext/type":14,"./should":15}],2:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +// Taken from node's assert module, because it sucks +// and exposes next to nothing useful. +var util = require('./util'); + +module.exports = _deepEqual; + +var pSlice = Array.prototype.slice; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + + +function objEquiv (a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (util.isArguments(a)) { + if (!util.isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try{ + var ka = Object.keys(a), + kb = Object.keys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +},{"./util":16}],3:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util') + , assert = require('assert') + , AssertionError = assert.AssertionError; + +module.exports = function(should) { + var i = should.format; + + /** + * Expose assert to should + * + * This allows you to do things like below + * without require()ing the assert module. + * + * should.equal(foo.bar, undefined); + * + */ + util.merge(should, assert); + + + /** + * Assert _obj_ exists, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + should.exist = should.exists = function(obj, msg) { + if(null == obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to exist'), stackStartFunction: should.exist + }); + } + }; + + /** + * Asserts _obj_ does not exist, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + + should.not = {}; + should.not.exist = should.not.exists = function(obj, msg) { + if(null != obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to not exist'), stackStartFunction: should.not.exist + }); + } + }; +}; +},{"../util":16,"assert":17}],4:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('true', function() { + this.is.exactly(true) + }, true); + + Assertion.add('false', function() { + this.is.exactly(false) + }, true); + + Assertion.add('ok', function() { + this.params = { operator: 'to be truthy' }; + + this.assert(this.obj); + }, true); +}; +},{}],5:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/*! + * Portions copyright (c) 2010, 2011, 2012 Wojciech Zawistowski, Travis Jeffery + * From the jasmine-jquery project under the MIT License. + */ + +var util = require('../../util'); + +module.exports = function(should, Assertion) { + var i = should.format; + var $ = this.jQuery || this.$; + + /* Otherwise, node's util.inspect loops hangs */ + if (typeof HTMLElement !== "undefined" && HTMLElement && !HTMLElement.prototype.inspect) { + HTMLElement.prototype.inspect = function () { + return this.outerHTML; + }; + } + + if (typeof jQuery !== "undefined" && jQuery && !jQuery.prototype.inspect) { + jQuery.fn.inspect = function () { + var elementList = this.toArray().map(function (e) { + return util.inspect(e); + }).join(", "); + if (this.selector) { + return "SELECTOR(" + this.selector + ") matching " + this.length + " elements" + (elementList.length ? ": " + elementList : ""); + } else { + return elementList; + } + }; + } + + function jQueryAttributeTestHelper(method, singular, plural, nameOrHash, value) { + var keys = util.isObject(nameOrHash) ? Object.keys(nameOrHash) : [nameOrHash]; + var allRelevantAttributes = keys.reduce(function (memo, key) { + var value = $(this.obj)[method](key); + if (typeof value !== 'undefined') { + memo[key] = value; + } + return memo; + }.bind(this), {}); + + if (arguments.length === 4 && util.isObject(nameOrHash)) { + this.params = { operator: 'to have ' + plural + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.properties(nameOrHash); + } else if (arguments.length === 4) { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.property(nameOrHash); + } else { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) + ' with value ' + i(value) }; + allRelevantAttributes.should.have.property(nameOrHash, value); + } + } + + var browserTagCaseIndependentHtml = function (html) { + return $('
        ').append(html).html(); + }; + + var addJqPredicateAssertion = function (predicate, nameOverride, operatorOverride) { + Assertion.add(nameOverride || predicate, function() { + this.params = { operator: 'to be ' + (operatorOverride || predicate) }; + this.assert($(this.obj).is(':' + predicate)); + }, true); + } + + Assertion.add('className', function(className) { + this.params = { operator: 'to have class ' + className }; + this.assert($(this.obj).hasClass(className)); + }); + + Assertion.add('css', function(css) { + this.params = { operator: 'to have css ' + i(css) }; + for (var prop in css) { + var value = css[prop]; + if (value === 'auto' && $(this.obj).get(0).style[prop] === 'auto') { + continue; + } + $(this.obj).css(prop).should.eql(value); + } + }); + + addJqPredicateAssertion('visible'); + addJqPredicateAssertion('hidden'); + addJqPredicateAssertion('selected'); + addJqPredicateAssertion('checked'); + addJqPredicateAssertion('disabled'); + addJqPredicateAssertion('empty', 'emptyJq'); + addJqPredicateAssertion('focus', 'focused', 'focused'); + + Assertion.add('inDOM', function() { + this.params = { operator: 'to be in the DOM' }; + this.assert($.contains(document.documentElement, $(this.obj)[0])); + }, true); + + Assertion.add('exist', function() { + this.params = { operator: 'to exist' }; + $(this.obj).should.not.have.length(0); + }, true); + + Assertion.add('attr', function() { + var args = [ + 'attr', + 'attribute', + 'attributes' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('prop', function() { + var args = [ + 'prop', + 'property', + 'properties' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('elementId', function(id) { + this.params = { operator: 'to have ID ' + i(id) }; + this.obj.should.have.attr('id', id); + }); + + Assertion.add('html', function(html) { + this.params = { operator: 'to have HTML ' + i(html) }; + $(this.obj).html().should.eql(browserTagCaseIndependentHtml(html)); + }); + + Assertion.add('containHtml', function(html) { + this.params = { operator: 'to contain HTML ' + i(html) }; + $(this.obj).html().indexOf(browserTagCaseIndependentHtml(html)).should.be.above(-1); + }); + + Assertion.add('text', function(text) { + this.params = { operator: 'to have text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.should.eql(text); + } + }); + + Assertion.add('containText', function(text) { + this.params = { operator: 'to contain text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.indexOf(text).should.be.above(-1); + } + }); + + Assertion.add('value', function(val) { + this.params = { operator: 'to have value ' + i(val) }; + $(this.obj).val().should.eql(val); + }); + + Assertion.add('data', function() { + var args = [ + 'data', + 'data', + 'data' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('containElement', function(target) { + this.params = { operator: 'to contain ' + $(target).inspect() }; + $(this.obj).find(target).should.not.have.length(0); + }); + + Assertion.add('matchedBy', function(selector) { + this.params = { operator: 'to be matched by selector ' + selector }; + $(this.obj).filter(selector).should.not.have.length(0); + }); + + Assertion.add('handle', function(event) { + this.params = { operator: 'to handle ' + event }; + + var events = $._data($(this.obj).get(0), "events"); + + if (!events || !event || typeof event !== "string") { + return this.assert(false); + } + + var namespaces = event.split("."), + eventType = namespaces.shift(), + sortedNamespaces = namespaces.slice(0).sort(), + namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + if (events[eventType] && namespaces.length) { + for (var i = 0; i < events[eventType].length; i++) { + var namespace = events[eventType][i].namespace; + + if (namespaceRegExp.test(namespace)) { + return; + } + } + } else { + events.should.have.property(eventType); + events[eventType].should.not.have.length(0); + return; + } + + this.assert(false); + }); + + Assertion.add('handleWith', function(eventName, eventHandler) { + this.params = { operator: 'to handle ' + eventName + ' with ' + eventHandler }; + + var normalizedEventName = eventName.split('.')[0], + stack = $._data($(this.obj).get(0), "events")[normalizedEventName]; + + for (var i = 0; i < stack.length; i++) { + if (stack[i].handler == eventHandler) { + return; + } + } + + this.assert(false); + }); +}; +},{"../../util":16}],6:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + + function addLink(name) { + Object.defineProperty(Assertion.prototype, name, { + get: function() { + return this; + } + }); + } + + ['an', 'of', 'a', 'and', 'be', 'have', 'with', 'is', 'which'].forEach(addLink); +}; +},{}],7:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('include', function(obj, description) { + if(!Array.isArray(this.obj) && !util.isString(this.obj)) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + var cmp = {}; + for(var key in obj) cmp[key] = this.obj[key]; + this.assert(eql(cmp, obj)); + } else { + this.params = { operator: 'to include ' + i(obj), message: description }; + + this.assert(~this.obj.indexOf(obj)); + } + }); + + Assertion.add('includeEql', function(obj, description) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + + this.assert(this.obj.some(function(item) { + return eql(obj, item); + })); + }); +}; +},{"../eql":2,"../util":16}],8:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var eql = require('../eql'); + +module.exports = function(should, Assertion) { + Assertion.add('eql', function(val, description) { + this.params = { operator: 'to equal', expected: val, showDiff: true, message: description }; + + this.assert(eql(val, this.obj)); + }); + + Assertion.add('equal', function(val, description) { + this.params = { operator: 'to be', expected: val, showDiff: true, message: description }; + + this.assert(val === this.obj); + }); + + Assertion.alias('equal', 'exactly'); +}; +},{"../eql":2}],9:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('throw', function(message) { + var fn = this.obj + , err = {} + , errorInfo = '' + , ok = true; + + try { + fn(); + ok = false; + } catch(e) { + err = e; + } + + if(ok) { + if('string' == typeof message) { + ok = message == err.message; + } else if(message instanceof RegExp) { + ok = message.test(err.message); + } else if('function' == typeof message) { + ok = err instanceof message; + } + + if(message && !ok) { + if('string' == typeof message) { + errorInfo = " with a message matching '" + message + "', but got '" + err.message + "'"; + } else if(message instanceof RegExp) { + errorInfo = " with a message matching " + message + ", but got '" + err.message + "'"; + } else if('function' == typeof message) { + errorInfo = " of type " + message.name + ", but got " + err.constructor.name; + } + } else { + errorInfo = " (got " + i(err) + ")"; + } + } + + this.params = { operator: 'to throw exception' + errorInfo }; + + this.assert(ok); + }); + + Assertion.alias('throw', 'throwError'); +}; +},{}],10:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('match', function(other, description) { + this.params = { operator: 'to match ' + i(other), message: description }; + + if(!eql(this.obj, other)) { + if(util.isRegExp(other)) { // something - regex + + if(util.isString(this.obj)) { + + this.assert(other.exec(this.obj)); + } else if(Array.isArray(this.obj)) { + + this.obj.forEach(function(item) { + this.assert(other.exec(item));// should we try to convert to String and exec? + }, this); + } else if(util.isObject(this.obj)) { + + var notMatchedProps = [], matchedProps = []; + util.forOwn(this.obj, function(value, name) { + if(other.exec(value)) matchedProps.push(i(name)); + else notMatchedProps.push(i(name)); + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } // should we try to convert to String and exec? + } else if(util.isFunction(other)) { + var res; + try { + res = other(this.obj); + } catch(e) { + if(e instanceof should.AssertionError) { + this.params.operator += '\n\t' + e.message; + } + throw e; + } + + if(res instanceof Assertion) { + this.params.operator += '\n\t' + res.getMessage(); + } + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + } else if(util.isObject(other)) { // try to match properties (for Object and Array) + notMatchedProps = []; matchedProps = []; + + util.forOwn(other, function(value, key) { + try { + this.obj[key].should.match(value); + matchedProps.push(key); + } catch(e) { + if(e instanceof should.AssertionError) { + notMatchedProps.push(key); + } else { + throw e; + } + } + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } else { + this.assert(false); + } + } + }); + + Assertion.add('matchEach', function(other, description) { + this.params = { operator: 'to match each ' + i(other), message: description }; + + var f = other; + + if(util.isRegExp(other)) + f = function(it) { + return !!other.exec(it); + }; + else if(!util.isFunction(other)) + f = function(it) { + return eql(it, other); + }; + + util.forOwn(this.obj, function(value, key) { + var res = f(value, key); + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + }, this); + }); +}; +},{"../eql":2,"../util":16}],11:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('NaN', function() { + this.params = { operator: 'to be NaN' }; + + this.is.a.Number + .and.assert(isNaN(this.obj)); + }, true); + + Assertion.add('Infinity', function() { + this.params = { operator: 'to be Infinity' }; + + this.is.a.Number + .and.not.a.NaN + .and.assert(!isFinite(this.obj)); + }, true); + + Assertion.add('within', function(start, finish, description) { + this.params = { operator: 'to be within ' + start + '..' + finish, message: description }; + + this.assert(this.obj >= start && this.obj <= finish); + }); + + Assertion.add('approximately', function(value, delta, description) { + this.params = { operator: 'to be approximately ' + value + " ±" + delta, message: description }; + + this.assert(Math.abs(this.obj - value) <= delta); + }); + + Assertion.add('above', function(n, description) { + this.params = { operator: 'to be above ' + n, message: description }; + + this.assert(this.obj > n); + }); + + Assertion.add('below', function(n, description) { + this.params = { operator: 'to be below ' + n, message: description }; + + this.assert(this.obj < n); + }); + + Assertion.alias('above', 'greaterThan'); + Assertion.alias('below', 'lessThan'); + +}; +},{}],12:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +var aSlice = Array.prototype.slice; + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('property', function(name, val) { + if(arguments.length > 1) { + var p = {}; + p[name] = val; + this.have.properties(p); + } else { + this.have.properties(name); + } + this.obj = this.obj[name]; + }); + + Assertion.add('properties', function(names) { + var values = {}; + if(arguments.length > 1) { + names = aSlice.call(arguments); + } else if(!Array.isArray(names)) { + if(util.isString(names)) { + names = [names]; + } else { + values = names; + names = Object.keys(names); + } + } + + var obj = Object(this.obj), missingProperties = []; + + //just enumerate properties and check if they all present + names.forEach(function(name) { + if(!(name in obj)) missingProperties.push(i(name)); + }); + + var props = missingProperties; + if(props.length === 0) { + props = names.map(i); + } + + var operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(missingProperties.length === 0); + + // check if values in object matched expected + var valueCheckNames = Object.keys(values); + if(valueCheckNames.length) { + var wrongValues = []; + props = []; + + // now check values, as there we have all properties + valueCheckNames.forEach(function(name) { + var value = values[name]; + if(!eql(obj[name], value)) { + wrongValues.push(i(name) + ' of ' + i(value) + ' (got ' + i(obj[name]) + ')'); + } else { + props.push(i(name) + ' of ' + i(value)); + } + }); + + if(wrongValues.length > 0) { + props = wrongValues; + } + + operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(wrongValues.length === 0); + } + }); + + Assertion.add('length', function(n, description) { + this.have.property('length', n, description); + }); + + Assertion.alias('length', 'lengthOf'); + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + Assertion.add('ownProperty', function(name, description) { + this.params = { operator: 'to have own property ' + i(name), message: description }; + + this.assert(hasOwnProperty.call(this.obj, name)); + + this.obj = this.obj[name]; + }); + + Assertion.alias('hasOwnProperty', 'ownProperty'); + + Assertion.add('empty', function() { + this.params = { operator: 'to be empty' }; + + if(util.isString(this.obj) || Array.isArray(this.obj) || util.isArguments(this.obj)) { + this.have.property('length', 0); + } else { + var obj = Object(this.obj); // wrap to reference for booleans and numbers + for(var prop in obj) { + this.have.not.ownProperty(prop); + } + } + }, true); + + Assertion.add('keys', function(keys) { + if(arguments.length > 1) keys = aSlice.call(arguments); + else if(arguments.length === 1 && util.isString(keys)) keys = [ keys ]; + else if(arguments.length === 0) keys = []; + + var obj = Object(this.obj); + + // first check if some keys are missing + var missingKeys = []; + keys.forEach(function(key) { + if(!hasOwnProperty.call(this.obj, key)) + missingKeys.push(i(key)); + }, this); + + // second check for extra keys + var extraKeys = []; + Object.keys(obj).forEach(function(key) { + if(keys.indexOf(key) < 0) { + extraKeys.push(i(key)); + } + }); + + var verb = keys.length === 0 ? 'to be empty' : + 'to have ' + (keys.length === 1 ? 'key ' : 'keys '); + + this.params = { operator: verb + keys.map(i).join(', ')}; + + if(missingKeys.length > 0) + this.params.operator += '\n\tmissing keys: ' + missingKeys.join(', '); + + if(extraKeys.length > 0) + this.params.operator += '\n\textra keys: ' + extraKeys.join(', '); + + this.assert(missingKeys.length === 0 && extraKeys.length === 0); + }); + + Assertion.alias("keys", "key"); + + Assertion.add('containEql', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + var obj = this.obj; + if(Array.isArray(obj)) { + this.assert(obj.some(function(item) { + return eql(item, other); + })); + } else if(util.isString(obj)) { + // expect obj to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) { + // object contains object case + util.forOwn(other, function(value, key) { + obj[key].should.eql(value); + }); + } else { + //other uncovered cases + this.assert(false); + } + }); + + Assertion.add('containDeep', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + + var obj = this.obj; + if(Array.isArray(obj)) { + if(Array.isArray(other)) { + var otherIdx = 0; + obj.forEach(function(item) { + try { + should(item).not.be.null.and.containDeep(other[otherIdx]); + otherIdx++; + } catch(e) { + if(e instanceof should.AssertionError) { + return; + } + throw e; + } + }); + this.assert(otherIdx == other.length); + //search array contain other as sub sequence + } else { + this.assert(false); + } + } else if(util.isString(obj)) {// expect other to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) {// object contains object case + if(util.isObject(other)) { + util.forOwn(other, function(value, key) { + should(obj[key]).not.be.null.and.containDeep(value); + }); + } else {//one of the properties contain value + this.assert(false); + } + } else { + this.eql(other); + } + }); + +}; +},{"../eql":2,"../util":16}],13:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('startWith', function(str, description) { + this.params = { operator: 'to start with ' + should.format(str), message: description }; + + this.assert(0 === this.obj.indexOf(str)); + }); + + Assertion.add('endWith', function(str, description) { + this.params = { operator: 'to end with ' + should.format(str), message: description }; + + this.assert(this.obj.indexOf(str, this.obj.length - str.length) >= 0); + }); +}; +},{}],14:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'); + +module.exports = function(should, Assertion) { + Assertion.add('Number', function() { + this.params = { operator: 'to be a number' }; + + this.assert(util.isNumber(this.obj)); + }, true); + + Assertion.add('arguments', function() { + this.params = { operator: 'to be arguments' }; + + this.assert(util.isArguments(this.obj)); + }, true); + + Assertion.add('type', function(type, description) { + this.params = { operator: 'to have type ' + type, message: description }; + + (typeof this.obj).should.be.exactly(type, description); + }); + + Assertion.add('instanceof', function(constructor, description) { + this.params = { operator: 'to be an instance of ' + constructor.name, message: description }; + + this.assert(Object(this.obj) instanceof constructor); + }); + + Assertion.add('Function', function() { + this.params = { operator: 'to be a function' }; + + this.assert(util.isFunction(this.obj)); + }, true); + + Assertion.add('Object', function() { + this.params = { operator: 'to be an object' }; + + this.assert(util.isObject(this.obj)); + }, true); + + Assertion.add('String', function() { + this.params = { operator: 'to be a string' }; + + this.assert(util.isString(this.obj)); + }, true); + + Assertion.add('Array', function() { + this.params = { operator: 'to be an array' }; + + this.assert(Array.isArray(this.obj)); + }, true); + + Assertion.add('Boolean', function() { + this.params = { operator: 'to be a boolean' }; + + this.assert(util.isBoolean(this.obj)); + }, true); + + Assertion.add('Error', function() { + this.params = { operator: 'to be an error' }; + + this.assert(util.isError(this.obj)); + }, true); + + Assertion.add('null', function() { + this.params = { operator: 'to be null' }; + + this.assert(this.obj === null); + }, true); + + Assertion.alias('instanceof', 'instanceOf'); +}; +},{"../util":16}],15:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + + +var util = require('./util') + , AssertionError = util.AssertionError + , inspect = util.inspect; + +/** + * Our function should + * @param obj + * @returns {Assertion} + */ +var should = function(obj) { + return new Assertion(util.isWrapperType(obj) ? obj.valueOf(): obj); +}; + +/** + * Initialize a new `Assertion` with the given _obj_. + * + * @param {*} obj + * @api private + */ + +var Assertion = should.Assertion = function Assertion(obj) { + this.obj = obj; +}; + + +/** + Way to extend Assertion function. It uses some logic + to define only positive assertions and itself rule with negative assertion. + + All actions happen in subcontext and this method take care about negation. + Potentially we can add some more modifiers that does not depends from state of assertion. +*/ +Assertion.add = function(name, f, isGetter) { + var prop = {}; + prop[isGetter ? 'get' : 'value'] = function() { + var context = new Assertion(this.obj); + context.copy = context.copyIfMissing; + + try { + f.apply(context, arguments); + } catch(e) { + //copy data from sub context to this + this.copy(context); + + //check for fail + if(e instanceof should.AssertionError) { + //negative fail + if(this.negate) { + this.obj = context.obj; + this.negate = false; + return this; + } + this.assert(false); + } + // throw if it is another exception + throw e; + } + //copy data from sub context to this + this.copy(context); + if(this.negate) { + this.assert(false); + } + + this.obj = context.obj; + this.negate = false; + return this; + }; + + Object.defineProperty(Assertion.prototype, name, prop); +}; + +Assertion.alias = function(from, to) { + Assertion.prototype[to] = Assertion.prototype[from] +}; + +should.AssertionError = AssertionError; +var i = should.format = function i(value) { + if(util.isDate(value) && typeof value.inspect !== 'function') return value.toISOString(); //show millis in dates + return inspect(value, { depth: null }); +}; + +should.use = function(f) { + f(this, Assertion); + return this; +}; + + +/** + * Expose should to external world. + */ +exports = module.exports = should; + + +/** + * Expose api via `Object#should`. + * + * @api public + */ + +Object.defineProperty(Object.prototype, 'should', { + set: function(){}, + get: function(){ + return should(this); + }, + configurable: true +}); + + +Assertion.prototype = { + constructor: Assertion, + + assert: function(expr) { + if(expr) return; + + var params = this.params; + + var msg = params.message, generatedMessage = false; + if(!msg) { + msg = this.getMessage(); + generatedMessage = true; + } + + var err = new AssertionError({ + message: msg + , actual: this.obj + , expected: params.expected + , stackStartFunction: this.assert + }); + + err.showDiff = params.showDiff; + err.operator = params.operator; + err.generatedMessage = generatedMessage; + + throw err; + }, + + getMessage: function() { + return 'expected ' + i(this.obj) + (this.negate ? ' not ': ' ') + + this.params.operator + ('expected' in this.params ? ' ' + i(this.params.expected) : ''); + }, + + copy: function(other) { + this.params = other.params; + }, + + copyIfMissing: function(other) { + if(!this.params) this.params = other.params; + }, + + + /** + * Negation modifier. + * + * @api public + */ + + get not() { + this.negate = !this.negate; + return this; + } +}; + + +},{"./util":16}],16:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Check if given obj just a primitive type wrapper + * @param {Object} obj + * @returns {boolean} + * @api private + */ +exports.isWrapperType = function(obj) { + return isNumber(obj) || isString(obj) || isBoolean(obj); +}; + +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * utils.merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api private + */ + +exports.merge = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; + +function isNumber(arg) { + return typeof arg === 'number' || arg instanceof Number; +} + +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string' || arg instanceof String; +} + +function isBoolean(arg) { + return typeof arg === 'boolean' || arg instanceof Boolean; +} +exports.isBoolean = isBoolean; + +exports.isString = isString; + +function isBuffer(arg) { + return typeof Buffer !== 'undefined' && arg instanceof Buffer; +} + +exports.isBuffer = isBuffer; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} + +exports.isDate = isDate; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +exports.isObject = isObject; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} + +exports.isRegExp = isRegExp; + +function isNullOrUndefined(arg) { + return arg == null; +} + +exports.isNullOrUndefined = isNullOrUndefined; + +function isArguments(object) { + return objectToString(object) === '[object Arguments]'; +} + +exports.isArguments = isArguments; + +exports.isFunction = function(arg) { + return typeof arg === 'function' || arg instanceof Function; +}; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +exports.inspect = require('util').inspect; + +exports.AssertionError = require('assert').AssertionError; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +exports.forOwn = function(obj, f, context) { + for(var prop in obj) { + if(hasOwnProperty.call(obj, prop)) { + f.call(context, obj[prop], prop); + } + } +}; +},{"assert":17,"util":20}],17:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.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 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. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try { + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":20}],18:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],19:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],20:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +},{"./support/isBuffer":19,"inherits":18}]},{},[1]) +(1) +}); \ No newline at end of file diff --git a/node_modules/should/should.js.for-tests b/node_modules/should/should.js.for-tests new file mode 100644 index 00000000..44160f8d --- /dev/null +++ b/node_modules/should/should.js.for-tests @@ -0,0 +1,2321 @@ +!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Should=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + * MIT Licensed + */ + +var should = require('./should'); + +should + .use(require('./ext/assert')) + .use(require('./ext/chain')) + .use(require('./ext/bool')) + .use(require('./ext/number')) + .use(require('./ext/eql')) + .use(require('./ext/type')) + .use(require('./ext/string')) + .use(require('./ext/property')) + .use(require('./ext/error')) + .use(require('./ext/match')) + .use(require('./ext/browser/jquery')) + .use(require('./ext/deprecated')); + + module.exports = should; +},{"./ext/assert":3,"./ext/bool":4,"./ext/browser/jquery":5,"./ext/chain":6,"./ext/deprecated":7,"./ext/eql":8,"./ext/error":9,"./ext/match":10,"./ext/number":11,"./ext/property":12,"./ext/string":13,"./ext/type":14,"./should":15}],2:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +// Taken from node's assert module, because it sucks +// and exposes next to nothing useful. +var util = require('./util'); + +module.exports = _deepEqual; + +var pSlice = Array.prototype.slice; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + + +function objEquiv (a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (util.isArguments(a)) { + if (!util.isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try{ + var ka = Object.keys(a), + kb = Object.keys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +},{"./util":16}],3:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util') + , assert = require('assert') + , AssertionError = assert.AssertionError; + +module.exports = function(should) { + var i = should.format; + + /** + * Expose assert to should + * + * This allows you to do things like below + * without require()ing the assert module. + * + * should.equal(foo.bar, undefined); + * + */ + util.merge(should, assert); + + + /** + * Assert _obj_ exists, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + should.exist = should.exists = function(obj, msg) { + if(null == obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to exist'), stackStartFunction: should.exist + }); + } + }; + + /** + * Asserts _obj_ does not exist, with optional message. + * + * @param {*} obj + * @param {String} [msg] + * @api public + */ + + should.not = {}; + should.not.exist = should.not.exists = function(obj, msg) { + if(null != obj) { + throw new AssertionError({ + message: msg || ('expected ' + i(obj) + ' to not exist'), stackStartFunction: should.not.exist + }); + } + }; +}; +},{"../util":16,"assert":17}],4:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('true', function() { + this.is.exactly(true) + }, true); + + Assertion.add('false', function() { + this.is.exactly(false) + }, true); + + Assertion.add('ok', function() { + this.params = { operator: 'to be truthy' }; + + this.assert(this.obj); + }, true); +}; +},{}],5:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/*! + * Portions copyright (c) 2010, 2011, 2012 Wojciech Zawistowski, Travis Jeffery + * From the jasmine-jquery project under the MIT License. + */ + +var util = require('../../util'); + +module.exports = function(should, Assertion) { + var i = should.format; + var $ = this.jQuery || this.$; + + /* Otherwise, node's util.inspect loops hangs */ + if (typeof HTMLElement !== "undefined" && HTMLElement && !HTMLElement.prototype.inspect) { + HTMLElement.prototype.inspect = function () { + return this.outerHTML; + }; + } + + if (typeof jQuery !== "undefined" && jQuery && !jQuery.prototype.inspect) { + jQuery.fn.inspect = function () { + var elementList = this.toArray().map(function (e) { + return util.inspect(e); + }).join(", "); + if (this.selector) { + return "SELECTOR(" + this.selector + ") matching " + this.length + " elements" + (elementList.length ? ": " + elementList : ""); + } else { + return elementList; + } + }; + } + + function jQueryAttributeTestHelper(method, singular, plural, nameOrHash, value) { + var keys = util.isObject(nameOrHash) ? Object.keys(nameOrHash) : [nameOrHash]; + var allRelevantAttributes = keys.reduce(function (memo, key) { + var value = $(this.obj)[method](key); + if (typeof value !== 'undefined') { + memo[key] = value; + } + return memo; + }.bind(this), {}); + + if (arguments.length === 4 && util.isObject(nameOrHash)) { + this.params = { operator: 'to have ' + plural + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.properties(nameOrHash); + } else if (arguments.length === 4) { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) }; + allRelevantAttributes.should.have.property(nameOrHash); + } else { + this.params = { operator: 'to have ' + singular + ' ' + i(nameOrHash) + ' with value ' + i(value) }; + allRelevantAttributes.should.have.property(nameOrHash, value); + } + } + + var browserTagCaseIndependentHtml = function (html) { + return $('
        ').append(html).html(); + }; + + var addJqPredicateAssertion = function (predicate, nameOverride, operatorOverride) { + Assertion.add(nameOverride || predicate, function() { + this.params = { operator: 'to be ' + (operatorOverride || predicate) }; + this.assert($(this.obj).is(':' + predicate)); + }, true); + } + + Assertion.add('className', function(className) { + this.params = { operator: 'to have class ' + className }; + this.assert($(this.obj).hasClass(className)); + }); + + Assertion.add('css', function(css) { + this.params = { operator: 'to have css ' + i(css) }; + for (var prop in css) { + var value = css[prop]; + if (value === 'auto' && $(this.obj).get(0).style[prop] === 'auto') { + continue; + } + $(this.obj).css(prop).should.eql(value); + } + }); + + addJqPredicateAssertion('visible'); + addJqPredicateAssertion('hidden'); + addJqPredicateAssertion('selected'); + addJqPredicateAssertion('checked'); + addJqPredicateAssertion('disabled'); + addJqPredicateAssertion('empty', 'emptyJq'); + addJqPredicateAssertion('focus', 'focused', 'focused'); + + Assertion.add('inDOM', function() { + this.params = { operator: 'to be in the DOM' }; + this.assert($.contains(document.documentElement, $(this.obj)[0])); + }, true); + + Assertion.add('exist', function() { + this.params = { operator: 'to exist' }; + $(this.obj).should.not.have.length(0); + }, true); + + Assertion.add('attr', function() { + var args = [ + 'attr', + 'attribute', + 'attributes' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('prop', function() { + var args = [ + 'prop', + 'property', + 'properties' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('elementId', function(id) { + this.params = { operator: 'to have ID ' + i(id) }; + this.obj.should.have.attr('id', id); + }); + + Assertion.add('html', function(html) { + this.params = { operator: 'to have HTML ' + i(html) }; + $(this.obj).html().should.eql(browserTagCaseIndependentHtml(html)); + }); + + Assertion.add('containHtml', function(html) { + this.params = { operator: 'to contain HTML ' + i(html) }; + $(this.obj).html().indexOf(browserTagCaseIndependentHtml(html)).should.be.above(-1); + }); + + Assertion.add('text', function(text) { + this.params = { operator: 'to have text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.should.eql(text); + } + }); + + Assertion.add('containText', function(text) { + this.params = { operator: 'to contain text ' + i(text) }; + var trimmedText = $.trim($(this.obj).text()); + + if (util.isRegExp(text)) { + trimmedText.should.match(text); + } else { + trimmedText.indexOf(text).should.be.above(-1); + } + }); + + Assertion.add('value', function(val) { + this.params = { operator: 'to have value ' + i(val) }; + $(this.obj).val().should.eql(val); + }); + + Assertion.add('data', function() { + var args = [ + 'data', + 'data', + 'data' + ].concat(Array.prototype.slice.call(arguments, 0)); + jQueryAttributeTestHelper.apply(this, args); + }); + + Assertion.add('containElement', function(target) { + this.params = { operator: 'to contain ' + $(target).inspect() }; + $(this.obj).find(target).should.not.have.length(0); + }); + + Assertion.add('matchedBy', function(selector) { + this.params = { operator: 'to be matched by selector ' + selector }; + $(this.obj).filter(selector).should.not.have.length(0); + }); + + Assertion.add('handle', function(event) { + this.params = { operator: 'to handle ' + event }; + + var events = $._data($(this.obj).get(0), "events"); + + if (!events || !event || typeof event !== "string") { + return this.assert(false); + } + + var namespaces = event.split("."), + eventType = namespaces.shift(), + sortedNamespaces = namespaces.slice(0).sort(), + namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + if (events[eventType] && namespaces.length) { + for (var i = 0; i < events[eventType].length; i++) { + var namespace = events[eventType][i].namespace; + + if (namespaceRegExp.test(namespace)) { + return; + } + } + } else { + events.should.have.property(eventType); + events[eventType].should.not.have.length(0); + return; + } + + this.assert(false); + }); + + Assertion.add('handleWith', function(eventName, eventHandler) { + this.params = { operator: 'to handle ' + eventName + ' with ' + eventHandler }; + + var normalizedEventName = eventName.split('.')[0], + stack = $._data($(this.obj).get(0), "events")[normalizedEventName]; + + for (var i = 0; i < stack.length; i++) { + if (stack[i].handler == eventHandler) { + return; + } + } + + this.assert(false); + }); +}; +},{"../../util":16}],6:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + + function addLink(name) { + Object.defineProperty(Assertion.prototype, name, { + get: function() { + return this; + } + }); + } + + ['an', 'of', 'a', 'and', 'be', 'have', 'with', 'is', 'which'].forEach(addLink); +}; +},{}],7:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('include', function(obj, description) { + if(!Array.isArray(this.obj) && !util.isString(this.obj)) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + var cmp = {}; + for(var key in obj) cmp[key] = this.obj[key]; + this.assert(eql(cmp, obj)); + } else { + this.params = { operator: 'to include ' + i(obj), message: description }; + + this.assert(~this.obj.indexOf(obj)); + } + }); + + Assertion.add('includeEql', function(obj, description) { + this.params = { operator: 'to include an object equal to ' + i(obj), message: description }; + + this.assert(this.obj.some(function(item) { + return eql(obj, item); + })); + }); +}; +},{"../eql":2,"../util":16}],8:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var eql = require('../eql'); + +module.exports = function(should, Assertion) { + Assertion.add('eql', function(val, description) { + this.params = { operator: 'to equal', expected: val, showDiff: true, message: description }; + + this.assert(eql(val, this.obj)); + }); + + Assertion.add('equal', function(val, description) { + this.params = { operator: 'to be', expected: val, showDiff: true, message: description }; + + this.assert(val === this.obj); + }); + + Assertion.alias('equal', 'exactly'); +}; +},{"../eql":2}],9:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('throw', function(message) { + var fn = this.obj + , err = {} + , errorInfo = '' + , ok = true; + + try { + fn(); + ok = false; + } catch(e) { + err = e; + } + + if(ok) { + if('string' == typeof message) { + ok = message == err.message; + } else if(message instanceof RegExp) { + ok = message.test(err.message); + } else if('function' == typeof message) { + ok = err instanceof message; + } + + if(message && !ok) { + if('string' == typeof message) { + errorInfo = " with a message matching '" + message + "', but got '" + err.message + "'"; + } else if(message instanceof RegExp) { + errorInfo = " with a message matching " + message + ", but got '" + err.message + "'"; + } else if('function' == typeof message) { + errorInfo = " of type " + message.name + ", but got " + err.constructor.name; + } + } else { + errorInfo = " (got " + i(err) + ")"; + } + } + + this.params = { operator: 'to throw exception' + errorInfo }; + + this.assert(ok); + }); + + Assertion.alias('throw', 'throwError'); +}; +},{}],10:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('match', function(other, description) { + this.params = { operator: 'to match ' + i(other), message: description }; + + if(!eql(this.obj, other)) { + if(util.isRegExp(other)) { // something - regex + + if(util.isString(this.obj)) { + + this.assert(other.exec(this.obj)); + } else if(Array.isArray(this.obj)) { + + this.obj.forEach(function(item) { + this.assert(other.exec(item));// should we try to convert to String and exec? + }, this); + } else if(util.isObject(this.obj)) { + + var notMatchedProps = [], matchedProps = []; + util.forOwn(this.obj, function(value, name) { + if(other.exec(value)) matchedProps.push(i(name)); + else notMatchedProps.push(i(name)); + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } // should we try to convert to String and exec? + } else if(util.isFunction(other)) { + var res; + try { + res = other(this.obj); + } catch(e) { + if(e instanceof should.AssertionError) { + this.params.operator += '\n\t' + e.message; + } + throw e; + } + + if(res instanceof Assertion) { + this.params.operator += '\n\t' + res.getMessage(); + } + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + } else if(util.isObject(other)) { // try to match properties (for Object and Array) + notMatchedProps = []; matchedProps = []; + + util.forOwn(other, function(value, key) { + try { + this.obj[key].should.match(value); + matchedProps.push(key); + } catch(e) { + if(e instanceof should.AssertionError) { + notMatchedProps.push(key); + } else { + throw e; + } + } + }, this); + + if(notMatchedProps.length) + this.params.operator += '\n\tnot matched properties: ' + notMatchedProps.join(', '); + if(matchedProps.length) + this.params.operator += '\n\tmatched properties: ' + matchedProps.join(', '); + + this.assert(notMatchedProps.length == 0); + } else { + this.assert(false); + } + } + }); + + Assertion.add('matchEach', function(other, description) { + this.params = { operator: 'to match each ' + i(other), message: description }; + + var f = other; + + if(util.isRegExp(other)) + f = function(it) { + return !!other.exec(it); + }; + else if(!util.isFunction(other)) + f = function(it) { + return eql(it, other); + }; + + util.forOwn(this.obj, function(value, key) { + var res = f(value, key); + + //if we throw exception ok - it is used .should inside + if(util.isBoolean(res)) { + this.assert(res); // if it is just boolean function assert on it + } + }, this); + }); +}; +},{"../eql":2,"../util":16}],11:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('NaN', function() { + this.params = { operator: 'to be NaN' }; + + this.is.a.Number + .and.assert(isNaN(this.obj)); + }, true); + + Assertion.add('Infinity', function() { + this.params = { operator: 'to be Infinity' }; + + this.is.a.Number + .and.not.a.NaN + .and.assert(!isFinite(this.obj)); + }, true); + + Assertion.add('within', function(start, finish, description) { + this.params = { operator: 'to be within ' + start + '..' + finish, message: description }; + + this.assert(this.obj >= start && this.obj <= finish); + }); + + Assertion.add('approximately', function(value, delta, description) { + this.params = { operator: 'to be approximately ' + value + " ±" + delta, message: description }; + + this.assert(Math.abs(this.obj - value) <= delta); + }); + + Assertion.add('above', function(n, description) { + this.params = { operator: 'to be above ' + n, message: description }; + + this.assert(this.obj > n); + }); + + Assertion.add('below', function(n, description) { + this.params = { operator: 'to be below ' + n, message: description }; + + this.assert(this.obj < n); + }); + + Assertion.alias('above', 'greaterThan'); + Assertion.alias('below', 'lessThan'); + +}; +},{}],12:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'), + eql = require('../eql'); + +var aSlice = Array.prototype.slice; + +module.exports = function(should, Assertion) { + var i = should.format; + + Assertion.add('property', function(name, val) { + if(arguments.length > 1) { + var p = {}; + p[name] = val; + this.have.properties(p); + } else { + this.have.properties(name); + } + this.obj = this.obj[name]; + }); + + Assertion.add('properties', function(names) { + var values = {}; + if(arguments.length > 1) { + names = aSlice.call(arguments); + } else if(!Array.isArray(names)) { + if(util.isString(names)) { + names = [names]; + } else { + values = names; + names = Object.keys(names); + } + } + + var obj = Object(this.obj), missingProperties = []; + + //just enumerate properties and check if they all present + names.forEach(function(name) { + if(!(name in obj)) missingProperties.push(i(name)); + }); + + var props = missingProperties; + if(props.length === 0) { + props = names.map(i); + } + + var operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(missingProperties.length === 0); + + // check if values in object matched expected + var valueCheckNames = Object.keys(values); + if(valueCheckNames.length) { + var wrongValues = []; + props = []; + + // now check values, as there we have all properties + valueCheckNames.forEach(function(name) { + var value = values[name]; + if(!eql(obj[name], value)) { + wrongValues.push(i(name) + ' of ' + i(value) + ' (got ' + i(obj[name]) + ')'); + } else { + props.push(i(name) + ' of ' + i(value)); + } + }); + + if(wrongValues.length > 0) { + props = wrongValues; + } + + operator = (props.length === 1 ? + 'to have property ' : 'to have properties ') + props.join(', '); + + this.params = { operator: operator }; + + this.assert(wrongValues.length === 0); + } + }); + + Assertion.add('length', function(n, description) { + this.have.property('length', n, description); + }); + + Assertion.alias('length', 'lengthOf'); + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + Assertion.add('ownProperty', function(name, description) { + this.params = { operator: 'to have own property ' + i(name), message: description }; + + this.assert(hasOwnProperty.call(this.obj, name)); + + this.obj = this.obj[name]; + }); + + Assertion.alias('hasOwnProperty', 'ownProperty'); + + Assertion.add('empty', function() { + this.params = { operator: 'to be empty' }; + + if(util.isString(this.obj) || Array.isArray(this.obj) || util.isArguments(this.obj)) { + this.have.property('length', 0); + } else { + var obj = Object(this.obj); // wrap to reference for booleans and numbers + for(var prop in obj) { + this.have.not.ownProperty(prop); + } + } + }, true); + + Assertion.add('keys', function(keys) { + if(arguments.length > 1) keys = aSlice.call(arguments); + else if(arguments.length === 1 && util.isString(keys)) keys = [ keys ]; + else if(arguments.length === 0) keys = []; + + var obj = Object(this.obj); + + // first check if some keys are missing + var missingKeys = []; + keys.forEach(function(key) { + if(!hasOwnProperty.call(this.obj, key)) + missingKeys.push(i(key)); + }, this); + + // second check for extra keys + var extraKeys = []; + Object.keys(obj).forEach(function(key) { + if(keys.indexOf(key) < 0) { + extraKeys.push(i(key)); + } + }); + + var verb = keys.length === 0 ? 'to be empty' : + 'to have ' + (keys.length === 1 ? 'key ' : 'keys '); + + this.params = { operator: verb + keys.map(i).join(', ')}; + + if(missingKeys.length > 0) + this.params.operator += '\n\tmissing keys: ' + missingKeys.join(', '); + + if(extraKeys.length > 0) + this.params.operator += '\n\textra keys: ' + extraKeys.join(', '); + + this.assert(missingKeys.length === 0 && extraKeys.length === 0); + }); + + Assertion.alias("keys", "key"); + + Assertion.add('containEql', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + var obj = this.obj; + if(Array.isArray(obj)) { + this.assert(obj.some(function(item) { + return eql(item, other); + })); + } else if(util.isString(obj)) { + // expect obj to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) { + // object contains object case + util.forOwn(other, function(value, key) { + obj[key].should.eql(value); + }); + } else { + //other uncovered cases + this.assert(false); + } + }); + + Assertion.add('containDeep', function(other) { + this.params = { operator: 'to contain ' + i(other) }; + + var obj = this.obj; + if(Array.isArray(obj)) { + if(Array.isArray(other)) { + var otherIdx = 0; + obj.forEach(function(item) { + try { + should(item).not.be.null.and.containDeep(other[otherIdx]); + otherIdx++; + } catch(e) { + if(e instanceof should.AssertionError) { + return; + } + throw e; + } + }); + this.assert(otherIdx == other.length); + //search array contain other as sub sequence + } else { + this.assert(false); + } + } else if(util.isString(obj)) {// expect other to be string + this.assert(obj.indexOf(String(other)) >= 0); + } else if(util.isObject(obj)) {// object contains object case + if(util.isObject(other)) { + util.forOwn(other, function(value, key) { + should(obj[key]).not.be.null.and.containDeep(value); + }); + } else {//one of the properties contain value + this.assert(false); + } + } else { + this.eql(other); + } + }); + +}; +},{"../eql":2,"../util":16}],13:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +module.exports = function(should, Assertion) { + Assertion.add('startWith', function(str, description) { + this.params = { operator: 'to start with ' + should.format(str), message: description }; + + this.assert(0 === this.obj.indexOf(str)); + }); + + Assertion.add('endWith', function(str, description) { + this.params = { operator: 'to end with ' + should.format(str), message: description }; + + this.assert(this.obj.indexOf(str, this.obj.length - str.length) >= 0); + }); +}; +},{}],14:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +var util = require('../util'); + +module.exports = function(should, Assertion) { + Assertion.add('Number', function() { + this.params = { operator: 'to be a number' }; + + this.assert(util.isNumber(this.obj)); + }, true); + + Assertion.add('arguments', function() { + this.params = { operator: 'to be arguments' }; + + this.assert(util.isArguments(this.obj)); + }, true); + + Assertion.add('type', function(type, description) { + this.params = { operator: 'to have type ' + type, message: description }; + + (typeof this.obj).should.be.exactly(type, description); + }); + + Assertion.add('instanceof', function(constructor, description) { + this.params = { operator: 'to be an instance of ' + constructor.name, message: description }; + + this.assert(Object(this.obj) instanceof constructor); + }); + + Assertion.add('Function', function() { + this.params = { operator: 'to be a function' }; + + this.assert(util.isFunction(this.obj)); + }, true); + + Assertion.add('Object', function() { + this.params = { operator: 'to be an object' }; + + this.assert(util.isObject(this.obj)); + }, true); + + Assertion.add('String', function() { + this.params = { operator: 'to be a string' }; + + this.assert(util.isString(this.obj)); + }, true); + + Assertion.add('Array', function() { + this.params = { operator: 'to be an array' }; + + this.assert(Array.isArray(this.obj)); + }, true); + + Assertion.add('Boolean', function() { + this.params = { operator: 'to be a boolean' }; + + this.assert(util.isBoolean(this.obj)); + }, true); + + Assertion.add('Error', function() { + this.params = { operator: 'to be an error' }; + + this.assert(util.isError(this.obj)); + }, true); + + Assertion.add('null', function() { + this.params = { operator: 'to be null' }; + + this.assert(this.obj === null); + }, true); + + Assertion.alias('instanceof', 'instanceOf'); +}; +},{"../util":16}],15:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + + +var util = require('./util') + , AssertionError = util.AssertionError + , inspect = util.inspect; + +/** + * Our function should + * @param obj + * @returns {Assertion} + */ +var should = function(obj) { + return new Assertion(util.isWrapperType(obj) ? obj.valueOf(): obj); +}; + +/** + * Initialize a new `Assertion` with the given _obj_. + * + * @param {*} obj + * @api private + */ + +var Assertion = should.Assertion = function Assertion(obj) { + this.obj = obj; +}; + + +/** + Way to extend Assertion function. It uses some logic + to define only positive assertions and itself rule with negative assertion. + + All actions happen in subcontext and this method take care about negation. + Potentially we can add some more modifiers that does not depends from state of assertion. +*/ +Assertion.add = function(name, f, isGetter) { + var prop = {}; + prop[isGetter ? 'get' : 'value'] = function() { + var context = new Assertion(this.obj); + context.copy = context.copyIfMissing; + + try { + f.apply(context, arguments); + } catch(e) { + //copy data from sub context to this + this.copy(context); + + //check for fail + if(e instanceof should.AssertionError) { + //negative fail + if(this.negate) { + this.obj = context.obj; + this.negate = false; + return this; + } + this.assert(false); + } + // throw if it is another exception + throw e; + } + //copy data from sub context to this + this.copy(context); + if(this.negate) { + this.assert(false); + } + + this.obj = context.obj; + this.negate = false; + return this; + }; + + Object.defineProperty(Assertion.prototype, name, prop); +}; + +Assertion.alias = function(from, to) { + Assertion.prototype[to] = Assertion.prototype[from] +}; + +should.AssertionError = AssertionError; +var i = should.format = function i(value) { + if(util.isDate(value) && typeof value.inspect !== 'function') return value.toISOString(); //show millis in dates + return inspect(value, { depth: null }); +}; + +should.use = function(f) { + f(this, Assertion); + return this; +}; + + +/** + * Expose should to external world. + */ +exports = module.exports = should; + + +/** + * Expose api via `Object#should`. + * + * @api public + */ + +Object.defineProperty(Object.prototype, 'should', { + set: function(){}, + get: function(){ + return should(this); + }, + configurable: true +}); + + +Assertion.prototype = { + constructor: Assertion, + + assert: function(expr) { + if(expr) return; + + var params = this.params; + + var msg = params.message, generatedMessage = false; + if(!msg) { + msg = this.getMessage(); + generatedMessage = true; + } + + var err = new AssertionError({ + message: msg + , actual: this.obj + , expected: params.expected + , stackStartFunction: this.assert + }); + + err.showDiff = params.showDiff; + err.operator = params.operator; + err.generatedMessage = generatedMessage; + + throw err; + }, + + getMessage: function() { + return 'expected ' + i(this.obj) + (this.negate ? ' not ': ' ') + + this.params.operator + ('expected' in this.params ? ' ' + i(this.params.expected) : ''); + }, + + copy: function(other) { + this.params = other.params; + }, + + copyIfMissing: function(other) { + if(!this.params) this.params = other.params; + }, + + + /** + * Negation modifier. + * + * @api public + */ + + get not() { + this.negate = !this.negate; + return this; + } +}; + + +},{"./util":16}],16:[function(require,module,exports){ +/*! + * Should + * Copyright(c) 2010-2014 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Check if given obj just a primitive type wrapper + * @param {Object} obj + * @returns {boolean} + * @api private + */ +exports.isWrapperType = function(obj) { + return isNumber(obj) || isString(obj) || isBoolean(obj); +}; + +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * utils.merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api private + */ + +exports.merge = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; + +function isNumber(arg) { + return typeof arg === 'number' || arg instanceof Number; +} + +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string' || arg instanceof String; +} + +function isBoolean(arg) { + return typeof arg === 'boolean' || arg instanceof Boolean; +} +exports.isBoolean = isBoolean; + +exports.isString = isString; + +function isBuffer(arg) { + return typeof Buffer !== 'undefined' && arg instanceof Buffer; +} + +exports.isBuffer = isBuffer; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} + +exports.isDate = isDate; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +exports.isObject = isObject; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} + +exports.isRegExp = isRegExp; + +function isNullOrUndefined(arg) { + return arg == null; +} + +exports.isNullOrUndefined = isNullOrUndefined; + +function isArguments(object) { + return objectToString(object) === '[object Arguments]'; +} + +exports.isArguments = isArguments; + +exports.isFunction = function(arg) { + return typeof arg === 'function' || arg instanceof Function; +}; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +exports.inspect = require('util').inspect; + +exports.AssertionError = require('assert').AssertionError; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +exports.forOwn = function(obj, f, context) { + for(var prop in obj) { + if(hasOwnProperty.call(obj, prop)) { + f.call(context, obj[prop], prop); + } + } +}; +},{"assert":17,"util":20}],17:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.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 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. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try { + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":20}],18:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],19:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],20:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +},{"./support/isBuffer":19,"inherits":18}]},{},[1]) +(1) +}); \ No newline at end of file diff --git a/node_modules/should/should.min.js b/node_modules/should/should.min.js new file mode 100644 index 00000000..5665c29a --- /dev/null +++ b/node_modules/should/should.min.js @@ -0,0 +1,55 @@ +!function(C){if("object"==typeof exports)module.exports=C();else if("function"==typeof define&&define.amd)define(C);else{var h;"undefined"!=typeof window?h=window:"undefined"!=typeof global?h=global:"undefined"!=typeof self&&(h=self);h.Should=C()}}(function(){return function h(k,d,g){function l(f,c){if(!d[f]){if(!k[f]){var e="function"==typeof require&&require;if(!c&&e)return e(f,!0);if(a)return a(f,!0);throw Error("Cannot find module '"+f+"'");}e=d[f]={exports:{}};k[f][0].call(e.exports,function(b){var c= +k[f][1][b];return l(c?c:b)},e,e.exports,h,k,d,g)}return d[f].exports}for(var a="function"==typeof require&&require,e=0;e").append(b).html())});a.add("containHtml",function(b){this.params= +{operator:"to contain HTML "+f(b)};c(this.obj).html().indexOf(c("
        ").append(b).html()).should.be.above(-1)});a.add("text",function(b){this.params={operator:"to have text "+f(b)};var a=c.trim(c(this.obj).text());g.isRegExp(b)?a.should.match(b):a.should.eql(b)});a.add("containText",function(b){this.params={operator:"to contain text "+f(b)};var a=c.trim(c(this.obj).text());g.isRegExp(b)?a.should.match(b):a.indexOf(b).should.be.above(-1)});a.add("value",function(b){this.params={operator:"to have value "+ +f(b)};c(this.obj).val().should.eql(b)});a.add("data",function(){var b=["data","data","data"].concat(Array.prototype.slice.call(arguments,0));e.apply(this,b)});a.add("containElement",function(b){this.params={operator:"to contain "+c(b).inspect()};c(this.obj).find(b).should.not.have.length(0)});a.add("matchedBy",function(b){this.params={operator:"to be matched by selector "+b};c(this.obj).filter(b).should.not.have.length(0)});a.add("handle",function(b){this.params={operator:"to handle "+b};var a=c._data(c(this.obj).get(0), +"events");if(!a||!b||"string"!==typeof b)return this.assert(!1);var f=b.split(".");b=f.shift();var e=f.slice(0).sort(),e=RegExp("(^|\\.)"+e.join("\\.(?:.*\\.)?")+"(\\.|$)");if(a[b]&&f.length){for(f=0;f=a&&this.obj<=e)});d.add("approximately",function(a,e,f){this.params={operator:"to be approximately "+a+" \u00b1"+e,message:f};this.assert(Math.abs(this.obj-a)<=e)});d.add("above",function(a,e){this.params={operator:"to be above "+a,message:e};this.assert(this.obj>a)});d.add("below",function(a,e){this.params={operator:"to be below "+a,message:e};this.assert(this.objb.indexOf(a)&&h.push(c(a))});this.params={operator:(0===b.length?"to be empty":"to have "+(1===b.length?"key ":"keys "))+b.map(c).join(", ")};0h)return w(g)?a.stylize(RegExp.prototype.toString.call(g), +"regexp"):a.stylize("[Object]","special");a.seen.push(g);l=z?b(a,g,h,n,l):l.map(function(b){return p(a,g,h,n,b,z)});a.seen.pop();return q(l,k,A)}function c(a,b){if(r(b))return a.stylize("undefined","undefined");if(t(b)){var c="'"+JSON.stringify(b).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return a.stylize(c,"string")}if(n(b))return a.stylize(""+b,"number");if(v(b))return a.stylize(""+b,"boolean");if(null===b)return a.stylize("null","null")}function m(a){return"["+Error.prototype.toString.call(a)+ +"]"}function b(a,b,c,d,f){for(var e=[],g=0,h=b.length;ga.seen.indexOf(b.value)?(k=null===c?f(a,b.value,null):f(a,b.value,c-1),-1a?"0"+a.toString(10):a.toString(10)}function G(){var a=new Date,b=[E(a.getHours()),E(a.getMinutes()),E(a.getSeconds())].join(":");return[a.getDate(),H[a.getMonth()],b].join(" ")}var I=/%[sdj%]/g;d.format= +function(a){if(!t(a)){for(var b=[],c=0;c=e)return a;switch(a){case "%s":return String(d[c++]);case "%d":return Number(d[c++]);case "%j":try{return JSON.stringify(d[c++])}catch(b){return"[Circular]"}default:return a}}),f=d[c];c

        $qB|G|~ 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%0DaE`}q4ZfL&QT9@o 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 p>bPDyy&VV?q5V58@x)gAVpZ0_t^^r_g9 zh0xBDuAar#IWzu$?~MppY=hqIj2q~tgTz;P5cVK0=?)wrIH_T;}|hiLlh9l=^@t)Kc7QJ!-i%u zt0En-Y{L=**g!URkI0-HTGn6hxtfXBjKs%Si9q=a!op+&)ez8nT5A3un{$Q)SP_oL zx6N0bNl;lBq5!LyO5C(dvNQdzx>D7M&CCzC`^V}^D3`R@jRj02|7Z7T@!hbi@UExF;VuGl-;+}d$ULwi_-qVwe9R%uFrlqT_>IJm>p6| zsEoW;wcVtwPx?o5L|&$Ia4e&hE-~9KUP9+0AlqXXM&8iQ0Y4ixjw4~Voz?Fmmd zW`#dl6b=~^IlqNagx;CY*P`#$ZHu=MH~O&=(89eR+)xt?Ol@Ceeg$t4v;F{pq?@tj z5F^9AB3UEM8qh{Xm@OzU9h6K*=_pfYUqgz;G$@T;Vc`_izoJ-I4Q(H);Sm&c9-Mhm ziyc>W&!AvA$ABA=fcp4@G4%Th8Pqd|#ek;)v%lHu#TQzPIXL!D^`PvncrDlY2Xv8} z_D?j7H2d3h%-=RR$3Q6^#bMoL}P?~&&tt7z+x~;)x zsj!To{A1!n2xyatiH5NWOGAkoQIZp8xlt$xaE`#C6BZc<&=9k8hOMBHYZi@{lwu~x zLKHUhPdycx31oCt0I3L&i(~{+Ry|5`9K2QcKO)IS;9?}$M?~#I0#*#c5T|AfuV4b~ z>Z`Q9WYh_P`Gl@NiQQ@z?^PQ#4uztS>U&YLGV@h7R-udPJ#>YNL@FYO4{$!9j0`Qx zy(dR8fA6nkpYKRR^i9#%Y916E017mfR|dq$IV^JL$MQe^&qs>%pA@+i{B2V_LfFi2 z+D%MVA~-+YKR+xPCuj{Xr76&#$-N#BJBPlr++>Rm{qg);=wGJ%#0OgFz^%W%EBUz{ zk6A+_`-~)0L)%yq|IwB-iOT;+h*B1pXGt++=LIU$j8?N^(Lw2G&_27yo_rV(wdK5U zaoOprt6#?NYNqlvuv}+h(~q}3QB5u-GB#sk1EBKSg4m2a@k&eRxx+xcq+au%QcF?d z|5s|2L0c9{`>#nVJE*|!S`vx0&EWL{5ex}sea6H^~kotz+X6!Y#l zdsEt)E7A2v9+r;>W|TVpvV+$reCxzKG%J?40dF0tin8)oS~~$XJom|LyC$7Bo2({WVmoTySk@m&|l+)eNEnA!^Uk(Tyjw9?%1(I=<@k=lpAY}$;Y%JveV)6dy*5uO_ zxu$ZvVvd_#*Pt3TTTIm1?>w59)^j2^;zZb5g39-8xUcu&r3%>qaKSYIY2#;cUts-StE$eIS^F=JZ3-i?i#PfZ+&=cWln_eNJ;5P zf21OaHfa1o9Nbd6J?Uxrs5mU^mktm+bEJj8Lu%S5CPUieu;Yt6ioD6jouU+3_ojPi z``Tljjpr|xZ#uNScw&e!5rdZBTF!;ojXUHbume5GdcaBx=9OP&ld7s z=luS>-(h}2MfALwZ7*|gP5H>U9x7U@;5^E5>7p-pUbJ(l;jh?Ubw<)A?wl|#X4|## zq5;-z*!n$nDr-J3moIOeDAfdLh*)jYBU&AZP7V;y5r)-%X-=-`fhFy7hzE} zLucC41Scoo4D(MawYI{mK~4T?1s5tE!)PZz+GHNF584!aR&KPwIUb}a^nUTw+tP$turEEK{guDOV+I>RR@c#6P4u!zM>z_g7I&QdK?9jAHE|PE? zKp?s5&nsQb$vRgPN_IEzpZlXsP}A;NE*GVTvOd7F!xB{9&{TuW_Xn-fewy`FzvBRF zsOd9ZYy}t?vzoC1J&xmFO&&A?h2JL@3@3IA+uK*a))$|jpWpb*H-oml=gjb*GX;|? zf`*_Y0mAejjmu^CqK{F6eo;SFKHFK?F&vkjai{rSr~J;$9|q0xzKPi` zdz_e;VBI%M$@V6_mo}9c$X^KlP_<3e6i$@>9WyR_D*!T32T3dg;uHJ03umlk z4~|Qn1B1|(vozD$tm)9=lNEQh#Wza!8X8DNOcvB}=LHz$mpfc1ZYw1iPYTWP#{&iv zuGUlTjXVtHcQ@xxq{f_jmP99!eXcM52n?T^>K^P=w;k{=8xedKd6T6l_^ouEuX?Gi z^`qxA4+2Am&dF|4m6yf#67N1cllp(5*QX|)N2cyGsf_$-7`+BZVik8UHn~)~ZLTK9 zZ_f%j+Gj&|)kvKS&F=`DjJ#(7jD~Wd1zpbteBeFo!otPZavWWsVa8CUk*2Ni;p$-r3D;I{aensU(AV}Gqpu9_tt2G5x`bR$j**d{sB4i0 z^OSmuZH0GO?_R&W0!2fZ=J$FZLX~dzr7j}(+~Sv+3HoBE{sp=RCw}}@`_H#dB5CZG z7Okvp@f~T!Hd8<6#@YLzTaQB*UW)1IQH(jFP}Lv6y3Tuzu})nfC>n{H4o7akCb_Ak z+nhbwyf^lI$osXkg=xNyohQM``@gojdvuJ!u9Mf7^tm{YOq8gWii<8SUqe`b9hC34 zWS1Ed9}!SJ7Ga4wek3a*uAqa>Qau3s=Y_z|%!MjL&VTYct~Fk2MLn84Xt}i&e@-~h zW1=eYv(P_pPNhpRz12Yvk%?dr@;rU<5H-|O8CT>@VsAOr5@VoLH|F@T^)~FpfERF0 zgKPsWo(loSW~$UxjRQG?Iux>@2W!T50A(Z)87SdC!(Q8=puJ*J{z@W(J&}z(=)4yB! zne8+%`j8p&khhT_{Dr;XY4h%I4fWGhd3}%D#&cuqeEI`E+rnE4A_BTq@h&YYdAB8? zxlT(r z%~(nKF5hVastkp{Rfn8fa5d=FCjwPQz~8#;l4QDYlT;>9V@HV3m%es10fLiGwl})- z)C#vJ(oKVHXZo@G3-3=6*&oIZEU$jf;Nu{F&TRa7Al&HTE;|EDMw_%e8YcmU02rj~-11pBfDk%H*@=2VWI-#A2J@ zI`z%Ejqf`a;I}+36Wn#M(UO(=h}To~c|aTzI#x;-V%BY&K6_mrQ|& z26+6l^yEelo=^G-^f`TJ1G5%Hbdg&8#)*{F;SB%3(|V2c4pl8TbU(R16UyLP%$*n~ zdnMe_J5PDY6+LI$01;?JR>&+JIba%Ve2b-SVdHNf#3FnSz`y<5K)Dxd- z-yNvftmd9SFQ1g}V|g?(T>`eMec@4n>*eIc&blcX5eRLA@ztW>Lr--orSh8zx*|{5 zef!U8#N_P}^@7N!u2XAxt?#+hztFW8Z#VBqtkM@A+%SGDJ!4Q&J*e-Xd~@lZ;^m>R z406WekKZyhg97jhi#V@3CgC7LBD)Q`CtFyqnz9+bZxT#)DmU6?SD9uyR``q;?*MzF ziDS^@lHucv`!4RY=$ZSrMmtEbrTt)8Qp#{E#Uk%f-lL#MR*^ZzVw)hnPCg*AZ{1QT z?gMm9I5$G?-?M~b%PW+Wz+FQhEjj7=k`vq~@0dxtNp6`p%e*8w^%I=+Hk+$)Su!$NE-DFhZ7;zYti{M2a%9~F(KxyfL_k^u%Ul2inTeab;S3W0I2;_GknvIgBvfRkd)2D5fqJm6_ox-5&Gt=|t}d7yEY+Hhz$O_68n6a7 zOpN1`jUy17u54_n@<=-x`z%N(obGKau?gS?KRzwr8e9KlQ}FRj-K^gh0;EFHm73-TPO58ajjXGy`;<5C;rBV7F{$>MgN0aKvdc*Po zP&XhRT;sFma81&~?_?C4m2&C#A>FVWj(NTYRYqm_x^EZXl%T-*;fBKZp3TFCR_;zP+5j{V^8V zQ60!YbKe8FIGc&|p6#%BXa?kYkWt9W4nWPIGDz+!-p;T95YfUg$-u+$6NfV1ZUP!! z-THyl?WtvsHjXUp-Yt#4rN+1kzVe5G4yyon7>e_L3)|YVgZZv;B!vthLN}P@ujiQhsezzt-Ysn@54Md=rzu5GHkT%eSyI%(cET1E&*F&faP!g z9rNqW`v@=U#gc^XOU;1>7q&}X_$yzw;V#r;l~0jQg*tD59C6vNZ5LjGG0qf)5cpFui2)FFpxEkXRzC9xv6#g z7*dEH@LMp4=Zph@j_W~xE#OkgLbVAx5YxPF+Y)>Lpmu^^Ir=%7^^Y7g3Nq+DRP;L~ zG&Ngbas*|QcZLjhakEdA;u8+A(*WOg92 z{+ANz@)h4;%55}49Rdw&6y!l&wVB=$zgTf(r2e8 zYF?nWyJadYrg(OnyxqC&>P04R{|KY1%5>$KNcs>(bvS0lL=Zg4VLQoPtIh#+rS+a` zQD%$S)n2S*))I2PP(4(Q}DpLZPZ<;5H-GZz8D7mVFyz29V;8k6)BMmL_RfUcWFV_~ z-R6N&I~yPZIx=!O_AXDdb0Wxm%v(qG4#u@2B>xY0ig)3=^R8; zgFO4X=rDh`)t@*7@tKJJ*dz`+4h2_H+dr?5VPIfM0DsQl#~^@UsbkFR88(Bz(Fg}b zKS+*l{E6uU2B%N_YmOPw1mGzoLd2vq41=p@YbEdRVUaQ6p1*-`-;Iub7^$RI&6PyP zJjtWaDTsB1#eUEr3C?eRtuIc}vv|23uo~N--VE9hr9m~pnakG1ft8h;qXY$Rv?NQSxK3d5IQn4ZE7Rj7fsA&jGFl zx#|jdXlBeevAs<_dLIdBT{ezE3>9>VTm=IQjlu7^3k-R?Z8CVWh@VO@@N`zL@$XxZ z*}Sei$|#4afPNkY*?Zr@K-uo7(*iywINn3XjtCm+4ip3okA)ha-dlFuVu6CZt*f4i zvAs?xMo?CXv0r@eWKCV>%A7Tf5yVE4z*FJ+Q2!sA4@UcS3tJww`rrh^Vj3aM{_>)U z_xJz!y{+IOfps4SYn%7;HPp+k0|xZZ@Js=Jk|MQrE@4tP)98SV^yF{B-Ww03knVcF ze}8Pjju`Ew`WghEbvFXHdbnkeTvldobBrGjV9Lfa0_w)Usn258#h8BSo-o;Ir$S^` zG#lGBG`9Y;b9zf0U(MdmqSp?ugga<5@~g`5V_gBQa7lwFch}xI7-7CpplRs-Ntouu z*LG6<5gid1Hpvc7qsklswimPxnLF7f?4+#X5qv-}BZxZ-HXcq(WXf^aW+JnN=Q=%e zW8beH*#aa`UlLP6GQws9LO*eXcGC!mBtVrk!C{wuzuO8m7OI!fBKSFSJ{hC<(L z1BwyscbWSjHK+kRDr!hL80_CmDKmt#CvQ@0z7kpQjp}VCD!-b9iMoB|jaKVk+^#49 zjz`z1sQ;tqnB(L(QV0|3iBkSzMI`sZ^&qAZLk77{YTA*TDstif=o+5KB0M|u2EL6rabJXZhN1ix9@tTymr`|j74;; z%?h|+|7N`Rdbg2QB%=nHZ`i?)p6-f;vHcyf@C6wo%i%@n=q(-wv?1CQq={_cx;6hN4Cq*`+1Xk0C+lGKPYG_Uw71162is1u_MmXomTQs6pP(wv> zqC`EgOEJJ~obBb71hZliH`7EgKXAWc1Hzjpu2rpXZI}=x3go1?>*BSGA|B@KR>S?| zhDG|y>&d-m0qvT`5jQ||@LlwXY+HD|NLoa)B=0<`ar5)L{JiFE?KPEUgv$RDX$+iv zHGKFCm@s~{S90+!stD+bsA~Fsy=udzJ61p(_RDa0(AQ6C2dy@jE{_WoOyJr?j+T@O z4CelPNH;2Q+l@0T3qgvDwx&IfC;P&h?&Snjr1w_E`aYLwRyK|BcnKVO?~bkgW6q;{ z+zY<@vWNC&n%Xj$*7LURX?vpryyYP>MQ)_%CHx8DYs1) zm$q-#4LZGgmjdLK2x;#YkUIRl;ex=4s;6e_I`Eoc=}h-HM!#18MU8Z-VZWIN-^dJc z7$oiiN@I;EI5({QGPY5&QHm_?>^U0psShuIN)!rQ3wdMyb+Drd?-Cz|%TK z_-s}nc8KUmk><6TZr?P+d(e$iBydeC8LduKBaKLOTsHDUHK?3{n*LER7I8E1TCssI zDbr0|6Flg9oNh$JMIIgq8lSlq{q;Z9{NM=x_7j5p;C;yx0G+eqT6}XZTK@wI2DD4$ zcm}A;!kZ6>qokK+DF6tCOy?q|z;Oj*<9!mW#r2f)Dir{kf++mBT$Lo?W22yTX7?jc zS0(jL`&dxv_*DttSIIkowWV8Q7YM}oYRm>-H6_mgpSO)bOpGpwccbwJOi?y#n)SfV z$qX`R-skV)IYg{0#_ht$Gd34ngL4HB)ODjlOn^$2Z#Bdv3R)2`?4ySda~32j?(ErP zW-&W={($4(q`XymlcnX!RSC)d!~21R-@8Xr5;oUbBkMH>DLI8L0^d0m_~bs>21!zk)q zv&mbd&6_AEcgf&XEf{s~FD1e~#)u!J*5dB=2R5kSGb*#yWT!rjLu2BkV+^)f2*EGmZ2mx@$=?@s&J1p;iZL(@kB zaRn%d3B*s2lVRE6pgeL!lokBzx>IG9V+Kc5PTE0WOVVZad39vmCaEI6n?cr@aZVpI z-e_p6?%3~WB%Eys;s+-uS7~VW&+hnIS1i+hpu^(vqY9XF+Qr2_MNliWQeh(rDT@jE zQ11Zj=KjGV>1f@!DDwvcxC9D;9x*jlDby9~UzCZq6YB<8p^RfSmEC$x9rTz)JS z^2H*gXlu7!%b3oO%J~?u<+H}=!Gsy$&2I0|OCnK4?PPTsgPh54^D%LYH(ALt{4&&HTDcI4VcFjos zbZob%>EWYCkNUW%lNkFW zPkr0IP{Ah_TetN0d-r0yan`ZM0smLuzh0gF@UGTV0v9qsN8Onfw8C*K^j_$678f>9 zjKyrfl3<4Jup%9%s6_AP$n39sYJ&C+`noJ=1Ua>F<{o$>^#T-{RMjd0V>$p9er z8k9P{)>-EchS+;hN}?WNb)gecp9}F#shINwzK}jx`so1*6Ai~+&3pW|82`6oJ*Q5Q#z$Nm zaO{0Bp2*m(TNc;kEwPsN`Y%$n21}7pg3LTl{J|h$h|LK=&O~2?vy8Q92OL8STo>W0 zx9&i}Z&Z%Bnbxf^cX>^LtlyaO0O?#`bmpw-xXj~avm7S=*NMv7!PB$u7CXDk?P)$0kpy#cq*6<) zJ+TN2oGk%*V_D=2xKxPMgoq?w7Eod3deNWff_%vnJ1**p4BZ=UfgwonInb#5{N&!` z60MTWS|A!a1LW|Wz9X1sy_{~0cYN~}c z7ednZeR{QQEAsMKudaO2iDNGQ?7+ImLS%JFGFQ46VIz7I4P@z#zH>bhIZ$gn~4Lt_>I_X5v| zwE)^UB3^>vwc%V1Lo^A~Yh$)iA$e6FbZmFgdgZj<@{dH^LqS!j?BzG*L~gB_x*W);=&*IeRwIkh2l`mqi{5bBT z7PR84%L7&vjP0zD^5^=356BDQ5Mx6- zS;C>Ph&44sp1XETYQ8{QZFB>aO8zZ{<}j&pR)Pqa3M}bA6B?-Iq>AkGtp#;)HvM=E zgUR;D!U2(jaX-~WO%=om!{^k7b7k%*Zq1G8=dE{jd@JO=q+Dqa-y28xs&r`X^N}Lt z%?RIj(yJk^m#^0~9ohZVV8iM~9xZXFedxqbS(qfxj2v-{v#_>wxH|mDYBtgrz+3(Q zgSYVi58kSw&-Dx1yp6?z;@a&}BTe3+BopH-Z;Btk7d_(Ukd1OwUCE<4v(ciRwRhjj z#Uq8Xeb0|eC#+^(74zP(?D7A)kjfh=@E~?d%DU{hf(TlFio!})J%$xba~$1#6=a0@ zEJ#1^>S{Hhiq16qYh8N#xow|@OxW+ZtEmZo+;jZrZ_+GdZ}TPbC02WzE2&0n-1;u@ zdF_v*!Bc7@!hXV1beWXZ)YOZi`S9I)s{f#o`})R5)kY_$#)ar9?I9CN$T#sFX*Z`Z zT_^*GZFuW{FHr0My};MEc6<@G;Tu1oA;nm=lXMg1b$Vy1m}Q>o9qax3z|E|r7j9Cg zG~SN|6z&p~Jf+Xmao46L*KWb5v-BUxJ^a36tUP09T{`G)iHV|gQgZj9Jv$I?5z%5| z*Gl_G#Pjc*kn3=`spocw=UHNq#PPG*)k(_JxCDVa)@GLl%VU?+&&|=EkLMjXU}PiY zKgfNdy7iwc_*qj`Kbz~PbRcDqn_zr|#^GzbE>pZAnyGmpkoNRJ5T^V!M)AkGGgOra#;*{+dxZT=x^FKOG`+F75J2M{$YG-85^!wiwIzH^O zSh-f@IKU~&%VKtSzMHx)3;KeI1`Gdu4&)XCab{ndwa(Vg2Hy}BROZ*6`BkA8xxcx(Y37O>t!^^7K5)r`Zuo0J_LEh(TiGrIwx@F*YjLj-%CSbl!f_{3d8*&mH z$V=AI!2!KJ|6D8*MH_CsY03(2lNW54S&Jf;QQI%P%LO&3z7x_G9(kjuzgM8$R(`Jz z2@nduPK~~5$a`TG-14-(L_^FsZegvvxA~yaC8tM2A7MwN8%|2KC0Cz3tIK(E{Lgcm zdFqXuPF*qM0nJLv^V4a=){%7ixiPXf@*s$e*iR#7(fwt7xmTCCwQ)cCD_0KIt1dM-lWPddN*5A*WO zOkm$*74V8us{!dhaFAoqf6XYyqgUa3Jko z*e;@ZdA^gBlI%V9yDMsHvs4X=Ez{$c(^lTG<$%WFc<-^Hpy5TT$WqJCz8tLWTJBu3 zG49&vQ8FjF{4n|rvE=B|;LfSh0ZiMd0EWBlZz+s$t;4^H^|lG##8$fAQ*BPJ@9T9F zlRYDr(D`=sUaIGZjK|-_ zg9-GDp0}n|AF89Oup2C>vRMCKaOa^^p5{H0xjR5>`J1;@SMx;@zV4L9w0XF#UYoWQ z7H_ZhkaO6q4c0Vf^lb5w0j8%jZOKQ>4Tkn=lB6_v5t?4`c2#bz`(F(#g0eh!4+mAo zx@ISa;jfz$Q$JL=vrBh#%L3U2Xti}IiBWoRo;K&9tMmBbUTV_p0coyl`oPARX}~=v z_3}0cs;PeY`jF?Xl%$&+WJxLJnTzR;X>bysW;D;Z64sQ*&O}Hf25{J`WefnQFteQO=y>G#@4iAGV%BHEX56VBhJd_Aa!rEKHj>pPuM(;lCxr8au4k*&ZZoJ~h1I zP)~zPNZ{q2sB?Oq4?LZ%4`W4gyfH`t0T zhnk5WOxxqR?o*s{+L3_#%Q1N`DyM>X(q)S(thDYL1S47fmVZ8OU<*5-KzEFdqXxJ;&Fb-MXqo z?Yg`C%scci%hK+-KpgAl#(N{nq{1k@eA8b|F8O8REZ-*wCtMsIesul%`(g3DdX(|M zJhRn?;)c^DB?F9Hf!EEEMt@_ow={ihesP|#a@A4%m$)ey75Rz5D+g_CXq*; z_zGV|!J1n2dCmq;5~YC@Amv;MBN5cnh)}WV(Fc80;3{|6)ZH1yTh9GKPQp=OE+{F` zml+nZT5vQz#X1v-PjD4l`UTYh6fgVHnyMXf3_hImmu591X@nW)I(9xZ;af z8O?)%xS6lIw<;zlpEMaDd`@&PWJn?MTh~hRg6F8{iiq*@ClwLVQjiBYoA!u=g~$JR z`1_G2@AoKZ90Su){UNTp?g~z>!C&{Di=i{b#V4cKxo2?eg4Y6 zy1$O@Flvvk5<{ZtsDW%2PZ_wSAUzQW1!J$65FI%KL(w~35jdZpdynLfi^yg1e2sOz zJIt?}TcS+gjw)OMT{e~^#x~G++73dM5~vPQQ)uDqzI&Lcd5X{S+6Gm$*4~k zwp(jI2s{#>j!`k9F!XiTntdVnX*@iKfK(<58dZ|b1z8ti34K*tC1(sm1Ym26FyVvG zXs86af{+Iw{|SSm(}DuE?d2PLBuF|muR4p~*N3o=-4%e#ahoOj^y+3unp$_Mu8Xun9>38hZ(q;J+J;9%J-Reb)9rhMX}x9S1$I~dZM>vNpuet(ei9d5aDv~<@d3d?iHh8 z6_TiOP!_?OxO6Z;AzH@H^7YE6@ITD&Gv??+e@|N70w3%aRQqqfw!;LJcc9i0=Ex9_ zl6~x50>+JakZ@!eG>EQW#eiHFX0^b^P3SQSq7jr=%STnOq9DWm(jE?FGdEW>E+AUi z3xC{S;4am@Wn#CbDP-+Y&tx*kaJUWyCf|7=&PW=+t0Sys95EyP?y1{1^GNA63*(CM z)kneBw`Xt#!BLOGg?Na}yMcb!@N}=ulob{zkDunP8*pWS5#u!kGg4vgs|H|186YGK z>FCpac;MxnPGi?x?r_uM`K8cd3w;Jpqg1nAV#+!kp~-%n3bvc&%Sh#48l2`RRr2V| zgI;r*9tVz-Xgur7t?D*F3-Q1Z!IT;eVN2a?YmhU4G;q$9ER1&Vg(OddDzG4?_MOQIBW6WHy zx*=9owRr$os462trMUflNP*)v+l2&BXtmm{=h^u*{C*6y zY;b}leHqDPAGAX+3e<8#ktxBhZ3mP>Q#p?RV&6wY9m1~MWHsDba#i4md0k(j%xK2GThhi>i?xi~7 zCv3YQ`Ala^#*I;Q55O;(1O!AuA3R;ee`vV%BpVa8vPSP|Fhc+_2gKO0CZzaYyEn>v zrhRa#T7Q42e=`3Kc9eO0>*#&Sy{NbqYuS(cL&w~=Zpo0Jx}>0cMoXg9v}yKjmu5c% zysz@a1bbA0lw}<1r0mDxk8FXfm!H6uM_-xhriE%OarS&98@;XZRS&n9oZ9EhIvq}K zIlv}NPp94xWFUR|@Z^UT+4E~(SAu@5Tl&L1u~v0B;JS07%rADjX)Ufv1bvWoZe z&<&i$9~O?TF6w?nnJBIQO*9a8Vz*kJd;H)&X9INRVDhk^z)#&)_3R-I|62*Z^FuxQ zMcP={$~n_;m-~Vf`zAfJbiuRxN=1ln2wL4pV- zK4)Zfxd5E>xR!`&`wYoKeoKaF8s-g}yuSdzfm>Llro&n?U=X5eDuO@=%vAr{MW^7& z@}RyW4BS0|1>(qG3~)Ok3UT9T2-^`@;OKc6QWCy^f;3G|OpXm|(M|A5$)}UAIB@14 zPSS+Fe0c~IWZC{9GsZ-XWUk)%WZgicp6M90cnoh@y9ywa211{FZlWS$h zXkQ~mBNTMFzjzX8zQPF_;a$%tLCU@cO#bsI7|4SjG%(@iyIvxbf(sP{gXcCUbeO}m zpxDmBTWz7t5D`#yVL}w8F!@73@wkMaz%Yz1hJtB^q4%7QUF( zYm1vAk>cp^-=BbWh!tH?z2j6q82?YLbGj%+%3l zckQe;@AphFrgd?J!SoX1gpErUl} z7fgKYpqPXDcS2O<&G39uuKnv&citjC9&qCKFiIbjUdrsL!_mw%XTs#+P_|SF+S2%B z!6|;UA)5n8m%XLBe?h&To^CF{4{>xe{x{<2@pOIqRnd)~g}-EWVPlB82)HCsI&l(( zfbA;E24)k54TtuifbH8PPp~&TQUn?C>ro}aUBON^XWv<8MJ>*(q-lO(o^Ip)Fz0T= z*(1-i>@PC2%;N@1)K&)PUau~_u<*PCwq9Xb!GJXA@}cY+2vLo*G8}m%NeZqo!uHwq z+3D%UG&0kEicvDQ$S~h^a-7<9l{>swuY2*p(0eJ~mJZpiJs9RcqG-&(!WKAdnH&3E zR11%i6Od}2?XCde+cVWaR_?0Sr9+HT>vp>W zHKdp-vmZCy0@(_qZ7Jk#I0VwD)4c5~$7$yHOg;pw)WHHl2Z3v)D5$dt(URd)`&m<= zWR4x}{G z2zntv(w0@_A&-EI-W4K4zTn@g@_Pgtfr>|mf+s29k65b%n|vwa-V;g)V$%X>jRK9b z-+V#g!`2)i`~J1DYD7!I)QUA4*i-~n!}>T8A-~>!2nf3rfaic7>}3F0%7;ndKZ0i7 zU#&=$H*kN(zAgJz3U-wrkgkZ&(ew!M0J!M6;*mddiL&6XRs<%!{UX3GiZ4Zo*1d(OH5G(1|o$h*gR~``=xU_XdrW${Py+qayP(*j*7-vXW*Ok zWk34fE-A$9UX~R-V%;S#g(m6!>z&Ac(4u$RzNf5i6}NxM6BN>Qkuauaw5W* zOblY%$&k@)^`#?%xAliG5(Y9kQo8oMeU`iDo-c-IlSBdma;Ym4zW7gCELiy<-(0i{6k8N#y~FU4m6;tH!a$n|o-@GCjYrzE@K0Q*?xpfa7OV?}-!{YO7FH7(bOW8J z>CZ>Fs5>&QWFCXJRsXpux@Wn&6u0b#8VSpgPF?zz@ zgYmE~B2Vigpcp7N+@pY(fc>0ndwuUv*=d(YjNmFzqa>|8*Jcgy6W25og79u`TUjqVf|MbI&+bHG(^#OK}NhfTGDCl#< zB%>`M3v|60uOV}{qkFHZqrVBkm}uYlDyBE}Ct-=nUo7FC!*Q{RtoPN|@XAiL;n znfrI^$vtm=I8$N5sm4I)v|38pKO-xlw8A;>^K88H{?}HuC^B!Bl4byUkFDrNsO$VF zDr)hp<|6A}^lE{sv9f^#D0-yCZD}{R^XdG3%{7gd=`y6Luv7dMjbhBYXR4deoe9+) zA8tN$e_*X`9$(GC*ZuH1+OhwES0LYMZYH3LT&25!AD9oqgVR?t41kDcrKKB^%&5p-Xm+TAP+qXR_LZng5_Uwc8sIJh|U`K;EDeV3QI zgAONdo1AsGKmQKU7-ncJuTS3%DDdOK;949pYCp6uq~UR`FjZ9Cb?oHOTlXq>I#aoW zbQ>u8z{Rm+J&-5`8M#0cMgR9ruWjctLfcUpl> zj}Tw@qU(60!2LVchN?UOXSjCcLnB?VW}?U#Hjaz4041}cwR$M%;OX+k)-K>F>++&t z2L25FaU=4S@-{p;60jCx53 zJLN(k4;Dq47ew@H2ww>J`e~8bqf@8q91`ZArRoAIB1_(8Y)+Jat+Tv0+7w^E{4d%7 z^yIW$L4kLqM-tgX#RA?;6a^g_9iH8%)|Jgh`M{?|P0yqyaur)|#c#@|-3ZlSr;z(d4hu(by8!$;k zLXxN~jW4AU=|yP)bwk11EklxIwmTDznDGZ9t#d{ZcX~2r{I6Das`%ncCzMt?^RCi( zv`|+MFoRtET4cFa3Mdm?-pq^2ab7>9FZtg1*@ zi|sEHyHG+1thsD~!ZBYP?9O|b&15gcM)+p@2M0qSkw!xo?r9ld zph<%N=}Gr#ur#KVanctmWmM(XmvJ4S<#AriVL-D=0cDmtO81lp(yhx@ob;c0FiY3m zDEh+vg+Iv#(3;yF-likBB6%C{!*AFxKc9e&aoUp*dq&Skq>Ttg`QMVv=s}Aj9xIh)k0FQa#)!`gdgTIMgkU zYWjX)g%5n=rA_gY=Smgt(Vj4NaS4U2!(zec;QQRPnlIeSrk|wd!(yRt?UCGks&L6X4vEbrh*+S-+i|g%Iqn5QQ%nmG|lrdI57|HHgc%_p=0K) z-G-Np968De0PCOBG9d~+R3v*`!Pf>EA(D=PgN+iz3Dx+hNS$X9P(&Ol^p{3%O%|*xCFTNK^zIr$S8fw>w)$I;~)91Zf3j2N`fU(?Rf6 ze-EHFf-=529Vk)YynCykIz0Qtz&$kqVWAKz5kZJZ_38n%|C+cK_#zNvQoWi)GF*%g zgVGZvpwATgSD(Ra>!5ly-T(Fqq+_O~*JX`KLnsovbeKU(lx&W^(wk%hq_CHV^I6S_ z3?TW-9j0p?I-IW^x)buuqj}h#Jb4lcdSw&1!hjf-R*!n0aRm9Fk|KqhP z3_+@LsuaBo3JiH7Q70+M^Gr#M0C;Bat0N~XT&aUs!PznqUeeBF9!}7jh2z^)VSFDO zg{PG~cz*%@Rz$3{_v3ajnm6wD0-Y%o1xn@mv1EW(!+tI_e{e|7+OZiTd=V5n65Ox$ zEUQz|hBK-24fiJ?fjb;}dJ$HsL`%O5AUbG7E;*YUF~MZ=20Ndc*c}B)pG{Wr|6X%l z%nTD3$$SxKhd8W$r7>;$!hf)R;R6ot>DszFkb7n1hi&Zu*SLTBHAFe4>2u!Ddoxnu zz*uAxj^q`_xUkh^=kpV`EQJCFz=tfR@Ic>+|x*>ZbO$6d$x)? zLi!P&x<(-HE=h#-nBxaiFx7l`on0b*c*F>dz6*$p0s)(<0p14%SDRD zie<%Kb!%n>b>AOzykt-Nl#0}>H_+te_e@79h;h2EBqMsAVnukr2g+B4Jeuo42`9fP z4LRXYpJzuGQ`}FEF!_~rSFw%8sPjBL3c@|I@wtuqT1U8RS;+tHv;X0(C;rpU0ec#- z_YG6Up8bhc)voRHwa)>nkGC~-#bo7^dD`JZM`mrC^Jol8=|It5F<%naP#n`O4Lz&4 zO2*!b`V)0XxmR(3r;bAL3=g80}l?=P$1s6r%~O(5uUJB#2uFm zya}6!kO0^J>Vs|Dc3M+zKgSV8<2vPTwnUBz?c?OtW1A%)>vJl}%F0UHpz1a|%`n_n zzs0fUVruXHWmTDo-LO8`n6+8uO=5^(lVQGRS>{%IF>RU}$z-;GcSL3}kMv@Mwa6UX z^HyrN%yBWEtI~R08`UoMDXx6~4{qtpX9;U5HJIVHPgY0k#@lpQn4fLf-Yp(HW~oAB zb7xh&J*B!m?n=2|cXA*E03t4}G(Evl67k>L(%&4Xe0PdlcbOU{;I;oeMCmfh|T}h8M0UanM2&NcV@n71crmsuFPLA={ za;pgQFHn0N-R+c{K5@!@DS;m_$&HLC5(9XXf!um2jK4})d;2*!5vU4DbTOym?F17H zGE!yph_{Pp=r-d1N1sxUfz$JJ*vN6T;gFXeF3VRMn~#D%o1tKd3DhWYWf_+;voecL z%WOW|8M4c;iiP%PT7|FOFd)ePgPOt30^BWzVuzwZQDyS}eSU6(gP%}US<5q;*knu} zW>$J#BX>`)(U62G6TH<$r5oMdzUsV)=byO$*4A8OZT*doh?+Gj#e~(JCUYa+b)N{w z0P$eXxCd%o~kM&U?qXjM>#qMa@Wx@ zg^8nyo%!M2sz^GPg%g2NBqJlYS1DLdmGDKlfESY6l6K=c#oFXv>1*{EVw-@w= zaA2`x&!P}K9i+U2V(OfMBhu>7OIN~^KppoO6^W?_7dZOG=80yxHk+G@2!qT3U6shfT7;1;7*QLxyTZbrBzDt8xY?#}o(f1fJQJ6}A7vk$3K-ygO`^X$XO%pxA{ z@dx>zh7H#J)J3wEdN%k!b0PPCd((}LOF#$f>gu+(waaMYgnJjUx8Gu^CiFNd z=-XmK-8s2GN**L)=TME4bw!r>xmyRUrJtP@$VK$)Bh7IMK9dr`I^ZDjo=dpNcPm|7 zq_EGjhH$dp$`bQK2Pq^1@smYYs31rPlLV_$9z0(J<0o~JOi-fe5Z*UNiM9%Rz^E^D%+KUS_-db(k=f9l9`W_|7(5oTBo^TyvSe>^IlY zK>zoD!JuLZi7J@gPfYnIEJT1>p9$|7J5teprsrm7=^|=4yTp8}5lYu0`j(D;)&O zi&>%zc+bFoz7S+eR8#^_*nn$uE!IlpMXmkE<`M2i7F1*O$93O;1R9~Li->hlugl1K z*ULyNK04nRF-FtA<<@-cg3wFIkRj@Cq(qMs>r^x2aT--=d6ipXMJbt$wT#k6>V4;E(lEdAXVR}X^3E8Cs4*t zamc(ex{YtqZFYwdlEUn1ka#`q|;^2)xRfHV5{ zH&y>RbOxcgybC6a^FwGVq3;S&<8ary^sc@cTnik}y76Ln^ARm!bj> z!Z$>8{=Sm-v*HNY6r1Xt-5iIcRGjD!fv?YDhy*e=pDcqtEr{N6|M|V89lIg(84(}% zQG_NoOScgfGx5&t-MhhtZwRiYepW4~9f~?YBD4sn)#0m0`nhg)fYH5{P-4N{iCs~_>sD&P|y$F-Y zQd}%Sgw)6gmbyz9!Inuk9~KbwkNx#)F?Y0~w^jdMoOrQ31Swnp4;r=IW-9+{*R6~{ z(J0x=7mIC?ku^Jtag*nDKX2Cl$P@D5@nVuNsrS}wEzdXK__d{Vv9-p8I?td#(zZHz z%e~v7?(C)0Rhy~9_qF49?%jnh!Dt?!e3*QAMp1H1aF>G0XnoGy&})X#b5%`8GZXqT z35~3$C*!{CkRANj-z15$r@15Q(w>F*{-mrr4B~s}UvE@k<(ap|n8lK0Nx6eDX$RO3 zl}>^4Dsq@~e&NZmfnQsKC5ME*l3>o{hgD4(QFJ2lJcJ^y@H6Zd=s2 zT|V0aiF<9oz-?$W^*?Cz;H%3bovx=|ux2+d{=nlUs$87%M)Nnm?-Xt^5dNa%vA3N~ z;FDW@*jXRYbMsUgL3D@+mlZ5utwPu#Ae=(UbmFy&G90sY$qeD#a z#Rv3`I1+bIdf*a~ky?^R2N7M{RgOMPx$TK5PXJtb3^6r2>gz3z3u(VUx014WIDhMD z^s5(1o-(g~Y~HRr@Zx3TS|QKlvFzZuoiQ=Q#Tn1usaHXgj($^sz6gQC7$Nqs{o#ky zuGx;%8?(-S>24}84;3t$Z;0<%S$$A3^e|e_J5#4-+?weAFdF_W(#gLyCQ`9V7WprN z`tT`I$aB>^=8NH%gVz-3&xL|S~2z-V&ok;w3&v(>6)-peMfNTOEG3aH{oI2nc%@3ph z{P|UBI^1jBJrQ;I#m3eh8)Y3wCQq-x(5}V0U`db4^{Y7pndH^C;MLa}IwpThH9kaB zF6fgNn|_%UcvgE|V59VC09)T?@|ClEE#4|AVbft09~8N}!dHOip?9^uy@Z<*@2g$V? z7Jkb8Gun2du=o(SD){ajfKeP%gvL&tvR@9o_-MM@cTrDM4-XsawxMYV`z#E9;V!=V z87F*pP5Mg^`QmiWpr`%0D5LcZFj=F?#AP}D_PKPXyX5X@d>8iTwKy@I@S8EaV7?og z<#A5xf}xva&h)W~>Oru*1jnQ7F`eOiHwNmTuIseD8Soo98vIq$R;-69&t)o^pb5Al zlfPO^gMvIn&Il;@gZ`pmk6lJ1=;Cam5N}^zD#=2UCoKVPZ5T86;w7*n76x>S)vanL zUa;=hQ0ulRxTI;e!YT2{wrf^=yx1}u%#VF)bxN-5M)W_Jxw|@ zVHbNaDA+q;a3BJr->OY}DKRt20jq_^!qK<4zDU8Q(zk!N{_``h-brs%vd-F<<(=gY zu*41Lps+mtaK=nkz?-;ET{*~+h@mq@z?gSC15H4Ovs1prN66$@pZD1hijKV+({czJw1S1O$Ub@Y$(Y5d5zgn}0c=8z*_^Z%IEK|n0#I>?u3Hiw7eSW*+89aHGbPZ9 zVCQF|2^2lRK_`&dQsWZ6wV;jo-AH!>4_)iBnMGd7E#_c!=d$I!M%RaaY<>JztCkRO zuL!QdT(hR?s?}X?s>_H5ugnq63My|c2CWvKUGgx^O#glu;zuK0$SzOn z0D^+~49k-dl(dufUB^6X2V9asx3fkqQ=v~}El(yH7iECttwlh;9+>bh`JLdtGOK+b z_ah@(sVqN04SH8I&NX#p@7;tA3p$DR=`UE5+v2exbPfszWYGtTaie3L*@oWDdRN{ z9vqoeiy9y-M>4 zm_8Njn)3x5`vhI0nq3Pa6)u(JpMjobfO3;RDc=WMZ`IjUtu-xiM)qP;I-G~|;(G_U zkEZ^{HUQEYgqU_ria*>%2llm>W&oey3FoZ{B73a^ec}-FkO~qql&M?|0_`rTRLM<+ zlydrVyycIf&J(99bZ<(cDyUfF(XGtnm6sou|AkHWmA>3W-x0Yqkn{FrXn{44xeYx` zrQy3LVM*hC=(0#OI&8xqs2H2aob6`( z0jZaRwnLywNc}Un0i``7}ffcq&GH&&!tyRb5nO82y*KZo$C4^hIqm z;ju-D?#X=t<{N5jSAa&cvoEE6y8UIxZS$5u$&D!Wq0UUEmrG=xQJ@JZ8jK?H;qAb# z=D-_q|E`zrOT%F>pSLHo3;7lj)Ny(NO!wg!+m#ee15!vOk@J(+$Hy~+vg}?g-g&;& z{4q5D-0StvzYj8E2e3CQ1|N5AjZ4=a)Lpz^+@|e1{Uz|wU%#Obqg36?L5+pEDp~uB zrvtah`Bvmw@DP=B?YRdj<4t$yIbl_wT)j=Wu#hG1-W zsS?0BI#EzeQjLkRA2TpXGX^W)_EIQK;n_4S=th9etPgOnJN~Os`sd&sCt{@h_u?0U z=Ny4N@!HDghT)u(g{GT01V{1DJQ;gFBkDyZzDZii1;t#Aek@`q#%H zv~$FrA*80RDf19DeSS61f#`5RGd~qJlXWdwEBaQDihlw)IJ z;Eqyy8u@HyH`3w9F6*g1|74(`zB+c@;fi2_V63MwPZzd&{F6Y?A*;ZJz9LRZXzxPv zv0TlEv-~f)bzQ05G*3gts?$~yb^KR?Qnz%m592T(DsgLiIH#xbUbSmM;A-#UBFk4b zEl#5`8b+0{vgr$tJxk662O|%DUYOVc2puxX#bI7*u_o}+sp($LnTxWuj=tU3n?5?T zJN{9yB&+kgLPeRD)?Rw%87YAFu`Qa^SB35?yL7`=59NQf4L>B|bnvb~f|MO(o7qxj z$vbIsLn%a8u>({|NUev!zT};^4sxnB@AnmM#Pgj#_g)q{-|i3%<_gJHNQm-6NZosC zHkKNy1meN|l%5D<1f&E6f3rf##~>=N@U zH=Wz2yAW}QlVi8O{=6KA;JbFE`)r|ulXtNMO!=ClJM*<`@Q~Pqj5Kd~&KXW-2+SP8 zk_mva`mwO7VF*EA*G&ZX={dVSV1hxeaZ3fwH=;uZ_)8wc?G(P75M2kT#Ov0q* z1}Zpl`GJql`HftA+@dST{j>3=lN?0E0XV1q)Fi_T_P2$#}E$jKYyieQzp&NAJ9N6x^Vd_M6#232kIp|~& zQZWHBIvY2di#&gBcy3Wx_<8l=CTrZv?@Y%^h{LAH7%N0U_0AZy(&{n0q}297%?B97 z!4;Zp5bU=9vt@=31(<&iUd{mq(9}?YKNs1zwp$bCBld_CN1~U5Rfmrh-fAuVLtm=U z$M0jWee+6aCxWpGta+=%?z?w9AwgE4bI%*iA75J-RIEN-gzjg(^<#FoZ&|vUZNT~I zDCRD?*BAfvw#8WbWBi&Nf(QEW_`^>RKdmpfvRRzs?7Z1iV5Rf)&xh&m)6E*G`cBTF z9~RcmDb`d2tY37=gZnDaA@K8E5sx{x(;AUA_vLWqog|Bqk>FI<;j)w0KC`!hOP{>6 zsBe)IO%*2B3`}V_h|&Fd2p?!%p7M%15=a?}-s}_}kV0^59Q?qxOjk}`|YQ1chN#ig&5lp8A&+uiZyVp$JmN$PxvUs?zpq#uK4->jHHGK1J zx5nJEM|4`$;aIPW9Jl?NgzL`UDj!DR{bTYCQhb`%fM~OTKSN_HT>jc=@6J z0X@J`mXu^?b}yfgj0Bz|&hqk^f$Y0u-!TKPxraIx^DdDxO}liHBbE+6Tm~;XTBk(r zFAQmpf)mU(ql`8l%O|*f+>rAZy(j9-)*}D`;gBKz&I#~zBJYl=(5FkOzHWa9hPU!Q z41OQ3jJm>>c?V^gNJSXHvnE6^NZ5~Du&IS+BJM03pik<&j=kCmtaZ+!bZsqXq@oJw zGC^k*Rd;PK{AK_{Y;W56@4ABi)T7~lC_MZ2t;Sq+t<;A3vDFcu;UWNTQ%SnNP!Vyk zBX902g)eEL8L|+!1-(D;$uuCLl<-nM8m~LoXHDH{+}wjf^JPRGNB-Ff{3E`SFmWHd zlk5*fg!sw1)xrwMH&r21g70K}XSXbXBITt3Ns$38dw#=8!{yOYZMvAG6dh}U7`hnm zU5Xb>V2DSY*->Da4`XaZ(ZTgPF1Ll(T-JaJ3TD+1T_I4G8W4Fb8_K8z#q(}Ehv-+) z`n)}YYhO3zjzE1*L0}`oUtwB-nPcHXG=F}zi*F3?5; zEM!)Z5K(YTwD0JSQ(vhCb+J0L{wm5zx)&>`Q zh&#+0`RoskQDRM8ypZFXuBSpVt)8*C0Mg2M8d=^<$J%2~pggt5eXd2J`$mv|fl=TD z@{?ll5@*VL1ID@%HedB4$1g3_<}QXwQ+djiaC*X-VQqvu`UFiDgymscbu_qW@Wd9o zweyZv-KL7tNt#kaSgT>3hPx!(nkpUvk_&LKHvC-rv>4oNqn}+E!6h*FJBlE)6#^ZX z0?l6~G4N`#UEnbpv8j*{{;==J+OZ&ri54z-6(;A0qT@6OThhGWwt1-U4{))-D2RaF zkGv1s1qrZ+$zbysy+7IK@ne!9Q6~$L^jwQ-7UvKh;}~dN-K7_jnaf)!VJsgcZ2__~ zGF|CEY3^bz2=QnUL5I2Z=zWVTr?e7I@y;;M#@)-Kf)3h?pqB-*!fvD{h`ZyMQ?_-xD#2 z!E%R3=Q218TXkAHAC0;OC|2#ig83;2u>~Pux^E^56qYI%UVr6dDjKl%C-by1w{Tru z4T=dn$eCKY?f&G=XwORPXz$cSgUm5TkFH`VMDJcRRbIFFO6F~JNeG{R6|Po2=CXz{ zQ0kWuksHBq{nF>|W3V5M3w;%lB){^0l*%;GQ!y zWC_RJ!dD17=%}OPT*;_}<>eD_s+L2$&y(u-B!XkA87bb^CHWVQ{207& z`L30kmlS?v)%#BHZtWy{S{RVgKMI`NKeqDv8K~R_2~!w-kE)vOS-a9#XDGf>H~N@V zsR+8wHXj0m&4t>YwJqWiuYbY#6i!6ItX<}p^|qp)uvG+25OnZe)Kr1qQ8cTMmK0vN z$5fGqGXa|>s!u-)*8E7m(0mz}B(9fCSO-xEWK8fX9oHj8pO*Ql#*JJ$Ar!F!hQ9Rc zrP)(J{0&2h2Me7AS0^lI%cchaJkWI&yXFt)NCoDT3sSty?QZb{Dr;Siq8ZYzX#N+C zcS_2%>dyR*B1kLeoy25_83JI6a>3Xw@6heh;^wqc0H4CmTa01P{1e~rY8S89MXO@~ zANv0jYmXR@3V_p2StZcaX0YK04>Mvez7egVHb@Q~K2@2wQt|l1+)qVaZcNWW$nnUj ziFogt*FzszRrug9b2X?%M$6QP;rxL${b;TSC+KQyz{{5}%gZ+<2C$cg4SswC3HiQt zM&`8icAZ%pT7e1Fyr7kI7_~0;FNJ^|LO@{mNFm}t<}=~^oHJ|le1$Y`891aHVxpoT zxIY&!V)KSaHIJk#(0$N!qm3}ZuOlV-{xhZv)f z!%!(XhEhqBawvt6Gjp0lg;Ei6C{ZXns~k2Xr5s91rP)YMWpirI`(56j@9+2fyKdcj z?RCAb>v}$)kH`Jd6#t_B|JP@N?FZ;4-W+g@W|P_lbZ=vqZ~|Y_Xx*Dbaq)}%ju9WT zCz=5*U5?SiH&RMa*$>pvhwgY3L`NN76Dh@iiZe88|)pOlI-WR zk?rvHG#iO?Q=F@n=_K0+jj5emH+o!H=X!yL;=3qNl&G-3FU9t9AXMoSTjdy__;24W$ zPfY@~(#x?etR^S}rju+GFzV|a@<_R)q^pf>c6mv$2DG&rAG}erP9m88uJ+w@Ie;9* z6i*0hDuiCpj^dpE#lM_)mgX*T!0)L6J&=rR#4Qbo1Yb}?fVPnpY^r| zf{Jr_;TWw(vj*)eCW%Ke9!6td27U~O9R1GbmydM;O?J2T($i@fm~&%sbYG`oLp(34 z&!@cN+=7d^Ve9*SPH>AFA=(Sr}LB!SUVV(2`i_Q195Tt4rPf|N4Kr_zV4{;Hn^R#)73fC zIn!aLaHt0<3TZfxOCgkF^SDd>3PWBm_w8?&0I7ff_x;tWiRmg=YK|0cY98>gfL@S- ztxSgAIcr@gtmvR&z zLJ9RtgF;Z%_!%5wc^-A6swUhO&&mR^s&4MtUI*j}wz}YQWF)eQ=&JzGbCwW_^O(ZS zUK(KsKgGf@h{6r^DYe@F6KyT6uzv2yJ0h_ugr)a@kOe*J{yGFEzEsVrBQ}{*Z97dI!J^97C7+sm_Wn39GxhU zK{tB3Bv&vuv<%LxR04IySa)#{f&Reds^*=F&-zx#L>W-KZ9QqQk7uIiOMnH!t?KaW ziU1eTLR1+%Oi4-UA|l54%dUQbq=*({h|M_DZ`P?#@@?QrUK8{i;7wjNB&5wB^zZGm zPM>8|8{wn#$k8mL{Bnt}PVY3y$(#)z)5sCliGNvr_G9FVu5C^96#7Mz>E^Ej!RgN6 z6&(Rsu&=N)>W`MmJVU34MdpNduv?Xm*BJ3}uwsl@>ql}PjHcLndP@gW1Va=xV~Sn> zsvu5WcX)lVuI`lJEzxwGZbR+1!gu?@>_HV8Z6Rh&H09JOK-TNQv=>*2zPP0r!=zD8 zXwR$(xvAD`*UH>c?1z%IrxV@fNm#h6W0K#NgD=g-0z{^SQd1WlNHs+<1Cz*e$R7zL zroTGfQL^@c5qaa&2)@rBzx=ON!BgKh`<--mFZ|u71^|iv30?I4SE?elE;%;T^AJ+| zCSMmks3+@e+qNw}KB!jvsbj<^UNm@}rG>*@mu_lV7O%85)VGcvt9LD6=g~H{GP+j* zSzoLzu3F!Nic}vUoZJ8zLaJW<*+G6gvR7k!n zZGti}PyL+6Ey$zzjq(S>7}LS&cg;7X8AKPYE0=uPJ(Exp4JU`>B&DhEbUDj|t?BA) zmWrD>Ct*dyiQghbjTpPd>864g)N=j{YBpQEUPSQ=kA5m8$Kx-WO&`Pt|i|5QOKn3T+ZkXO=pD2kiP;i44Oxm(83mjb-` zlJ8l=tZx-XdFLO-W(=hQ)5)b~c(VwNy~%`!BKUol`>dCi`hB>xki2{DKC!&W zpI`T*ua=gbS^@B?=aPwC5u1ZrSb-P%NrjVP=L(`0Qu}6y$42+SDjQnozK>K~IGg&! zpj+6FuG_p)>fVu}xx_3%D#e%P89+QcB5ku0G7-~-2^X^G9~MWT*@zTdx4Eutjf8Fl z5^{iiTN-Q6iCbA^c_$wezeZ*2{<&{_Yqtb;S=oQGV-mtXYq9k-%8=ta-*6T%(G zUU@q)4BHg*sPbDCqHd3t_F!(wFd~$)G4xZtYzwWTEl8>1J+U59A55lhpqkeWwH?`# z?^@c;=`ggLg?!eIFJ#Kmy%Mayus(iuqEPi_4kr|<%QdJej@P_(iP0byn0}}dw zD-0-K++_M?u~A{{*CVsZBfji&lE+>I{pa~uS;LoyD+beq~>Zx`iaWZ4*Q8( z#HXCV_dJxqy@_nICNg1(|>)r(^d z<4^e?_WS^~s`>1|$o<}+ONRiztC}Mp>NV?H(IhT3(T{#?<3RV~m%4k5us({C|2_pQ zC>n=~v!n$s)+E8ODh`RX*bLb=1d)zL8QupD&W&wPxWI|D05TDD;Q!)`^cOf~h8ziW z|IpZmx}~eHf7+>%vIuU+t})O)d*o)P(vzlyvtZG7>pzsG10%a=Fheh2;gABJQ4|$) zVBJk{8-aP*vWm?xMKz&6cWe&QcG$J5u%Yg;>C;WhhGw z>XIbhQwK3mQA1gFL`*$s+{SZc$%;coi?K0ssD ziJcJ~$v1%*4O7<$Do&h~ERpSRL5I<0{$F6s@`_`)Pnb-XC z%3NJ)Z#?Y$5%BeK{N#1Ao6qa(o3zg@9^X;Ln^+BO|0HqrLDd|rb?|K1S>nlQ%g2@E z8kTs;c2v1E+)rEU$ETKF2zGAqnrv!~?6IukAHQM`#wOeftI+Zw-@wYq+^2rCt=MUp z`%?!z)c=tT)Be8)e1)3&py2WjJfI@%6$$69hWxy9ulh|DhM(vtjf}qe>wf0X-(eD&-RzLa#8uJ=U1X=H)?9KEiK)}uboet{)yDH zL|wyc9|oL0hsK6na@}Pj7c}T)hHxXRkfrnkensf1)&G>O5h=&?NZK`MThQxPQ|BE(R^d ze|9*nTW7^09LN!EIrf4~&p3!o>Jai?qjs6}LC zuBD1diISb3+cYO(f+l-BiSzb5$)y-7PQ-~Cc=1_#}VL$F^j~Z$Z1o^yo!~&zA1?P6@eB)_Mlk)a_YbD3J z9kkIwcQwSsNodOz9%|fljI^ss_&i?v%b!B1fMCsa7IpF?_GYFRRj$;hHs_<3Tp9nI zx>Ade^Um1^%y=miT!X15=zo+5g^<22A(RagrjDY7ut`cz0*9iB)i}G})JL(gWctwv zX1V@C)eZ&80{-~NJ2yI&d9e~FyRy8a#f-k}KiX4#v_~>@+M`k7sqVo)=p9KsU0wB? zjLqit?uMLmf5s!f^@$v2Y~CfZOTl$vhI#S~N0$HYFq8Wx<}gc-dawA=*WT4QxYhD^ z%eR!8ct=&Nlig2d?_$T0(JfnT7%D{sbMmvG%`UU*w`P1sMuGybY3K(b?fhy|ZQ=DP=Wdd_PK)MoM?-zXE;T2tFCzL#q|9 ziCuW=tO$N=xj<8gmQK?LzTlqcHJ07cFl5JVE9>WX$O{_Axwp(yn&yAGJK-A~iqM}? z?7Z#w?0JDvUjic4Fa7124-IOAh`S(ezsk0)MiGC$`Et_2S5r4mj79^YS>VF&XiRm4EdTz*vY5S# z)G0W^RajZXvxxLvp?glPd_68_7JkdNb>ZJo7Z^H>=>*L5^OW5aFT0E(6kgj;eicnV zFKb>OfV4akRV>2*L!IJSBYcA~(yO2gbLfs8lhrj{r#ehq05U^Y^0K(?%E;|?9%LXLnT+-wz1})-Nh>a zP6vGgA6+?6WD;*c|k&gn~~-Ck-l` zE;qdOZ?vu!A6B5BY$_YMm(NH*|2-Qe)t$?!*MN9U&^T3hVw6*j>vOLW%H?I7-L*G698xcwX;=PxI&H(ATo)5KFk1Wgb zF)QU$h({|+)A#@7!4AxJE5!iA5o11Q6a*)VEmt*L)lmH6Yk(?JDW*PN_7xWNx06d^ zVD_57O@i%9^9Y|+9E{Txpgjqi-g(yQ*iJj!RA^4{2zf?m(Cqc;6}b)imn{XiRU8v) zF_VlyNY3w9_pY?HZE32(gt@AE$fQR7zQVV9sc&4<{>nd8S$?;4&=m*-BNkK>V6$-YIZhGCsi`x>|fwL{y2=LXD!(6$vIuH3_PtZR8bS=prv+~mV{8!O(s z7uy{C;R*D5DCuhGylB1mSzZZts;xp}R#;d6wd?DP<@u$k$m=m7ECb-+f}Zb45nN3> z7Tw!0e)>CkuX8whd1UTge361Y&CYX*fCss?_8fVEDqC>*RqUYA9=P>#+|B4#Y%1L^ z?Om2x=eTZ^@{2lt_K!|8r8y+nbIgnRZyQ+#3o+l%#@rg`=D(;Yf?gy{2~$7C9xgHa za&NkE##}cN2}{F?e&V13IcU&n@jYeAl(wdvBx%ah7E1-cf9yE~F?J+D-Ky#2rRhCg z$OG})#Xw{R&=`6}dw1Qs96^F6I>+A_5CkO~h;o3E>4FPrWwdP7x@6mV$riTU3I7tN)FCmx;79 zifoRl zi$g(4wB$=+I0WkrBiSeRYiO~ zd3GLgF%kNJIt_XmnR2Q5xI-+p&xIlMz$jC4IcvM%0X@Ku{Gw;-;Hg2)){WoOd-X=l zS_2f$D)>qX6>qXgANCtr82=4j9YO}v4}0qP_U)N+vQ>W=T$XgOSB*W#@8IqsRUI|= zgdr_bJ=Re;X*e(-5w)ZRfUc4v7)kAjJT$F^qHGu(KK%y;Lt3tjouXN$bh*Z0n!#iq zhZJVL7oL88JimG$f%V;DQ-4iLydW-6YT^EmAd?Z-jg@(y9X;@u^^1Qqec6zz{h6PA(PxUQa_m;xgfB^zo zS6~JvNewZ(Nft5rubGH_0Fae>=PfYP*WyI6bZ|-#z}#b_SrE4OJWzOo9Ub(j@8OUG z2%=Pdfnj@@DR%#`a~%xkuzAe2>fr(}tF3$Q!qj~Iyv7*zpjuehh7qXw;6c;MNVo3U zgei|g{+&xRSq($$>9*pr9g$NqMG7?87_!VBaiPN*mU_x3=mqA54ncV9T-K#de3LXX z&=>5=#dQ(a_S4*b@EJhEpyau6W26?=_pbe~nqB7z(Stv^0Ad{qa{Rz6&RhQe>P75( zA@nR>G->B*tWq$rFvzn$c-^9w4C$e2V)X@kQe{RilC=5HWqp%&>^#vsSXRU@7lTG` zlqsOhi)F71tqo6D2J@wqz-0h?u@~UDx}nP$+9e=oY28(Kg#Jgg)L;H0^S!b z1uSwZCUL!54d|)(4Qafq$pZY&Z$PjLuRBeH({_@;OoBnfrf+G6<}dgca0`E-Y4bp1 zV@Z>m>qt`LQ)Ja^fs{OmifFm#pJuBQa-!BxNi7COi54q-Ev*BLlXa0zj_>9<8y`O0 zbo7Yn;DS6f_bM#%aLAV~t*zY>Au%*UX;dlUSjM!5>G z76h%l8Xf6z8@a|mw-B{CtsB`Jws8xZ-%<`d8SknmD>a-QJ!~;=xVvgpY_=$VWH7A9<3}cHhCRzj8^?lQDFetnE4CDvu5V&>Q=JFzKc^BV&5;+ z;ZUtewYApUgc+<<8U#FK2*rE0-?{`wPZ2h%NiK0B`k|X2{A}xmENK zGbaW8i*r)!KE+RDeKT%8V%N1}S@zHXhN983oQ8mX|Nj2QXZN{NmO0sow={~JJCx#f z-07^{G`Pz;TmdPY=kI{5rCkr5ph@~ZPoweqI!-wi3vN8fDgl?N61#2jzT71XVUK3B zJTJNK5_KeDltX*nn?UnG!1&1Cqd$iBC0a&Ic$A~zH>0w&WaAgsS+1L?$!htbxULnb zw{gfTD)q|g=1s3>f161*^>7%{PE-X;ng9vw@R;0FU9sL$sH&nQkF;L&EbD8ZonYuR zM3-khzuZ1jL{3EyjGdWQLbsi@K?cZ0ytP~4bk^wtnWIWi61fZCUPO#$>3u(*%q)1S zi*Dsr(Zl|{9rY=~H$2I7;UgB2CqRSx-dl2%EGn}1&APK=PEjXC-pcKsi8mEo-qBc$ z`yE79iO4$1H8co&8{cJigJm@0PruJ~Qu8JB;J+rGV1fXXQxQID+XWXb9VOI`d|c!J zmjNwA*7thsK;~Qpv|J)3Yt!UB9@h=7YgB})+xou!d9b8$3*9*f-8(?K^?JQ#2zAl> zE@TkjWGdDLhvCarVL;Ch?T@cXT{D49E3WBWaWHXhqh8CBnEZ^a1RhlpjHOr(tsI8< zAA@FW0yO;r3GH}ugjuqbyQVYZ6B+wQ#@c|Mib<1w8y0{=@#M6@>O)p$odb&OtJw-5 zL@8MrzzxN(?@y+o920lBNvkcjdC=4>80&y429v%{M50F1B=gvKum=tqln8**X7@dQ z&v*L~8FLT~f7cF}WkGx=T--2MmFDaCie~2l6cw0c`29PaWQSx4DN;OGg|}#G+6pL& znV!3ti^Mt{G;pOzWJ8{@4vL_50m{pRS=vd_oUQ}blX~jFSMe=#wn;mO4_6d=PNDQD zn3bflQF$o*JyYU%4-CR2!A8wj0D-Xp{+VLb#FjNYmXPC4k_6rTR_~9>ZW&~auO(DP zOPXg&yIVy4=WI~UIL*f$Z#uZ8x1$c6zZ)oVD)S0BVtENeF$pp?M~Y4i&)0QER=^=p z3w}Ibqsfr*Q;xnE%*?M*IB@-kMulWf|63bP|KASv7v^{yFY`|d?wmZk??c6#D*n5X zM7D#l_;Sr;RCsb%x&PNt!HV!bt0{`T$s7GWr|*{f0a@G7aGOGv%%W)4CVTr>dzX>< z6O|S&ZU+`tb=Yd?zzAPJzc?Te;au9JSUe+KNQfTn9sEW=@e5z=9Tm-X_?LhcGd(DY zKnBXA@lPe?n#(YzL;Ygkmcz!EIaI~uE2BbwD*8QI_#;Pb0BP%*8AM$ikgyo=?z+bQcKDr6zTXb5h58Zh zyOX4MGo@dc=!IFxmdq2Lnje}PosSXCyiM~upR%jc9Hjso`Xahl{d2k=F& zw4gKBBln!9X^bvwn~3E{h+OQ2oa2)=HyQsCp_T{zz47BUm?6sc52H-_cf#oQIRX-&I0>D>bfI0w@ir z3~>x?b~-8Q8~EB0rHc>HS-IKrXKWI$FV5u06;-ru>&c2Xm=1o48e$vW4*DRDm{hH> z74KhJ{dMm?i?^w8;tnR7tzRBTcZ{+F>WPV?>iFIs*QFzMTd-vlMf|cv$3yg@;I{(c zorz{+xhx$;WghyOo1vRyO#FroNjv1wm5J2d`7kHj|@CeY640%Rm;WF*#Tp$M)3Dha8;+eTbt z1idV-J&`JUF}eC?#!g2{N=BM;4EU?D-S0iuBNUQFCnj(H?~p4)6dlTEa5xOao>2A4oSru877;ueoVB= z1-EGpzO~GIisz64Mz<<9d_LAScHiQiUYlZz7D|{uP7o9})8u6DDA`%n6T0Xj!k&K? z(J;o%6Rk=fFfDq(%oFVy9YXgu6FZ2B{&T+UJjz~CdOWa4D8!G47TtrdqhT&1MHq3g zMCS-gl=qx_)#tEy@kdPBF{LDtY1OV+$LDXyNL0`TaMhKCjNOr1I+YhE!(*~Czd_we zR`}ROUa0G6R4C@Bk|l4YOaL*kiAZ6;aV2mkUK4x&oot1M5s_Y@mFVa4cA zfNKxa%~P*o1)6VmC^#y9{RO5-rsLo#i=L5U&kvo}m1t9wh}ec75r;0UW1R#<6lX-FR^@MsJ`UL~SYew4C$rC z2-LmT$C$*wa`;cGXMxQZQ~Yw@d++_MFi>)-EBB05EPo%|Q#f*X>&Vs>?oB;CJ@V30 zFXxtT?AeMfEQ>mkkG!R#rN4GF&xbbdGy6Mr(h)s2Hs*g^>F)&>)?Jf1x5Gc`bnGeG z_1w6HrQ!QqL1iFW5x3JldHnd0gr0eFdB^>P_vPSPd?w0lWc^#t9bu~2$o-s7_?LvW zwDn71(+9m9JLPop++M=`%%yv)_%i@KP24R2E1-nYxDZp?# zCBulRCBaK*w;klRgA>{OowOwoV8OmA!-+^ur{A9h?=ir%l52d#*vsWw|E~pkK=5-y z1A^bkj<%O&TOPLPXI~Z}>3+boCfZ;`)J!7jr0aBrFB>Fcic7_aE+ z6jmz5J#en2s+yb2wlsm$&U0GIISpbW;C>|HozZOEan9R%<)`sjawb4 z)(2v>061}Ls=duI;FtwPj_~s=fTzPGx8&EGgw_g&x+UR1Eom6pYhG_)nuOC(^PlX& z>53gyG5Hn9_pqx~*IBBEG_Wrkn0X&4tUFVd<5G}1LtBKsuMFS#axx8|#ejl^Cq%yk zk`^W55W{|m)ZH;zn(afDkUr5KR}|gMJky2rK5gtMD!v8uIvzTIl#2K%#fxUD=det~ zl^T9?vXz4pSo(>HiKzmRSg;*Lp)T^foWDw@Mr2yGo;xf=XVoin9TIQoM?W9(PoU}J z0i9CteIogSh4}+v*1;IE99ZL8P<|Yl4GSAE=QQoftN>0b^z|gm#cB~3zkv_1PY(1G zdU4V7YsbUZ`#TwP;0h9R4@9odUC>Jdr4p=h#mQQ!qAsPK!cfaihjS>RunQW`j~)OX zBzP^=J9V_R%l2|}Y{eZc95};6U#T(t;}gZhQyZTgKL6}=0&t~_GHF|&&gfK6OPVao z{RF5WKxsnzcf{^97<^n;$^ZQ<@P^x8U{#gTIFN?lMtK+hW`pA30*W&iXzXC@*6t9J zy%8mKJPIHo)3xx8}=zIyzw;MFv zoT%~;$rjw%&gmu|xNlmfKvWF^f5efnfu}I;?irrF_#06M1;&jfj@(itVL2ayHb*y? zihQ1K#KoHTc@_ERd`lyneWtz0kS-N_C+QV{IYhutfvHGa zXz0={tHKI|T30>Chmk&cH09#6uRG}8;=~SKtOH&pM7=M$LC`;Xi?=X-%XF?O&sw(= zOc~0h3cq#yzUgtqa;E*-#2b47hVE-sC;uoMi)(KcbN@pm;_C~8cFxUfUvCtgM*(&nkaQnKf>#!L1yW%mM-4k z^akuhPU_)pzb_Wewxc(U`xb2ujPT)?C*zmt#p-DG zYc#&-FE8NPWQ*b5bBlL;bJE6NeU?}s1%_9+aN|c~?*5@!axlapMWB&gLj0eI4vEjn zk&{~^6b&PO@r0Axn9(WX2Q=|oDtKafQ(H{zkYDu3p-ko86=vRG|Lmh8beC~K>ZJt# zu5!=Wo=xWg2GcY}!a`8j^1nDy@DH_s)K%UD<;-V9QvJ};PkDi_f1fGv3Op=FPv};3 z{B+{aA;gZRXSu9*aJLomsOyD?f=Yv#j?L(gYC&&B?>GF3k0l7}$PtC<_o~mn8}NQu zJOJ&NmapHdG1FzgBWR)R-sb2vMp9zx|4HQl`Y|Ub=bBQS(2n}m(Ot}b|5uC=mlAY% zQeL!ByIE0N9zN+Oo$x}rnK0FFJd&9vbI9}*PGx3LHasMFOFQ47IiR6_)5tZ ztv>?CxZUZ(?Q7r>M*81LxJE#KE1gV1K2N}=d8b#>EiDhK$!zHSDC$-YLend zlV%a*IwEmr7&2Lg;v|a{9o3hOQAw9uH&4Ae4ecdKpWdHbD)=)$3Fe(KfV9Whr#n9x z1VD2jm|H&jyQiNzbzz{7ng>%OrUdU_JEU73VkSfiGWI6oNHVTI_?H_&0u@2* zVgv92fH)jum^v6ZyKDDrtJX!(r#^}r4~1@sm}$%Ww%S~-X!kr`$en&VvuL8 zgNrRPV)&#W@uH>8DJAV@m7boEv^0M&y-U8K z^Nv{T`N!zL%N^#$cC^De4}SfP`q-_rg2D@c!bIokuyn-(0gJa#`lfiE7x#T-3lt&HCtbQ_05YS&qT3DY;;?m zRq4l}i4!K61WS{;|a9f zyr?uWVeY>(;O@#wGu&GL#EBEW0zn&(Dk~O}jCkph;Kd0r^3k`O>8uYBuc!|S7;4MI zqnA?D5ocLP{6_^%BR`~~*rt&5nKZ?}6q&SCPPVg~4gp-dp^kcR zc)!8%Os3djLz#tW0K0VFw|{9#G?wx6(s+CIbYuizTJbL_hyj1vmzzv~v!7HZOOK6j zcrYICT(<5@cJtqIB_M&9kq|U+_u0&!$D{jo*s5KT2{|nXzfUdwQLaIMV`$>jx>x+U zGx6ps>6Y*z;j?#rhO%wrW&ST6k^aSRFvdrd*F!GsJSU)PM?Cvv9Q4#z8qETek=t=K zshF2!tf-A<`DcZVNNLUoLql{&M^P|>Z1%oqQOcRZ)9 zcy0ko<1bv)tnbDiho_EvyrcmfD(3%o&&Bv5zYGt2ADnP$oB71Ee}X6VBCWI2@^;|1 znOYnhnzcM*Un{pgmnwBvR?eF8HqHnY6>IDK+>~IMj)q zM!=@df4q&Egg^jPXTqGT2!U)kBn)n&pUAlt%}R=1L1%iL4;p!^wo9VY^xljzwWjFz zUi3m+Vs?#Ad0SV65Asc?q3OAyy>eYTcxB&PBXlntL{+cSY~*kl>w<53V}}EIJJt=c`zqd?C{~L3F`UXKBRJh6JKJu}4BZXyN+B}i2^p7bLuY=VCAk$+();#_ zCeSivp}NoRI24yCdHMLj4@|rdKnM#yCXBVi3>Fzre|gUN;FGLYgfs|Jm;ax*@%EZD z?muy319~cE-6z;@JcF2cgs8g3NNm@@UTxfdT9B9@EeD-PgfVw!En01Wb<0;g-HfIr zR<{{Y#t|M-I#d+BVIpkjl}G2)`w~m4H~4D!p^ZpZDX7gG4o*(!fBWvsnme;;HCn0A z`E%0Cax>N2llr_yNab~GNbNYAfFz5=K9ekzN+u27SR2< zNgio_dtiN?^HJzix)s)RTjwUHoICl))W40yyjebb!N+>@-UlPb3OdnuUcC}l?%@4f zo&E+Ma83KCsRFI9TYJDY?O)!1+CQ0FgU2FQ0?6JKO^ZL#*MN)T>0i5>hxM1*1|Pi% z<~nIvYuPt&?Plg|q9~_4;2=hqNRp)D(9pLCq4`61hvCzNEx@J(klxawUo+Mxz})9C zt+8#nxd>$~%EIue@#U(Mv%zJZ-@8^1I7uVnA8_)uD5U6*-|p^a=3J+#TBRDAB8rruBt8Vc!Hw`{fevB`N#Ap7NO;^CKRi1Xo?87{F)-*yMhaf{oNXTt=|m-mJDwSE)GPEhdJY1damTzBp53y!xxvh1WT>Z&^ARTh zK2`EfJd`}=%i6J8A1LMNz%Qph`u%~*be~IAbe`MeLV1J}GUWe0ziPHsMij0ea*q+A z$}*T}O~5*HFEQ$;g3k!%gFGYZro6mHc>K}2DSxj)R+n%R#z=oek9dnpkn1qx+Gj7< zzkYS^)2qrwXs^({CvI;3QrY_<8>=b_G#lThQ@}R#Bcr>dMwi&t6V)d*L#m%n-!hwd z3t;X&y>&}n&uGVvSUB!fdRArLSq+9i1=qHo6VQW)IwLOh`TSF6|9!g2;=$_tbn)`J zZ%Lk6@;NKx@!=EK2JG)ktcHT*L6Arsc3G6@9eU;ne($mS%7_BprJ8JE(ZY|!W5 zO|Dvau_{cixY(PM z>ort=c|L_qdMU2Z*j{|aj+g%?-ijvYE8-17ut7$!kwDBJysVl$ufTX4t{s{Hjtl(nv~=2ug_MVf`|_>*l^8Issf z1mJjz;6M=PqS)D$n0p|!jUf>ciFh>6n=J;}Pm|*2tNwk!Irsq1{;hbL;9Wlc3Pz0f zo40i{`!n?$q`Z{v5}q$4}@+*ZFQZCP)|u5mHF6`Rmk8 zQCK7#de7BWZHTsQG`qGJ75e(Or)5bJoz`uZLaMBZL&i5g)&MFNF#2Gs9=X3jfZg6p z6p=zvVyy=-DJHWOVYBtG(g`JTr_5Cx|GaXTkFmLBrf5DUNZHO(jR8kZ(d?b&p02bl zzMb`v2(uRT01ff@uEi%_&^jWc-n+MeP>%*evFio5%!H?6|F|_4pDx;Yt}xo5njA4+ zm5I)sNrmqy6$bfq@;h_|hZ>n!pWX~S8+Mj^ix4U;o0;>vI^HN zs(^9n9bO!aj}j&kKVV{!usodTm901!kqU1#SBg6@^P+@d2y$Cg*9K$4e?8$G259$n zd!j53x&B$2F%4Toixt7A|E(<8DqZ17G^2KZfAE1JqyOMYDh#yEL8yVEr%JNL?sYRD z`Uhf&iO^#3`;#C$7&~JtVmm_ABUNG7>&ybTVPL)NKBo7fan6OVKB#iG<1)^FO98vb?ZaGY*FkQ1S@)26^~yk_3o& z&BZi&iYb_Tlpa?TrS#JA6UDfX zil(Q=5D!cM?e@`aqkWr(cyh_Lx3RkpnqMO;Wr?}{j>BtQ;W`=248YZcXSqv7dk@6- z#ciKp?_{rBj5thl;qu#yzRbN)2T{GvGbyvvH{WMD$pPU;#SAk)9o%s6Z>;mbD(x)o zm<&Pmx4ap@+3I_B++f}}XvU(ydMT1$C6MM06rmF{5HQ+;()?ao_4m^@%N!%Zm4A@yq(F`wC8myqrZTj%5=E|ZwT2q=Sx6WVD`f+AUVE=apG^rC zjQf<54Z{Tj$1zQp>4SGIujO*HEzDdku9`#DSGFoZ`x!Kp{K#SN@?FnPGUDWc$@&TC z{o-JvC-&w}2CW2vFGXvA?@}rVU{F9p-fUrY>dp9>o+oYv@Btb zV&Kd(9($$qr>=>(Y8RY2W{HpsrgK|m^`UL@S=aJ|(Z4(peOZspE_*=qyX zjBcNuD($Rb*|T!jkn9vOuJZ5mTZByBs>9Sq!}w*+fv}QH9J=LfaXU=fWJ&>qQQyh9 zSjwu2CL8^tcO5g~JonO#WIhdXC|11EdY)}ODVb>UqB3(6-O*_5l0iB<_+`WUqY>|W zx+>TYgTBxEI{qnNj4S_$b35aEZOCX`XX>*mI{n>Pmt)Yib4BdA@P_n;hJWsQBd_9P-GqZk~13b{CF@NhLkW9XZ6tu+xcxSH8=O~JeG3RRD z0gBqP^H!qLGl)USk=DOwMzW9%WEUUpSUH8YT4Wqc@5Qo^o|Tvr4Ph3Q(PyoRpnh$6@A z2m+JUmgnV%6Xo((fofCCsQQ(R5`ri_>!z~_v=>TZC3|CHeTvWXeK%PX%Vn`x;Fd4| ztM8I5&CqER{95#A9t|s5qt6Gl765k%sK<$5#E&+iM28048N7L*x^mhp3&_7iB?_w2 zz4E#Dzo^s-yV6gMS5HAMo0B?=GnbwJ6+0q*5WgG}^Z={q>e5y#kuJeMX~v)F)$`JmU0mRyeAJNUE>HGIl{hwdY@}qf;i-gH&(i0DppN!&PXl2`jB9c!d2^s#>4~>?ux)R8vy_r1KCR= zQxGD@ zyAZ)~Zb|b6qfac1=7EIHx^E4_zE5R+`uoILNp^h%V2m~sp_yb}%9k%W*yQl2nr0Z8cPp#)mdf3njve~}`Dgjpq5ZN^(-)`cXiWpdtC35dEG zRuYX0!YQ@yQPn!MfAy|?`!=TstwYNsve}`pV-Hz#lN*`gNC(N}#2qioWitIUiXDyy zKg=--?^RmW{hQB;-?&fbDfs-~3yhnv`5B>k}NH07rqN^G%bsdem z`J%K8Pdg%GO@5oqmO{z>%wgVo6grzQY1S)7Std%&E6XdffXWHjOu?b(Y4&)y3{NE- z=hH2w!jrvc84T&<&4V0TmHL^2U5R6sWBC8QHd6a9f)7s)Z8*rjk7C=FUS z(;&%mK}QO)RcQ+_iR7Y-nQQVYiZsQKlFy{wQ1ODmV8k_;^6nw<_G!VuBKn>H;h-7Y zL6DF460WMZ6`p#F^-chQ*)P7ni{N0KKXIp?sZtn5(!A2U9I7Is2@G~VU_~(3)8l5# zJ(7$ewPb8%u|^cAew60=W-~m|2nsR!H+XBnpwd}&a-uLgu~6cd3D)Mb2n^@#b zMii;=l~KGSZ2Y$SjeFROzhpi;C+3mhfZnaNWjJn$y6zo!+dheI5`24B^0VNS6JKrK zyd)_?UcA+q_=&f+76*sD{{YkDR$~1;2~5ikaAJW54T7p&_zOI+lVN!9`)h+%suo66#wb5+gFn)Q)mBhr^xJV|N^66p&J zA9AES%)G3crN-##O%d(3T5#WrB2^Jx3sX(s} zYrCk^j(&PK!ZH}WGLmF)VTp3#)f@bS!iOp|c?Z(FO&q?NnV&Dl%avIiaM+9g=Qwlx zz%PCW4|=*(QRQn5GR9s7ko`r-nIwf(wWttnCG67J`u^h@D5p7>LpdMP!7+s-6f)*8XO&Qh!Vn>H=ty!H!<<4PlGBVF zGv_(){`mgx`|dA~9*=N++UL5i_xt^NJzt?GAQQkO4v^_FWdHiYID}n30sI|w&_uh} zrIlaf^_Dh3?rOx!{o?@3kj?T8?71zD_7pY+Q0#I^7f~iLeZxkHPRn|>VJ3O3$@(_h zdqpFJlb5R5i!8Tp6-yGXw*k7|ft+h+&rgOKaee^GtpfO>N6?S_A>bw%r3a*p%27JX zEF?o7My~;xjF8EV+si@IC*I{70_mC&gkxLm5YQwzf6KwWb8{YuUQjc_QvlGF91L=G zPa-n<8+on|C^1-3ma}fa<|S};FJ``TesY=MbnepUG2pn?$Ff(2+I>H-yQ%+fpG|3) z{qX|a50o*%0r?%B%Vp1>7D3;g>N;-tvCn0o8lhINs0#SC`C*XoCzB0G&sW#xSzQ)XlZk+Uk>D)soK8=w+h2Xv9tZFdAcpDD zYO~9lTMz6G$;2eG~ZUKw;_}mX;(i`LvAZMwk@x5i6A@zHBDQ&NVNFyvsT2%Mg9rx3(<6ZRzBCh-03)?o%J!+r1GIsVwn7eo#sm^K4=B>ehCK_3$b?&4niLu*YH?dl3%GGe_h82l|w zF!zlGcpw}{e-yZH1uZ=ksTk@}sO!!|bc*4W1SDz~Vp8H;3OC-Z#l4FtZ#4xofP(vx zbF`L^{Kgx|^psjINfG3M;=i>qHRy4uRY0b1r8P^apF%US%UaEVdW6@SE*1@J=@7z? z_6dMZ!_rn72Rw))90;+&HEYMsQZ4rP(Ja8!zIvCE9$g#+SWOI3_2#`3M-TN};+6#i zW=3~^Jy&Z}<$N0j`UT!9#!Uk|gW*jJw)at>At~nkoX9MOrQzV>h4SanrYr&ez0zsg z_#9Qj;Ac2}GMA%WYz92%N|o>1f3+UZSIf>ce10d@R`)r~?=x&NO%BUmP{P44n{iuM znB&9Zk*tV>EG<70E4etDtjvMN9AP8<(B-)PKEOvZ@%iB!?6_kf~g=c*c}Z zUMI1a)E|e;N566QOKm}8SXk^L;Fp&TwLJhU?XqGuP)zQHvfCB?POAwC9aEJp-l`Vn zyE-|2az9$j!av+mN=PnOK*Bxb0>bVCckE}9z+8e{+LF3z#YN)ZOht)$kVSvzWy$Eg|a=5=+GHR|hD<OFe9;xy>AgnHmO3pZ-_LD|y(-QN9M~I` z7#;~;fW=YwPt7*ja4SAgSs0221i5-r1CIH*?L&&O6%dAC>DCMFO9(2!E(AZeE%|9m zikNql+DZg;NfyqKhn@DrQYQWc^nPv|{L!IQX8 zo@RppFUZvfnE?3?QW&lWAt{9QUM@4%BhpQVbqhM!W=okY60<`zS$}T`Otw;zctXz|zGXM;fy=JN% zJ3bTZ9L#qs41wOJRIYswQT7d5p^@5Fs~5WQG2D_my;>;0rlHKeU?f)~No~mnCmSye z92%!}UPxNe+x-CuG!^I)8lJ_Ss0M={y{OzVazm>^UpHRF(;(1dV+IfAi!XGQ}8>CM`hWZjjYqy?Pwi zvzzHl#! z83GKjL7qvb0YFGCTKLWN{A3*fpU%b=b+R=|){2>=n;QZd1}tv;0zsXZqD~%>uoJ78 zy-%hCsf`=%vd~NAmY^b)Hlhid9jY_IB7=eLL&5gK;M;+|!ti952JwY+(5GM$8&K(j z*=(U;f-o2^X9t={K`S@7s#?7XIxB*d^WajK%k7O!YS?hJBiv{)BYC($Fon$_b4Ark zT<8fGC%FCu|4bp~+Vzy0-&JBR`Afo>+tSj~GWc~4Yhm-o+z`8{L5uHKZzm4<%Dzu} zQaMSXJ?)Ki6D(e9Z`S8U zsP1Fs4PJ}lHU-TG#@5>sc-v(eg}p$01uapMbeevoZCatQ9x&jIYA!4Z%XVeOLj!DW zZOzMpSec~$oVNk`Gh3My3yzC64AOC;?P6MF-@WddXXviO{t4%Ez!#$g2=bA>EOXRW zkBRLp7n8?&d6rc%XtDKY>$?Cavf@9}mb0@U31Efx!b;Kr#a4qzfJb$$@m(_AX`Net zVuE!G!-*!TfSeCEJ(Z;XeW%px#}i-1Mky@2vC}!jftlEF=LX;z<4;W*ZFV>dj0KvZ zAP>lw9qNk}S<9`7NJs3-gjR+yi;gn{zYyIGv;@!c?zLcc`*9y25L zB$2T3b4LEF7vMv5Zf{vdKP-6-zLaPI%Nj>cHR_y~66#g05Vc$_iXs4Suo1yy4`{V5 zr%X<$ay%IJs5Y2w11bt&1$&OzPs~> zHH~%dIM!B;icfuSCjfALc`{=hl}0P#bsX=&3_Tyu(47f zUxvsr%tiAj-Gv!$z*#zwV=}~6itk|_yR+2yX_ly)ZEAW^e`Z%L?qeSllwJN70}$}; zWv}msYLrq+msvS}ZrJ`+eLAnX`IP=PHx?i}0Ys6NwAXxH@I)wBSePB;EDb<#BOu9P ze6(PVrN%H|SIl2!9*kDJWd~135d4rpC(a)HxPcV2_@3ZF*ecRjQKP-bq{4@xAk`4f zvjHA}ppXQevaK8gz5;6MPO_}8GnAyn{wV2OI&ZcNhqhIP7<)q$=#=CwKeW!K8t}xZ z=swW)_m=g&+#NCabr`U561Z&rQsb*(4{mawL2Zgh+U2t1sp(M?DH*q!eodL;itif3 z^p2dqR;2m<#1aQ#3y{g0nE}|cl%pv}8%VLo{hFtm>El2(?{<5x+ATyWSn_SuKISw) zgXhEd^iBRxAk z_P+@0ZB{yqMi4~LqTsdKuWcYth~`kxgv3<<8~t2rtw{@(J)k9MA4k|F_#)F~FkGal zbQ}3wB08t3=&wfZUc8VWoNUu1k~}DU=&W5C#E`8J=pH_6i1uc&eodM0m&2ia0SPk@ zuzpUH3(zs@v;py791#%B`5>TsgpPUk-M_y%H+=J_uVw*SNG8$I<}d%W#pHO_1fs3P z*Q*jC_tl}J+zK6>pF);WktSH@)5sF9ARTjg8#vvqoh0}!ZJHRWENutTV?`83g@~Y! z`w(NZW4KufuK!770-4KgfIK-QkGZENEhDXE!Juza-G3CU2{ye7ipoC`7ND8;ax>Oj z_|DftB!e#WKRFMbq4WI~StI-BdHZSJ;6HaJ9t@ z#`zfVDSd6EyZZKerTt?V*f1hOod3Ci8r8D;q8nj*!WRkb((=pBh+KU}y8I#YSrmvr z4_|Oe$M_P zD&Z(7ut&m$R>F9u|9X$xiaqDbtE?GjVr_8n8a{IcN7B9=;>V(J;s} zoD9$(0~Gg9i0t*i`(7>&1%KP>zY@eM%;E!KQPpCJ;f>}9Fv9RmGoATbW=JG{9cP2) zT;~a@HPMxdWPb|*eK~x5$d;a9D9d#rp;rJrl2nZ+bL+zR(CdBA^A6ONFT(&Jy$-*C z{^gD+sR;|2;GQUH@Z6!!vv}HL+6Q_mE-Sy4bQNB@Zgqbm*dtZT+TNQ3%y}V63)rpE zW@4vp5ZLtC`;ZAP76tqJ4zR~rR=aFs)X3zQwPXXA%!pi;YB81*Ltw`#1<5f6roGWk z@dPhms{0dn^F)P6*7_|PC0{zMs^W4Eb_zeXo7RCyJ(`lz(C}%d|AlDqKh1ysjPN_? z@54r{jn<8s19KJG21i2JL}%=CKSeCcZ`jS;`2_&D|0F8ocE)?;cn(_`QQ%b=t09T; zkXy<}_&h5$chUIQ9h`CxMTf+X6F!n01GePKI*{b#kL1|xy?B<;#8d_BcdsWb4k4j9 zZoMK+-C8&nC@)1o7v7%&c<#=+n>iQGf{Nl1&FQf^!8wh&thS)&mfI8?88!{WRwAUI zmg<@^!FEy(C}H|pT+IQt{F#c20M&L+HC~ES{C=_C87zI7`>_pJ$Lp39ymG}x^%@;1 zhu_zRmbm^8=nSxdbN}NC+8pCX`E^|thw%Eby@+I2%@~Rr#0EiOEvLk%mIP1E;=Eey zS00I3_HusIa15X^Y9u{ud$1pms84h>Ff$lX?&?>K75@cc=8O-e{C?SSC(7q8uCCL4 zEViq=t{dA&`7^R4@B@fAJ^pq$bcR3iVNT)EalNWKIM=yQCG*NQwn5FObC;ICFJ>tP z>y+M#S+Uv2^69aEz7aJ7bSPNCvq1TbD4mrfAD`e&Y2>ua=XC-4W#54CQ4UUUVdPmL zke(BnOIX81(pDM5oPPE=N3gj>s$vyb*{4K3O-B~G-KNv4hrQ6-1~&vUZ{t0q%d44y zdPzN&DPbUVo_sq)^@e zB0m8B8H#R5Ld~c6@7#t)947wReXNZc3G@k_+gz)8q`4F+_EYl6)0_}oun~s!6ED;d zO;U?rGJ%5fU+diR<)bpH(X(A>2iOx+J$Bw>Wbx!JGg&$u=RZNU(o3#JC{})F6e!xf_(--uH=gAOmyU~39Aga z4k;g-g68nsEOA}>L~^@gV*?~Ci>0OtqGYxH`$FK4(0!{6;9gWjr9T<~uTEH3--JQq z=Ci<2fMYC@Z~MbCaQm8ofq*bB%IEmDws{X7Qf(<}#W4S#)lE9HFs@~+X-mU(4~+_^ zee0qmPziD!z9KR*cgX6nu?Y_KNl*9oGk0G~BpcJZ2~8(da`5@E3+0lMlHouA!9vuCQ0=XdXWyR;pDepn9UqfRlwJ%*7X*DhVMW`P|pp+ZfS;SgYynxL~$Z=TI=Dh*(uSIJm(}HqG%&q<+Sz;eBu9kLKtj~((rH6 zn6in?Sk{|fyDe%nb?;b4bn;*S4?zC^E(-@#gSiiOb**M@e@BnKvQuS*_U(b{Cp~md z8GfdkvL(f}lFpK89nAK;8^o-@H9?DlOY7RxfhLc1lb^AyujF=J;D*!_DMF&iE&@N; zWjP{CRsc1!#|H-08h;eDzfHH$y_`f?Pk^Oy!{oK$TsPQG+J(*R;8>cn1hwo}efUCl zBR_KC+{G}>9NC{}KlzRYO$O>&afED5U3ijKH{F$5DVH-U*avN^~mz# z?9_HUExl3Wlrv%Z(CJ}u06>ZbfVUHPo%9+(wzGeiyLLH|p%hb*C zXi^m+h|-$qy1)r1C-+4u2s8%r0kIK)YTV$S`JC8!_Qre`ETaB|i_Q_|t2oR{ng*y; zB;;1#2y0g)B0v9c1ka3{lXI51DAd4UqL&4c6B@x^c@Dm%gbNBByH0~=o(2`sH}pXH zwILd+=La)0RgxlcEPNv)Lo2mMzr}t}iS>B#%}jIRmXb68><4~ldlrbImEKJ|#&U1+ zwo<#X)A+b6K34QmwT^p4X*f^c7~*C4*AcDvDh%;hGyf85Ww!7CmWiwpvyx>t6mYW4^Z;^No#qZdu3<0e6jr^>?u{EQ9A1n zXWB5cBZ|suN$1zb(SsZy@(;_(HR%`WBFb9Vr9{G*HX?KcTvaOoa1i^_(t6DyGL0Ug zjVXU_&3J@`07s?F$?))MUzo2V8`8)+NYTw4$Eq2TIVOGb->>dBV~qEGe7=fsU?gJ&>375v`4?!I%}6(42e5l1{WkB$wj+6 z&nj~GyS=NoWo5VaqV!io>X;EbVP7$UwuibC>*0yDKK5>nT!BD{bQ`8nj3j$4#$qT1 zB31FPKxFwyNB@D;iYSrgaF?*BU~>B0>cGF%+o ze19=kT8t0Jw#VX_B5i}{`e9_v>Z#t4Y$iw^*E-LU)v=QORd*;iu>&U}wBQoha06fP zcG33;>}MgOkEzuro*kU4wO01{;Plu`>B!I9VSBLj_37>UUo3xmJ&#z0KKRUzjS87!TjHCExg&RFFk~bxxZTDOx65KI&*@{W%jAZAv zMI%lN5GScX$OLcTey*4~{`buJ6@34Sa&)hK1#3`Kskh}BehwbYuyP=jyCO|31RpYg zD&UpI(VtUkwH?Z0?YT?XFXeIk1EXfZU~YW=NDM#Mb7F_yiA$%{yHuyjX6CWp}sYE7r2ApxcTvp+8h_rqR-9y8hFcWJ$hDiQ>m>o5^Jjg*)3%!*6H!mUK$p zgQ~bHzqB*ecB5~HJJ+$oF(x$MK|k-S?1{7|_G zhvQq&L1ief_)MD}{(!L)OO04O%z- zSGzW4V_zLVwwX4WrKI?eVM@7Q^Secxs5aD8RyTj6n{%yTh9&XB4C86mU>4%N^$LUJ_uXk4YTCIb2DsNlTGISW=M6C&Kn9zauZ7GvSts=<%M@vxnPl%!3@ z2OSx>*jv_9mqri7#fQDI zu*Z)}iUu-AwcWJiPc zRvpSr!o_2jr^mIk6JbqLV=JXOiinsXpPCCh;dhoBDtz~UlN~Eld^k@Z8ljGcP1# z!?Xk4HJvu(XCUX5!aw(|)&=}3}H;|-gG1ag*f^5`#O0;CDzL&qXz%*pd3+qJF+peN8^U}lMyMw_1$QI zlvTlLoBTB^%$H@~Cpvy5{~)Y<=XS`WfAnwOz5P1<8x5rPMw2G#i6wqcOgM=HY2awi zKp7fR8C*5g;yQxDfdih+B5M2!51Y1f`n>Y!Y6H?rJ5@wjI#$;-aYyFG(MXXz zs{fvIW58J{4haq*X3=Q_4TPR?6-%c%s#)v?hs$g`CTYuRMBitHr_VKQ`+xg9|MsE0 zMeeLFKP!N;*>99yjc`%+wKjNbgtRIjAp%UPY78$B?)V7OvuAweSIdQ55-`;ngF%j^ zmu?pG=bz4D2MHf4&3;G%ge{=p4Fj((M{8B`ns%)0Vf|&lA+r$1+`Vs(0X>1rA0ca< z;}dQAe$2dQRY@oCFH1RLWR>3Hxl(+Y&%s7nmTSOI=NYz-e&I&@T3NV(5BO{QUhDYk zV3+47xlx#QF0ZQ|kA?lR^}o(OO}T8t$Mg+Zc^UnP#jvoKb0aP~=2BwIuz%?uRA(Qg7@1n8gMox z7H1I{s22mCAnB)rcQqn1B-SN>>oAO^SQoT{HUdpMu8S9k(FYESi_EeFFzPdJoTH~S z`dH3$Cq1F`hbz2BJ97Z3Mx5NhfKmwKtl5t<%zcRTfKdS^CLjy6c?W5(AO!G}ChKOd zz?O%s`6OYGcnl9f=R}jZk`5fGXG+)q=0HIS5L-fclOUAspHonD80s+W0%*1SmvmBU zZV7{}HZIv3v2~y(IQVg1vI(aS1x8R^AX9=B%?qT+2-K9mmT|MUFKx0xf}iw}fb5m` zKHRl@b(tQI{cE>+2fey8MVAS>jsNEM)SJ8w zRZ5WcYS&UwT({0$yTe{v%HBfX*b;35MyX-i`~wl);`rDr95dDaBGP{)u`8Wi>x@#j z6)#{)=VWadSC<%y-NAVYDws)GsD@{_<#0*FlrArYd`$rpmlnOV94IVVo@tL9Z}gz# z&M;DyeOeA$JY5ZLWu14DC!>p6yKOUkZ~snSX4_h}zAruaU4W}|T%r5(l5Gzq>CTdA ziB{@<-#7R&?Mw;u>b%nup1Bw1_uz>gud}lfZ1gVqkxDK7AKfqM0(I8qIr7#^b?w*> z2uX43OQl?`OfJdo`yt~yzqSmcX|wNyg_1aaw*{RN`m1aT6relxR?6~0MY@nw={nlS zTBVR+R^kc$D-OF=UD}hUA7)tt8H?}kHJW+XFM9kdf2UfjbkY>V2_=X&rYTDl2GMbE zi?G*ygnaIa)`n4cKUaPiON0h6-`7z`_{LHr0vk5hhSn3+;*iU$x-3Z(ti=OdF1baf z7H!Wj0drkd1M{mmiqxf;9EKR!&GCiKJsLlN5kCSn>cTW{B!?@D*!?}LPXVGnr5+vE zy&n=Yy;d^Z-&2lY{N*Kmw`P^d6xis)$30vtcgg0!vyDBU>0S-B^6jWLJSX%NY5is$ zW*GD=LTF53t#`&aN`>tWcCCplT_(-usm|b$QG!t!kxm2oRmjoorrpthMhpI1_iVxn z_Ai&9v=`j9=Ql5&OzVQEm0{fk#Du}i&RAW-gM6l(4LJQYeTb~sdv2PYaLzI?lJD8B z(!rHjVaBz&adO_}vtPiDjGDm4lrI^got0C^6GPjMBJ%lJki`T$K2n!3XgLzxA0}n= z>o%M9o?N;kPIkL0b)*9!Q&?3r0={=`Iz{Vr{v-{Sn(eochgC9t>fo;q0922?tfMAd zdu1pl`i=bbF+dN@P^s(G?Vi$xrTAg|xOrVBe#=Q6anqFU*ZHn#j`@#j_DhHjottOj z=n%R!^n@o8z=-N{@D1z)<;jUd!O6m4UpSf>$1HeFJs!rNn^= ze8BuEd?WmdCiLkh$ao^ZHm<>=+9Sws(qE~N_<_|W*broNT}GuXtpRP(?T) z*$p&3dP#O*O|Q+nuT@xs%&b0XQ`9}S9Gj+*px#?GAGrvU;ktQ|+@B`8PG1|;oclMC zk}%df5IZK|;hyx;k8&d^#$nWf5+%XW>d{9$`CT(%(9W-J;<*^Nm#VM9cwqv2A+P45 z`)01A2My1hi5cMNb zHSMGOn7qk^yK6w`k3-LS@tb{S?fY`D4{nd?gHQa&{L?(}{N3hcS&`2smzJdHS=W=GbCrkOBT_A^%O|mMMtj;yjhZjh(P)hCrK4=A#Qa{wy3Zy@!>^JGj;73tJR1Tdh^bd36lA}Y8 zxaUM4*m#3&E8psfG&*L#`6d(BtLKxz#gQE+q?_>`iU&n=U~xKG($=M&*c>I?AGRpU(0)SQbvR)TfKps?)?>tf zx@@Jw;D7SY136206QQ$X;q1swWBGE6!Ew`E3pX!PGpMz>Tly`oIzdTR zPEIb2iT9Am7Wo)NBgY<_=<*uHu1KNQvLw6}8N93Lt{^HS^BdQ!_jUW#Ll#R}-M!t< zEB^++Y71ov)s(OOQp(}a)A7hDBHdBEv*WMC!QvDVfd@zjFGjdBQnl1ysP#ynU&ZMs zATAs;O#M5y5Di5c#)@iVm)#V^moOXQS|NW054~bR=nNkGbrmlsmlV{Ys>v{pstLptn6*( z3LR3elh&;NkM=|JlcQoR<*cKBNDgx8A)+t%T9^yZGcqs3cqseq4V;IK$A@fr`S9={ zRn6|^vCY5hj5@kg5c|?|{v$DlKfVo=Zu@V(Tr9U}eL!@UeZga?>gG`o(u+8X)3WQ#E5W6Em5g_HXpeDj>+0u&7K~P98)kC+v(FFZ1Su)etHT*Ez;XK@4r254 z5`UmBZ`sH211%qq_V$r$9rTZ_dC$(S`>+4z*!_gXVa|HCFI*QW@$EYGI@4rhhDhzy zxAqn`00M&a&r1&|X@7rrGKdZ`x~14eB_=!~OJs7N4DicR>W;l&Ig`zL+(;?FuQ5=k z=iJw#R}x!m`i7aYTIboK*BHV|pK(M)$Tp*>%xscAgx_!alihr@sxEYC(dU=(0^b>` z9$VKS7vISXEAlE|X;-*X$c@RH+|{1LNp}vOR|kK!^SxCb`n@u$gX36SkD5bFv0dFi z7yIUswebhiF2q1RT$T`@n+Y%*JYXIm(g2oALqn}a*Qe_0&-?oYZYx{2XDho%Zu0FT zb85-i*+GmqBaE}N%G%BU&d*rh>03~v^xZ-rH}P=dwdfo@H(y1OnEc*$iYXOhYUBkaQ*=^J6&yb}}-)e;D zwO7tDK0i~=d{$C{h~xbE0lS2}Q?uS1a55s7wa+n8lt**XAjrek&qGK{!`9$#oM+Hd z#yXMp5Vw`YVAOEdul=#sMv-ZCONSI5U`~0s8RY_-(Zh|ZvRGHf?$ts6t;k!G;nfbB zHR_uZTKJ-yDfyih!6y^!sPbl^=z?zbjH{=1W`sp_RrHrc(I!d{3PqxH+2Jujs7HG@ ztToP$NdD$GqRBA+ekOv*;5h2fkgy>u(Q4P?X7XNI8Uthr=0;Uv%J_c3VCeM|+evk7 zfAEpd{;8VrXAXe4UT;1ba%)(1mk3m14Q#7)L5@^-&8J<_6MdWrtU_I zJZ%`VnuYoTrw!&% zQN0?iRzBd}s==6(L=)?~iGAxdIVyRP{i)@CY-mV$2c|QqHM?DaI`cFkHVN75rfHt^ zeF&1SD(m`iqV>7YZmg>xrps-!cYMLsd=CUVI{m*^?ebxx?>~G2CF#glHOq)txd~yN z;76=C!3OIw1~ADxIuBy*TvbR&76TcDf*=-?lBc!}7eG>M?XvOopB$$P@|imvwz8WL zjBMW3xGAY#j$gCNx*7nMBL8PGhrC0^b>I?onN3AJd{u4g0-^(5A z{`7=5R?OpLe5Kxxsw-!m7akTKTufwMhy^|QqFsswA)|ppyx&1RVpG`M*wP z!GE1h?ROQ-{hJ;45uR~>4sT`Cmu@m6r zE+xOLA=a^Z!ESej#+)~WhQ)nMCes?rWR}&+Hu^wxw&w~%MvVe&zbt>+_qP^P5{?Tc zGsQpf!1ypM7h9T4_evPe;Vnnu5xwmSj|sZth6B*6Cd0kGwD#5)DI+lGF?!AAFwnE@ ziW|N_cGivX7ENC_=E0YZ_rq`h+&W>#g&T|Letz>aR}efM{L#gvny-^Wh<0fAGcD#X zmJP$zxCD$n^^mc7b|CgboXgjzShXZ`dyODOYe$cr!?3s%w4y!07v7+>r1;>JmK8^H z>Tzub1xDf{Fj64!ZnP#pN&REANQcR~R5BuUaZk<=IZ;Y7X zp?kcFX*a&NJ0>t6Yi>7FJL@KxI_nl9Z!lARvp72)skKgK6T$^I+8+~254mhx6?Od9 zS+3w*g65GYe*&5Jv{!e>M19?PA1QSMaq}o&H_6L!PUe*oT9ZDBmu;prjmxuqUr#c) zN8jhT3WV>40eAKr%;AH-YYRRijh9V=94J_K{X+lct%iB;+vJW0oBnQw{Ys`Rj}|JZ z`SP4V16#*{_fc2?XfuE^vLa$Q63`>Y=PvfJFEAPuDOG&Na>65=C}n%;j`~9whyc~w z2(+E!d^nlG))>nIqogeVtY}JhaVDJ3x!CQw(3f9?!!LRF!0&Xo-)mCC)02B=2a4cq zUwne-%-7x8Q`s6pjc4>DuhCJNyQ06w8q9%>jA~c(?MG1$ERt9NV1+^+>e929Z%uHU znxSB0N{zW}^;7;>mw(FTvEE%?eZ)lH-p2^xAZcrL-+G}Y8f*Wz^NU}mpUF})_wa(d zakXzPfU_zf55O$w9L7yc7E3(3v}a!q0WaJCez<&x;Q-c-biRn_= zOk`SuqNTCeR?rWg&>%((N5ZVzT4dKT-1<0kk^bq|a0c@q{ccz*1bS-nBZ&k9%v~^u zPXys8=%4Mj9(;RRAH>Dw#Sb`ZyrG8nWXv< z0{SbJ&dH*)Wz43M-;}l2+CXW3J+C1i%UYrJ$MA~sU(V`FO+8Ks{Lo-hfR@5hd{1ql z^vnBU73R>p^l%@k4gMnX`Lab9!`*9|VZ<;+1*boob8Fzt$X9G%KNi+%?gM=Q0pgt| ziJr;0qo=4y4@R*YBfdTA0&CH{19_e#(QXaPuXj;&&(wAWXi+Z=HPf-Wo2rr|@eYS^-#yDnv`|K(R;Ee!sb4V?!>O4nIn(66r~ ze%-q@-Uah6x-D5ye{X8?(s^3)QQKTCjFK_sEEe)DcmKN667}wq2 z0`7-nMT6oyLzb?X!mzJN^hp5;vtU_~;0)v_$pZ|BeO88-9=9{KCrb~uNV7qSQ^SEH z4-(fW{UtMyu{Tv8-%{lAl%mHu)p|-iC>_?kuEhKt0!#2X#!nPwT8p8=+8Aug`?IubCvSuW%i6dAg{bgZTQOGc zCcl#6G>Fnn3M;2wMd^i>am1m&>H-1IaVZ!2$ZDv7=i;ZtNYD$Z5DAuOiJb*4}cexhD`mg;wbpp$DRognyw#NVP!7@yjGUAnB zt@)OYsh!U?ytT<=<%pL)!P-|PL$$taFdDA@XcVi=>4^5DV>biqW=~(64CEL$6My;> z-KNClC1gQY;@C&rN4rfFMyS8h+55Ht46xo?=-a^9Thkd14bgwb-};ec&+`IgeD+88 z?U}}(YYfVkckb-O>Ikk?2!H=ZS4G4q>N#9-h{OmAM}e$h5E%?4W&&_a1s7l5;}`7p zaA7BrLXuuyL4Y3Q!p|UQ1n_T-qCXqtC2OmOZ+IRQrcA+WH7Ra*`AU)!xjOV!P~UO$ zx!$4@TY(?HviN6_8F`6U*m8rBD{A=8G|?l>{Eb}Rj4(rS+!Jy)kg99<@J5jQLENv_ z=&UgMknCWQ^4k5Q_cY&Vec4nBzkBXe-%qr~PGe5l)p*xkvmO2ewT|#2<-R#dTu<<8 zfOwT9#GyYq`_}aQ2?uQH0TLZ}ox)KiDgOLUjY()9%G^&sQyY$z9o+-Hc-2*DvG!PY zi9crfyL*fjK|dkqf%!5EcTM55YF%%?kp;^ar<5G3GOkH8QQwBf|HYVB2RMssmEYgm zo7kKA_RcQh?H)_+!Uof>r^PsNug&U*ud?~LM=u+)@7@na+(ouj=k=hx%vy&%RQkPt z-A7>`t6ozzdU)SbU$u@Se+Gb(r}Ud& z3Ii>?Sr!#Orft%(QhVoQr{W#@7WhWydVG|z=5&JaUFD0^ZQwS zJK!yP#&a;yBbmvWmPlAf3Ej_mVHtvR6Zl-@{8h&-cR)*vs5Q1Ir6`=NoxWlB+-fiq z1dT@PqvSU7;$9j}%f%I1=U1C5aT@m*7aQV-0v~7M%XN}nrKN+^G#Fd8q>5t*u6HA4 zQ8Poz>(t(VCyK6nttIc?7#e3D6zXZ5F)s+;xs9A`aGzB5Iy7yvro!XM8#5oSXZfGa z87evWWWI7@Z9dLU=T{Wxy8Vg>cRoqadnt;C6;Nx&)#bM6YOL7VhqzV=Ynz^>)Z!Wq zzbb1`2CH%m@8*1hYPMxzzWfXu)R8o&4r+c%eBwz_Kg)cq@-<`|;Bz$$sTvUvwadM+ zFjfnhmmlr`DN4!)92dXOE(f#OMCov8T5fR|kGvBGjV$lmLQsT0aDp#+m3dL)q_WNA ziqs7q*Q1fS&-A-t#{n|Lii>mi!%@i}VOc2axKJ0y_`^(C)-2+C?bzleMsYSJ^XRvN zPkj_RbGfXR_G@h1X|t-dj=6$wR-91AB%ML6HGU%s3`O$kL0s1>9dz6yAvdmt&nc{R z4*rR=11S|p{^*-2q1M>nf@pWPk9(t*a164K&(^X`rR z3N=7-`_E^;j(OCbM}c`X`6lBDS-CydQ)jV9TF5RvJs3P4aB1c!&Y`X3bQJ1ki`^z> z!*dV&p8UleS8lGlsQ43KxcX54--15zPzA~c2THKhM3j%XLX;kxdD4Z@QLp%*sv5KJ ze}0WGx`(d>b^qG*?It>D`3*P)>B#u04=Lw5WpJU)E!1C!yr1p0%BbEOB%e%~Vd-!mp(R+({JIsiv|NNC54k_hlO|4j zakwMHnUf4=nboT!KHb`nztg+Hutw1{DLIB=XH;=7$(-|x zN>6#7->3Ew@uEaxX6Bgpqc*7$_5MT&Vut$sOpxj&)Hfz`DJ54YWla)ysW^z!TGWmS zxyb76vo3<7j`zr@aqJ{b4Pm$3a*ZJ@jCmNJ)T(ty|E`Fz3@izzQq*yuEC{i%) z^89DZ*tREo+Kde0lX=9OnJURw>@~N!D!8pS3SS7_(<%*c(rfYB6cv@ZHN)qYps|SV z5xoIqWtN==Cbpv)b%V+ud`44ZwVBL~%+M|h`KvPO7wR$A#7ypp1@6ZiogfQk3qvCH z5k-&JcX>e4Pb?ohXU0oyA6c#}{7y}w(w00TlBy#zjF8oY7J(CR@ig!P45&G`p!Je zPAT6p zjx(Q5URXla*{G;RJe}tx77A;`6}w@n8QUoFA3%ksMKKKto33L1^I!c+?xcq=*H3h8 z2(QiXU}gL^`eq=Q_CjLxOVW1}rkU1LN0S-22~kuV4min^+uE88Xw(c(|F!(wwt1c* z+>edKpnFVM8}Mg*ocVj4QI&o0S-f}U?fA-WtzQjx^7o0eu{MgK=X-|m!#vy@Yd^E8 zX~B`)4Svb3K3Fwf%nGH<+`EVO6^3yFWqucrXYSs}90eZB=#5kA9pu};?WuEFU44{V zY;sZbf2n7H3Uw`5l*J1hoUw@(tbfj6;`Us%3 z62IAjmTXdGKSi^aOt_p2#4gz=ab)5A`PH4TbzCp)ta`_)qgZ2+>e^zhV2bUV6_>_k zMo!8eNZ$Iho)XDxj|ge)r^CJZvxUUeZSP!LcsH$qO#Qa0)cKy@pg?8d^=#wKi_Tof z6{G}C^|5DFl~pCIZ`guB9M^P2b>lDfdwW-T2yG5CFB9NNt7EU%sdJIRcTCYDEx@AwCnY;3_5T<6 zov_la+;_M@F$qt!u)ZWT;kJ7O%pG$-+5-s3wqVCvJXx$ScSO~!Pu)Xvt({9XaU8qI zQpA(I^4HAh_O(0jHmpu^=zp|LGpD^zHYt)X{QP%xy~fGloX}&!7o!~qmItzkiMb!; zV1=a#aKr=BxdIcDhzCo)1VYYdO-~Rg+fdRA5}ne#cJ=d*Y4yLSSdYf7THHB$zKUOq z@pIPEEv(RNd-(+?^mz-2t9#*s$*-?{?^R%Pr#PBN*)1hZEHF{D=b!oE`SF}Fki!K6 z4Vb^6W0=DQ9!klI|JQ)|cF@ZF)x%Ry^zFLtA!~;Zs0tfAda~p%v6nMy_~cnHMSb-d z&Do&cvQY}x>pG?d*o>QZrLTswQ*iR$N|%o-@cRFnqXumTs=Y|k-U$CXyWs=CnPS79 z6Pe4|=IZD6eJ#m%zHW#Nonj|{x*W64APV#rgbV(ZotzBb$)hG)y$m(uJMwjzmXUKk zsZO_<=Ce)hFpr(YwF1rW%D@QotaAmw&`duK^2WPw?lpYO=1Tgp~Fk!w-9^Zr72# zG<^8-Lh{o8q3X@!q5S^v;d{)O84M zYtU1v{iIkg%h14>^I2JI*Vfo7aV zDc^G;8;M-`B7ruVDYOeX3PcBWxn9Kc+TmWh7c-{OF+7$LL0*gH@2LTy{-@;BoJ$D8 z<-9u=>mSPD1q;y8{6{7|mB(VpRxvtb!(M$+Ia4gxWknoK*<>Y)U4NUUt$$uqyI;`ydoXsfbWW;Wcf3Hp zFXDt4HRh5N=Gj@NxR%P|7nX)fXN!k59=B>7o?!Bbq+ES!9k?GpalC8FzbPr9@YxJe zV~D?$>4sUfv{PRF^yXR;l=A6`%$Fdb5`i;=){5ecX8rtB=z55qomKmLSyJ)^spM&G z!)=~r5ot&sh9a-}{K$}n^C72a&x_ZY7u8OUWo4F^k2kjG>`f8|EZU&; zM1j5j;C$5p!W(a<`FqOeZTn|-;X~F%)rs?jqrAw0bnaJSI!c;Wc{KGZr>jcWo7hSH zf?Kj73AHhdZ=*_!(J$-gM=psN2B`X;+S)57`zS)HE00rw->A*B>vq<0E6vt`pW!>1$8)6y{t)#row;`%dAePIo?2KDX%k!A=_A z?ch9n1aUXUd1RJbOEGy?dGffgK=qO!~|tbmZK72~`(p5-Wk6Ls}F> zEhlp~W)~K0$tZBjzx$?zm%EF3g69862DL|%TLtiiTKSEI+OGx+7XydHrff+P)${zV^RM)SV%&^&ZA!YkxeAtisJl40EdDwyURJ*BUc&<~aAfr0{x6l|Z%m%0gU{a~B#eF*jJeKko= zPSzK&-KL>2zZVt{f6-Av?h@M?`r$ct^J4&Bcichg^h;286)K9?haL0;f9oq2h+g`0 z8z3~Gp%ryd$@V~|iDW^@+>Rq3m^t)-_kHO$(&KNNo33LP6vX`oe_n1M@1C3aQayf7 zJ?G4Dz{x4Vv?z#6{6YEaSKG0sVdC}69+Y<@m-M=FJzhB0mXf2=+&Olwm8I%92U*R`>#)MN9^XP?7eI(d4qVANcAEm*Z-W~ZsMu1%C^ zzL{-OPxy1nNqX-o7h9pA_l)+);O6-@T;pZk>Go%7ag-aQ+^^(ZVtHz#+f0IVUmZuJ zeSh-k%DgA~ykFd`z$-h6kkZA8kE73C%?|m?zQ3$j<`7$@${z8xiO>m~KG(@^7}N7~ z$_|>PuJ2xdayw7EUXj3E`zxSsEN-rCmRfq~KHt~KnJ#Y&j7|PhdaP^SQK7q4%#Uda zF+TG{se5OhfdT*xzzEt?|D*ZlHwUTH`Fx2fHj*Arf8W{ad65ZKM}lXwBUG()lxj5g zFBI04=j3Ykb=hA#!)yy063*)%i=P@9sP8#nmdU-_`|x66S#;un(&o!)w*K<-@i%SM z;H7h|xDnsO_n$)>&42i`zWmpwyG&7VD13S;zb5D(gQJ*E#Na zzf*5X^=4w*vY*z+qukL+y)WsSYp$Oz$*J;-ouj@|>1$9Pc2`@zpekx+VsmEUyd**P zh9_q(zhCps!f9=(G4ZosG@J9R_|v1RM2#Ldw9OAKTgZ_k&%tH6x;nS^ijpLy;kSmT-$;EXr(({%HGlsWPclw+Lif6TffCzCK|EQ zJj&W*_O9gO!gw8-T_?$3NUN;3mCv^L<6w#-?fzgh?B4&E9QZ`O!vm*25``x#&ZVes zEbZdU`+D=Gg0(I>2HT9eeagqUuk9?wdoQl7`h=x!-9Bb&Tvcd;GBsArKl+&+Fu9loF0&AWf~wAo*YSi0?aXzSZGt@y=7RkZ}9fd&D8;V;Tp&0Z#r z$55EDVY~h&F@npvjsp;6AZdNPvX~`O0d}A|i3od$^t-JGLGl$p0T3)NRit6k8Tb|$Cb$-%Q zo9KGz*5J$94>OmQ*>*LPSAAN=t!(tMMr`-=Wp=@dAA}A3A@kxxA5Zf_2W<53)m+N> zm~4W(^|^?D^VF@K7xl1^$6_6P^J?w7#6Rse4F_T09_**@iKh#F8p$cm)z4zoCgMkC zsKI(OqoLFtL*Ji7KCnBWw-R%~-M_sn5H%5~v$%5nL$Jmy?@!85{RIcCyD`p3dOb*DRS0QPNXwy7tp{~68|gg;Dq2ey~*M<9XmeZ8gdp_ zK7P&ZmuC$zAcN1@zseFc0Im2@d*9GH_epdO{<@(zbnxSrzVF5gd#mWVRtWCE&ho~K zq8`$3dA4vai}%z_YTED2y;QH5mLB@Il4tgNLT|lg{MWDD*GEy7q>{dvmTNP&zbc#D z%gdJ7w;oqLl#r40dz63n?@SDvz3I68NnLJ7havq-^@*$5A9+tr2B69DQU29)>adNd zy@rUMaG*~3Qu*J!wvF{tODKv(+!+#vf)q$w{xTT%XuCF}_mG-uiZh z=P-NuIwrm=RXn*i9`QK*cry!!-5-X2#%n+#C9?AqvyjJ7`4#VnPe}VvQ%=ojZs;tn z-{=$iw>DY#wGB5^M3DLO2KT0~|J&$sy>h>bO^0Rw-78k^RQ6`|rVl7c%q1HLj$u1< z?&h#S(L=+iTbs@!T%xXKjPG|j*L~pMrOShZ-T7X&zf7)_XZSWQHb}?uWl(t~LXRD9 zj=3KU@EE?ptia7(oBrS1vO(g_?l`7$H7_><6%+F77)^GqIAZCUeE8@nyBlGE^u&I)!@FRMDM`e_$&LwDpj>E~!U0!M1j zx{dZ>txP0y_e9RIPCu|4s|gBobs0?-^%*^3_0aYF+2Hvl z_0iqzvLL8AH@6}fQ*(?wB{~1cE=r59zdU9;}_xR}Rz?-25+201&&vg&5*;|c1&I>8r3Ds3;kDo+c z99S`Pi|ab}o7$=_tL*nzY~dH_UOiuxiqXD_Y8^2NjhTs&H_0trKQf!e(@Pt&*e(%$ zgIfbr;q$8IT-*=|vFaimj7Y_Zp@)mC-JM`v~;!iv|wh)SJjxwFrS+BfL$_PJi>CgL2#S@LP5 zcDYO={BH#AW@6C8ZdR<%ow3%uJ6WJUp}X^fkIAPrD{u~s=c#S%(+jjr z>VNd$Zl37FB^#>a(AbSvR#hJ9?tuHHYE8(C2A8e!l|Dqc0@cakS4z2_dhUhk`;UbNmx^Y65?n&{&$iXhS z2lM_1gv}DycG`BsFito?AZADByo^$q>IMQI@|g7LmI%MmPZ6(@g#_Ps^7;NzeAf~c zhK&-ho|b)hZt3&~%~hkFOXD})(xh+TP>mNj)N+y7TmGhpPhGGVJh-IEeIcO-!4qiU z$RSyx9`|4dXS#oW@6Goz^EXO^WaS@_k`0IKsou)R!mU3dAE=zn_^uLx&Sl@ST2HPV z+>Gd}9p2&F+OeSzu_Vg9uD{CZhLXSRPdO=5Xcuo8*+zYKA!GGZ-k^l=;7G$B%X@LH zqGBoyMWPZt0=o}&D%X=U^?u}4RxZbz?vwW0(vJW)eiL&^>&MQpXMax?-;DP7eRZ{r z>$=4|3mC8A;^1NRtmzF$=GW z=|N0%|9)pQvC`Btz|&*v(h_1d-s5;;MY^?W?f#gi(8QFLab(Jel!*EDT43N-cwG;a z@rQ>7EA2+0kJ`-2dUWND$j*p}?HhTXk~$aqzJIh+V}8$RwV;N^Pew|Drv@^=bBQ`% zN$%F4n7NY|C*tXyU}NzTX}tNj9Aqse(NBWypj2g0)YhDO>ha^LypbX!k9bir0sk2f zg~Dml!ue?tV(mQZB8ZLtGe=4~S&ZK0yDHriV&d`_O)fj(?{P)2jXjSZ%kz9gJ3FKt zoA-Ra0URrm)(>j5_co0^B?N7Fq<((*VCdh^pi`Tn;RyEL#H{yLNN67p>FJv?G`D2> zVl>7<CW^`=BX?CrzQK`ov<=@Rm zywU;{Vp!y+z!gPXy}i8)ew9uL<(|iTWeg>D?i3gJG52*sbbkNXyCRWX%9PjakW#dJ zRfrY7%U4a(d2fhxkDK-wPii5cM3&`7DaoVbSOorT>gczts}~~TcG{k!og7jcJkdb5 zvdKApI^_eq;us&pEH?D;k;r(8meykW3lZjigu%l*h@VU8*`|t{k3&4uMLi;BJhxn7dFNK z&=Nr-!$2PelL1~Z6trsfHenz+Vv@mPPmZlP1*z`HLtWu^91{jgVmaxZxqQq|xg5ni zm4iMvU8yw6x#!s?QdIiBhx!bp`oc$_-N5*_-48=bsH zQjgx=OBv#FK6FGzkzH`(f`!P(ra!n)z>S7ZOF~3a75^bj0mxSJ?19nRoA^z^72l*< zRrScZ_9|w(Nt`}$-Uw{~Iv(8}2RKy+>qk#0xAWlHHTAwGuNZ73OF_rSp@{cI(mZFWCvwOrW!~f;zDE#qj%8D(WKO-MD{m!+_H}P|; z)mUnHnIFMvQN(Jqt3pkBk$10cb^2US zUY1MV+C!SYz%2E~ZV+dcWo+u{%r6dhn=vS?L8;qY)*f(H;+L9g86uP)6j(7%|N6XF z``G8F9`+6nxe=~CYU8V7Ji%i+imjTnRLhI|f7YJpjM*)EY3q>HD>I}d&v6?gW_zTt zxWq}{H}EN%u9on?(8YmiwV3>c1#L0iL3UCbd);~D$KST_39Q**kI0C+!g%fj!W*Yw zc{#dyJ3TlCR^H3C5&*?Aul%AsrO{k*A-WkNNzst3!o~)so`b`S%Cy2v3cC&WCV(O* z3%z<&`Z@Av%^{k_7voxRFF3a2XHA#B;`4`fRcLM)lkM_j; zA*;a=;_`+42lX^^bKy6Ne(569^!eq@$hZ8z|5okQ$pb*;S#lW~S zWcYQpA=0gfEVkYnz;SfSBqLl{p@H-T3IaJzpf z`r+>D>3IX%S>naJ_N_=Y{3pf7+7;OpYMs(A7`=D0>T*+7*Nv{`bFB#vyNa~BEQ4zY z><<5`Wgn?%?Hlyj$F>vIJtQ&w)?8WS?)-iml)R412ctO;4)mOx6TXN#M<6+mld|dU zs2c~5eULg9{#qy_=uCOg>VRfvQ2oFd+C@F4M71|)&TUsAZ}mj&(D$r8VJ(YqO}^!E z{uxV5*ZL5?%X_m1^(sf5>mAzPE>L4QcO7Tt z%DI99vC!8kRo=Z-fKG9z_#^Gb<|F*~);|P~{T~7Ewe_T}cV_GudApM*JN0VW6WnxB zg7O@@SKIjxPwF|3i5pEcjp(N#IOjQ6i+nMu`1QGTlnbMsoa8_A_wd-heb!%xjkvW( zX5T&Rd2n30|M*ar;k&qjK5qf;(D^~OyWdO`U;$y@T+3P1ND!s$zs63vsTDUX()pC~ zEm9&Om)?c2v;Jh6Mdhu2ZMmzfKPjxkXJ?L1v#I7vQsw%S9*N!3ldg^W>tYR+wf+AV z*Qp>0RXMWxtnT@iEV0)fr#|O)zv#LRqYIIBfAM4FjVN5xg5Juliz|87?}4VDQpNh) zAfqoqw;QgvnP|REl877mksay*PFv1vk6fsp<{}1UDX}l(z)6xy@fOp9`O(C;_C`y- zAbJ;8RcFsSA}$K|d#E}7%edRhF`KT$^5}#812fY#!@G|Y#k>7uEk$$!EpbhsvP1fs zRu_G0mS!d**yCr)_(q667q*fL~$|AU6AY=V5=L)du5c z;-I^M?AWsMme^6AxUmqfN#srQg+dX;WTe|8hX@IbufX`y&JJ|HzQ+OoDEtfee%YBf zi4&R%_30xU7j1DdK079pDkb*dK6L%!YW8g0PKmA6dB`(Vc z%k#DFfny%=j7Z(I?%x2xx!7m>+jf=?_YSf*Z-1R(gYtx=2C38-n6|gQC2T$$x4;WgccHQ;Yo~@aGZx7lrjvWJAuz!{ zYrned>Y5!-DX&Im#H1=_k|)&l^xD?fx~Qe|TK~$FQzDu{KgDIukw07S3|d7rcaCJO zx4#>>^Kdc7r0+q7UT2ng1>?&#Z|b9@ww37X53;>m-#dn84sJTA%CdLw3uCwU(FKB2 z)m(RbYg+NYiR!4HdtW{B=jHUifWQ-NL>}tX&CY9AdCNw?!f+7{?<+s&j(VBce<#&=UwzKB#koK+;9C@@o+1`;6uDd0cXNL znv6r0-B`s#1}=c=tg=X5OXTK)v%?@zoGG_BCOo%5Un4?T-ya58*$l-}k#jpyey z(+Z_F9T@LxK5^mwi?ZX~Y^?k|b6CbE;lP);<7)I$8+El-l)v%slvLMKZ*JHfwMh6_ z(V<@WT2=51+HvfCnSTVvTOWbr`+0wy(+YVm+M3$@Y^wgmo9zK|K~L^LyWs5s3V`GJ zlI=uxhr}@)8dL=`>Z*}k+`QWJ8YB@0gNKIxhm)36oBce95}dinBJq*a+etelg;7|F z;6gl(1MnQ~sFa~`VZjydbqp$?br!lxL(Ji%NouoSmIxTxxBQ_Z)kyMAEY>^NSA!UU zgIFXV$$BHC<=S~NgG!-bLw{kx-!#j$fufk>Q3jIo*aOKr?a|{T4}FQtbG{NK1P&_) zG-o%#6!siEPS@Z+jYEhsL~+tb(CN!53Gf2sdu9`Gj z*WL<h2nxUb%}^Z-@(&q42-k%mxdeE%f9IBXAl$+o#+V+Gg9B6qBN%8`C=Jso4$apM zC>Ov5dqAZjfs;bvB*VS}RrvZHA(e%H3tC_f_gd9O>;M@Cyt9-lWNZ{Uq~@5$DkP7w z((xtmkqijDsQ?-)a`)u?!UT@-z1l>)l+$#>(Vc*v0$tbC1=9$El*RiuChX`8?d z4RBnjcaDutTb>fcFze_W!JKG>2LXY_3HOqcqh9ONAVA}smyRNxm*VuuJrn#Eaq!Ga z2}SA`nin(D0tlq<;h?s3H1apW)Y^0KR&=tj#MHLFh0TkqaPSnx!okPsVChW$2-BLw zaVQ4|`;w43n2}k>f?B06v7ou+apySqth>@Qcvg}j4*4$eZxApXbGrUZ%wXLGlnHz@id zk#Zq;gM$+n>^1n-a0uod6AB}c#wE(D{S$Cd)0sLNBs87o9vzQEhPP815P8%lpkOx< zlAr8ojYIgN`Hf%CfKuq+I8=}t)In#22*Va%boh{cUhS7i|z=&jDS+-{qto7wkzT3}HbWR9TIN z0=MiV7V@-^2m&}Yao!fr%L;x?_m#*Xa9mvuSA-cMK0nbYY04&^eRo4D~q0-~bF_mJCbS zVM+-6;WRYZLleNP1c6=KP6^k*5rEx!xyKIEax-0shFZXh5vtn>SkRMjF%q6aM-Kgg znPJu>)K?_OcnL`v>Z(bhK@vC)4HDo{(O?48#t2=)C6$P}kLw?Psqh^Elh9avEu3-))*+aJkskwg22fo@(ypNeBt-+i7we8%pk^Y# z9yL$A3o{N!YprC2{x>7({b2HFTzD|*{A51lcVJ1R+fT@&L~)YGfi>&~$|Dp^IKFwL z=TbpzAz;i#8W8X*ZG83a#c@a4yERy5#4V)Z#zN#Ai3?)zBsF^APsAB?)e0aHU}t2a zdBzE*V%TK1c1T7} ziu<#b2p2`nL8i50%{7mb`n;~AEQN-6goECLrWgUdXdvhTQ3aB5Xx=G;se$L<9l)@F zh8#^SG76j=EsD_IALYW40sM~KUJyUZzjVH2_3-g2385~s@+LLJlI}MK9qVxq~%8OllbQTaWv9^M-hjy zR^ywMMI%Yu@7nb9A+W&hV0c*<6NLa|0L2>%uHKwL4 zHKllPRBgC6i9?<7JMe%cZqTlylW9-lGGO4SJz%%5ek@^ucX!Qzu@?y`I!~~zW8u1b zn&n1`^pX_+$Fyzo2K4?`;00&~T+%p0Re|3gD3LN_8({K z`+kw(cr?807=aI1O$kdJ+JJ`@Bi z8qHvanNPq;QqYmK;QxL9DwDF43=;&J!_mk;OcI6ORjZLn@Z+J}~?C4G=&xF8|5|J*#dN}=$9-t%x}ir)YEIf!u`&~+}H{O|s| z1eoL73M5kGyl@#hLklgoH>&&!c=vQ*ju7xPU{C)2fx(caLGsQ8 z2qOlij??v0B;Zv8K~%Id%W#fFl#J0Et|t0nQTf|uihsB?$(?uvVyMudLBy#!PdM{` zZ%K#1H?%$gA~^g1A~>-7Ks;u!K|sM2G-g1ekdqsx41u+H=4vmA?-Uv4MMq8#4nZ7` z=_J0r>n>TBUWj1|fW3e3K8^;s1BkP%VI46{A{y$(%gHfGd|D5X2hk5_#E{0Pvrj{!>At$Z3CLthUtM$py({b~EpirSh$GPhIB8dO`s_~pdaoKj zSzdsy!NyY*2kxrw<3hg>`^Srt7NWL~Yw+*FAxc+z#z}mHf-7hgNi^^+ z2h&%)TnsW2FfO6&3B_T2S9}SC0i?w;MStP#g%cr9Px)+Gy3inFKu~la$Vudl^q30@ zub4`N;`7~cPKc4AIg)-vmQ;vHkOn^ihoIjP+K)!I9Jz29zRK*>%@L--^9+V4e?g%K ziI4Iajgu1%{3MD)sL=U2F`wCj@~zSVLEsYx9=`DQg7s{C`mt+2kp?2-WY`r5zWFz- zo}|1ThZ*WLcn;i$2JOMq$pSr~u?*{sghc3Fx^zG>!-s65L2fuC<<9Wj4Zs_1qi`t{ zsa)bo+=GBY5YbLR0FfJ@m#qkmUO1+>)O5);XKy|UN#EAvlLw%zB!3i?Eb}44Hgozh z<`PyyHUVa+#i5Ed=uBM$5^BIZ3Wvr6kKC2)yDiZIt03t0#vn3p2b4{_o}X~l`^n2m z1%Ccg+;AN{A;9G{W-{gwNnZ~sn``)9>(ramK@sTqBFg_A#OhAseVD`qG;R4Y9aR|= z{^EU2US?)`z8drj4qf~~h6w2DHsQV}f90e2YueqW`3}c%SPi9}IAHohODvQZ`T3ik z^hejAaKx6sVTp&t?pw`Ffi?Q##;eVT_L4Ej>w&#!jiA<-)#|S#MeCESv%|k{(HT4_{ZIm$9`n*}Y(w8xPwVgb3_JzGn91Pd3Tw?|3t+oj+s6hzSWIkdqM)LfK!6LzV3OpPkDj8XOE_a}w0}Pca$7G!ER0%0i}^(sw!ogM@a^v$js2*|y0r zKWjX|^NppM_&q=*MpgtqovRLLd|s-Un2Rp%j6AVW9&(Jpah@edhKZ+NR#`Q&(1(gAJPfkU$Jp{U;7#sAVIfZmIycM@mQosdJPHlfn*FcH5TY zCNQG!;-nbbQKl?{{vhs5BCC;T+%Q)AgXOKv*ni-e4m(0epo`LNC`44C4M_&E}18qda`kuFI=5O@mi0djSd z_R8$#$h#gSZkfqc;ND*zzg=kxsLCq~1;_?^?4kpI1}ZPAQs+{0&%Q;Zcz~AzqL4H5 z`?AB(kljj48OFy;v9wB*IJSpfV~V_$im#?f39nIk@^G>Rn;NgN5+f;91rqkr^{CZg&x3^UUruY&Va*T$SEJq>Tf0(o^MIHN~lEsxR zi(A}nLZD6PUP(!Q{vvzxGY`Me_TMq~L8bXG7TN2cYxlN+gb)o`d{}#V;&sD^cs@O0 z;a(Q`fcbo=&T?`r8NO*3>Rf;5srhiln<7&*!k2(xP;_;4iF`GtrFcjSzDn2q*FWr_ z4?To=p%xj(hKKfcr*#T~-_hhJC+YYX!Ihycm6fk!6~uh9{d!RJ!=t1a&>l@^@m3s@ zq#11tYKwofsEdpt-cdqAG9by5vR8r`QH6V)fl@YsaKxAAR{9uUX;GG=-aC*%a%5FE zUD9~HPzhK74pMi7X|#?UO4L?fhAEu2hn!Q09;G17M~Vw<@rvzEXw{e;S;GiDeY{Ic zya5_BJr&;!IQt+k z$KwaDCL5wLqhDYNEi@t^obz)HPH8d2wN=;k^ByY$k_AW7x%t#PERwR(9ECYBx_EK` z=^d)E-I>1?rZ5=^J7*ThY%BT_KU@r8GDzg~h9P6R+Jv&-D?J~fKisTd1EE_nB06=7 zO!KgeP5l6T`n9{ThjW%VdJU!^uWsG3gDCeMKufom9lK|T)yWKyq-lZ9Q*EKNc5>} z*5a2-4QJU=2;cD#{XT+Lzq8dbB#1U3hCzI6S)bD?=!zu6mrmntpa2fnsTzgK7-^3bPS&4V6hOGZWs+aJDMd-V)vEVOyZ!|B^0M-<~92}eXo~aCigL1(TlH;kPTu04c$-b0R#ooUc|+EORq0YUqQrI zBOM1Zj@eQoLvcJ`Yc_2fM?kL03(yMl8km6vgbP?fQzcr?WQE`^gRk~r)&x1RhMPdv z*dof_Kxvxj-TQIk1*M@>bx;h12ju^#(;$jyJ(P^y)gf6k^X{4RdcZZaegt?#ATcjT z7N{qX_z>9ga9x3Fi`ho2=UP7<039U;4!Y}*Upq3i(pZ>9lynW$S?EXtxQKeTM!45Kormg#5H*$2SDx3z~4 zAt4h4JhQDjH!gSZB#;5>-n^f__;@?xKsZPO;Rqz1B%Xt?PcH6XdoO)IS8sT{tj30b zmXbx#H!F!WjwN2?FG&&(AOLaZ>}5nI4Cnx&p9b(3=A~y!ZB;M+hj%CdZE-RHm~cp6 z5(tm*Ky}(lCauth8?XEH!?zEIpL8u6+5>S(;3)I&MA>93)gMcy5b9tz;Fv`r{gL?t zHTfOiAJp$#oS$!QM1vt{rA!~;zR#G zb+9u4We~78u!%?}8pVrJ>d(5r$FEZ5&>UT#JYA3rL;B3 zSqWE+wnRU*RInBi-Y=sVKcvk>k@+1K9^bg;ob!ehg+o5{P1O>~2JIV7{L4o~YG7l$ z8ZqerCx3#_hwukPq*S6B7J;H3zkf1tQiRNJRVkmH z{DXXDO3&Uwq!u>jS_P^zK&%MRRb^yuvSp6AV&c90+3QiA%cmB(IzW@c_R_{)yXJgb zNCa32yyX4DxzD|;PI`h!<9vNv%fqMj3c^e+h$n~G8|DSf!m%;bon;^~a0uu?o}O4- zJbl{sv`>~+{(+ggxp57moj@${ zV4rI{E~YgR_N#N4(yBh(b!acTE;-oB2zVTMs^dcZaKueR9rNBAx zeGaBiKla^%JM7`qP1s)Z7hSaE-!T+jYxwThfw@cj}cG9 z{O*SgKO1E3LvlQuW{kNmLnx+qaOl+4 zBoiPOcv!Qey9}aa_yMD=lGWCZ4iKzjykDacx%}H!n|mKah9N0>4~-}i53>Qms+b`8 zSIx1K&fIO~uqa|`VGk}l84X=KSsMkBlvHhD;~-4*j)g*==YbCW(hYBL+}9(v2MLc^FWc{AS%OyDB-K> zdROntuinLmOovbVmJ;(a$#j~3fUB-tnUdz)R;MKI2~`dEebX;XICfi>7WjLRLEvl> zXQww-mh?HHDlO)?{D$8b3!rN@#lcKHb(X#QKz-CZ8aL=X)SxFJDm7cY6d&p`oIB|J zU2=6t|10Noo9kMYX0v|mSzxP831|&O4wrSRB5KFdz#HT~aLRxHoWbqDNwp23Odo$l zbn&d*%^xA9Z4eOKBD@502P;|Y^!Fn5XCgd3Np;(@fD|(#*WTGQC^)o~igIlFpd@vV z*eYH{0G|MCYR6hKjFo~a&O}6C3+uMu)?5Tewt3hrB$)!VdJ#0N-No)Mn;NfhEH~I? zxo5&y;&fqPT@CI52LxD>nh*oobjD^Q#xZB$Z7~3|rJ)djiSp(emQaue`t_tVU4Qn4 z*>24s0=kV$hADxMG|m+hZPG@zHk!Z=ivUPKF)l_=&>ym@3TG{j)&Mg@Q&T z01bB*0OiGPK~gWhQB`j7TOjqPQ}%7mo(>*=5N}8({h=-tT&!`ij%=H3%-K8Iz@$Xd z0ouUv=UjIoun6Xg0{KKmto&Sv2 zlBOY;h|zk3)J*~1M{gV24HyTL8i5aLkvTa$Rdv(=(3IEbNLHBx(7M1zN6}7@wP8)- zVGv#r(9Ur(Ej5@_`5q#CF|tu50ebrj_!OCFWjTw5x8WzHBhF4t8G`p(9jc>!$doh$^kHf2G-}Vuw_=qY-VUpgO1Y~$*`CCX@upD>>XJv z^Lyl!Y&a<&q6rvD%0-L2JlUzfwG6w4U33Z|686SI3@i;&N zh)P@aW6uDP-2-b>KR@vlWKP0AufEF&5KycHrexH5qsKNiH9haoi=v{ULA~XZOpr2C z#27y~==b(k7~?5wN-xL8jQ0IisN=aYIwz_=dL6M$XHe5jEe8I} z+Zb=FG~De&!V%3s`VTU`zOvp}&v-ubYc+Ai$l zF`-yAaK2Lb)8C+Z(!CA|eP{3z@3heX^BPWp2|&Ym1WFY1X%0k`k+IZUBvLa}i?FHXqC^}{EJdGs1&FkHf&heqUpBZ5DU za~^~FhC5vwK?-^hr7VZkli~l&mVEkAD%||KF^Ed{p9v{W;>t$hpo+j6JkJaF_VXwl z@&O5vYyB_GxHE`B;o6=q4pS21X^(Ah2MeYMgHRv%MifH}wd0_}th7U)J9t$br-lEk zh`#!WPJJX)4Nj-dFFYR)4l*5@z*8_}*c?RuQb{#3rTOpAAW=I&_(_BRQQ+<63y{;J zaYqK@g@!Yun&yna=|(bvi$W0-Dcu|5Ye;X8lp$V#m=uB`ezEMyWjX`UurvIFh`9VZ z_#R5Y=8F>=x@qALk#-KBQQ_xmPbb4Gq3Pf2;K#&w!AVSjv0aMH<w= zq%Yq+{4WAn?BcJh(~|8+iPku*vlqu5o;p|vnteO+6)Y+ANrQHBbuJ3|g&w404pKx> zVmOF73iLr!b+}`YXDNt{T8zPtecd5<=f1qo+xa~OS3VE=-!u{k2c7rRb$$B)oNvD^hYZq;y%zPD;T+aona`LXecx`I@uzN- z*S7R16ufxZTup<-a2%|AG8|X~@aW(`iW*d5bgjrKv8`H*>s&TY2ABpM(jLu`AjN;H zE|U6g@q4;yMkKrs4K;47Q#+AiFRV(3bcOX&*ld~it9l!7a$g5u-tH(z*Gbue*^pwl zwteyouvkV|^FvN1;Lp1HB;*jirW+unmJ!&(V z?l=U$B^vR9fH*=%nc3hk#SKZm|EsRjqVf!lPy?3kA~1afbTTg%fen#~hH%8KvG*!r zMu@xnL)lGNs!#y=7TTL;SkzrxKQ3HyQDNUr8c$N0Ec_V{gJgTU0zCph2R#?d1`TreK2p3EWC8 zl(05@7i@m7*bmBYYtAYKg69W9o%A?`hfBEXfrkS?&`n#AjuCA+7o_zQ!1N}A869 zwK=LcNXVJ(EqZ`~1ifjH1`e5U*7|$|tZ?RNR}Y0jpg|1qqeL`xk$@p`NqU7p6E+q%{ zZMs0`!R2QKe}AT;Pe%MZHQT;&+f^R-Iy!fR)RkXf`iE?AS7>nKGWV^JN4Ya0AMsTEJ!^f{lz!*pTO`0 zP7!Fc47^;p(eM8wf?uWiW!!nLV<$ya2d#nDyy8?y*i-w9Z4#fw#-x6RZBP+`xvvk0 zIPmf;urLm|{*i)|F3F?;WWZG05*$v!R0;EvqFLbXnf$NIomy{7=bsGpt>=#-T; zh0pzpgfF5v$yg9+B&}Azot0#W#Dx>%oL~95ur&B1!Mdsg8XtfPSNHr6k}pCM;NW@= zFHherCwXUmx7a*0_ACl*t& zcx@F{CPsu@hUVriD~9H!Qd;Zy%BKkY@fRmd?=8+BB*#8(ZytbONDfB0d_{mv1grmW z(epfxqsy4izgFDP1}s_wV)3Q9u1)!ak03ke<>Y?;?31&HE9d@Iz_on0mR%;hKUmp1 z%_ihdL?yaEcHkxsDHXI7u5&eC4etq}%0lE2j-w}Q68}u=7y%=&S)BU8_8OwSw-XMzRiqWcqV&35JfcuZ^T0{@$mY~$^)Pcm~nje`m473@4nw&_4 zx*ERWYMD8#3ZG) z1BzN`aNI%5A>nK+#-$h!wZb^?WeK~YinbB=@?YM?!-fpglaOkqGKg5bm&!Ehrbm4gcb>&aw*-yAaz0q#XCP zg-kd(SJ2_^$sj6gb`Ms!ex7Lg2F5jb2&Lh3b!hl*0~ob{>sa*2PdjsNzWo`6hd$D< z7)`JPf&*XXBEJx{R$o=jQ8IrTGx;Wa{z-5|Z%VRSZ=Hl+{^Z9orq%SZhe8fMGb>BH z&?Li0T}n5d>$Us+lNM&t`5K|gcfFKS zGxLalXBjd^i+5fAv{X6!RCSf^YzVy->t{M(1R4H>9{cAnTPy)=c<@(~W~c!T8kox% z=x!Pmjb4Ze^C=!J#}cpL_|nJl+$mog{-ccakf{mTrH~I?&3_^r_BAZOZnf?);w@y2 ziUxoZin1s+@I2yoxIbX|?6Ble4r9J|t_|_~^lZU3n6B+r`+ZsRE1L;MgB%quuxu68 zFeLSQbne?fhN0cE@Fzub3zta4w-Rm&>8CwDx44zYSbh7#&wi9A;HWf0wnR1>EotKr z8hKaBKH%EpXc54_&H{(tp^+2Ncf+y{`b|7!N0Uh7C<7ng=_fX>wkw9q5A1)G1@0_j zN(cm&T_RWk#>kW4q)JN9e@+VTW7(8v%+IksZPj?bO-+1By%LevKwm>=RL z-8}C+Ia*6iExp<5awf-w_4;g^gGCyJm{+*SZX-9^+po-)ey%PsPdC-0!p47 zAebmCjv9|PC!Ws5V-Cd=7krs=C_qpBi6{8V)a9MtsT!4hCTu&IDjpO79?ZW_TqllQ zzesJqXoZIbjN}uDSX?(N{_RHjUC>a|u+|JG;cT=&3CB*?=%1&moJ>t2^i^JSGeyZmE=9If zTzV6SUeFmWE1?S}Zu&!0v-wYrd^TqpC{_Ekn*M+&t$u;gPShJ` z>AAgoW?DGVg~7?gy@403LB~*`e|xBAw2=J3uAZ4uL?f7147HvEy~E&uNJLRsu72Wp z-&%hF3o(gW0OFE8EF@89tKvrfbok{zI5rY^^@}wMpc*BV30i=i1DGf0KW?iaKoqtG z1z|1Oor{d@qk;NLX^mn9aa5!mY%8D5zrA`0hP*K&gRV@O7i~)Ae@qnzYCgBL-BAfc zI#yLBS2U6_gv3u=M1}f3VdKQcp^Vp=wXLz^A#5YlS)$e7Ic$+_KL=MBucQ~Qp8g!M zI|82EF*M2I9J5CK?KvsTiMXi8qE@F9AT!gw3El78CSNuO~dwWGb>dOqD{kU8c<Ufgg41s^9pg@SlwV^)nS5bWNX!oTYMk%V(40H2Px&j8xfp|V1`cvQQcl(bR+f@!t*x(D&OOkyZ_ZB}095V;iF3AQARsl`e7zTi< zA}aF^O2e%prz$2%+FXP)2X?TNnGKLKZF8XFJjk9*{jgNYN#4Nx!m)psk{16NX%r89| z3cVr~2%wxOspR5?Q*L%!*IQIXX8;N`=oHi098G1xUuD1P$r3)m5Tj&FM8jyY-`077 z_t@d&=*s zh#*fiL<3R(J!>?9nLtu(#%C^c$r_GjlCPLqnvMUYrdm@m+=S3?Y4HkhiY4o-(ksZj zqch>*SirOY$gloMNZ3}0oG4nw!^oTi9mqM-d{!iIllkH7Cto#P-vPGSH55IQn5g&yGHW=eEi0&l+7gv@vkde^IRIdE~bt zdO)wr0@PtPy=yZ1tT+o)yy4idY(qqu&{9AB_)@>i-urV#OqaR9JMqtbcX%&~tG~)k z^3nBxBC=LhgPLX)VCRgK%%y(^S3mW>T?fJgiv)uzPN0kdmkrTe8X5WZ-;Ybahh6@K z4w`~#Cb|QBA_5QU(~Jh{=PYtYYxzmHJItSBKDB^D2YBtlObm*~cm8JeVDG!_;KnSX z*ifwV_M};@p7uJ;vNt4QfuC_aZCX;QrOrqD$LI0alXt>MdB5juCt)Z|>9z)NA}~!2 z5FAuHQM&LUV7$S0m#L|jWeTQ^7Q*DHF~+W>sjOBzLIKwkq&!ulB*!P-gFcFOFm zt*pV0^eC!D(QLdzU#9`v8rKBO+ZN3dJY;+Lc5slE;MKPatF9xxfD`$V1f4Xb?+R%m zisDRWt`57Xo_uY8Eqdf^#~Ink>!N2dZatZS*kY3c3iJ`DQ34694w#OK#zxDm^}d1G zfDDlxzQ?`n2DAqcd073UVhSxuC-8}XS}6)%jX93ik3{t=Uk2I_46=o;KNZfD;iFRF zWaz|wAJ4OQ^KlV#hbx&!|Dxet!sEP3#6crx^Y|T`5?!7MZSXKc!<_Da1CR!aR*rw_ z4(q$|4S1-?QN&cOeAe)(;!Y_MLNCHl8KnV{3y#KA)*U(*iyqG@g_tx9*cHY__8U>l zQ=0!7-w=5I;3mxAwzL0%Y?SGCrXa=J&>VCdC?f!XT7R`@!x-iJJ}#y(d)}C$K2#Dt z*iP@&RV;bsa(`9zZ2G&F{dnGwBg*8S){*>2pb{ zxdn}&R{bz{#I{X4JC@z^Xpkdn+I*4u+0Bk&^a=0g1vJj3Naz41VWDU%@0Qm z^v_=Z@ng_E_Y+?)=7W7Pbo@+aAZE)Mejw*ISS4`=`1xOMeV56@QAsLvAgVkA2H`$f z<*MD^G(P<=*cs`*r_qkGyBoG*3Am@51Wa{E{u|>QyPZSBpF%hyU3X?V3Em61p4dB@ zyd4ipCTp&|&fE1O@ao1~r8lr($KVdv4u=-ds=LzYuROv70a+j*ukyn5Ccu*Ob&$HF zM}kvr6kD?cQPbW!qw5t@mb3x12UfkB}q1Ov%78L6x}sepShno_2PLaOT~Mw|cX`ccg)`@%Q-^ z`Kxw%VEDDq!c{r}>B3qr(qqCj@!StYWpdCHlWZb@3~QSv8FFF_|6DB6wUhO`08H$n zP@Kg+?HD}#G5HtF7K&nV;QI{AD*$q538pVWb#yL1US@(GdF@Ud9tIayXCpKZx&i9z zhWKbe~CGrngF&lR)aCyF%a(A9F;c>rN)aZ z;o)f=YFd*OZ+E?XQD-(MZmHXg9fr+ZYNwWG*othx-|Uj;0`%&6?1~5L-t85SFZ>*D zrC!#9xr&Ie4J)aiPb?{%enR>@aL_OHbq;DL8+zi-Zb*ta2-)fD_tcY0EY01 zhtrA-j@Dr1t7U*zMk)MM3cfr1$W<8%Y6svl3CdJ!O69MiaVlLV3}+BP0n1Ig!gdpI zq$DTn?aHdGgiDVnQ63-In(lB;hd@RiG}HC7uWZR1bH{CwG)9 za8QC43~ej|m}3aNXgY6TD(**VDl78M+Rj>KfI^cP=w>LgUjOl)JeTF-KUjU5^eZ6X zzx&vLY{z5%fk37&;a?u-*=;+#kaW-*(E-F-0S9)<@LN^&CR!5)58QV@hsMdiP9{GL zv97atl+<(ieeKZ>r~8l%iqp5(x9r%HSUz&}sOzhaU7a2?DO{i=NtD}TY>tOqK543) z|KG{*=lE-7Z=MRD^Z2U)N%B^@sqam~+1*piksNZd$72edy#2IR?KguRK30*wOqpCl zThFJFn>`j&6OpR>&)5Bz{SS%Iy4?822=MriJX3S`lD{5?=S>?UfuUR9Uw$fFOd8qb zNKN1sF;Ke~_}c=BR(%{Xuq{2ELr7rQe9Hv9r!(&3abR)#{0YaPOlT=%bg0ks*%7k- zrpP;I&}00(tGaHwTl>zv+v0j`uG`=p+cwcVAx-LtQIe|uh=S>VXS13%^}isWCVkHD zJFmT6?{xD?p)$1lUxTGP1!Pt0gAx>iXIJqX&;{w$6XTXLHb4SI-Vla9k;s7itrqnJ zI=Vt->l*W5DrWD16vx(c_f=r@wnt*8{T+vRfP8I;;dc>=5F23CVhJY47n~m&{kD;B zqQumLV>J%X!rAKnp8Xd;2WbB4;wVHDEYcO$&_`1eaYyS-4B~~Lyb=)QH&P;5-geWX z5LsY&{2z{vO}QI081KX&BOuI&L`+Ecm3YQBJH8tF&^3~kJqJ%XWp=e8Rg_pIZ&bPr z&zqVcw1?9O#`^=HXl-DU12zz=4`g+UHL&#LAa>gT zaHUgC_R>8zvxbRWPFS8p zj~>I-iWfTTl7AarU1Yca#Ai$vmlqaA#=H0&SbWx7^GxPXt8@Gy|0QPo=dRRhk`RP9 zD&RF!4Z1%{{8!q#^PUN02~K<~jiCOaKXPDHUB6|}u0A^kFuo75g#gyd>3CX^Ne{j{ z52g@$6lD6Y)9t^3-V3fPZ~A)!H={eQC4XA69`twsfxTzDi9^CkxGM+aFdCNXBUc#D z%&L8ZbOln8sAx|@n;7bhZsdj>xiX-$bP@N;e)B;9nXZ1RHi@PvK!$4;79WndeyU2x%uh@{R;FlyN@dw;@xi#>Bsl*_x7hU6_-Hi@ zcm!}HpG5WiBWKBOGuRHM4_}J2KQSO;aA;t8H;w{kO`K?}=K$KGJ9xwnmOK;QKq&+v z;H)>(i0J}%gWZD|s_WKB4igT<#v=|?ug@!9%X@NvAgCD(f7QC1zfLGi%t?uJF|O%WC`7Q)fd===Z15u%(aojeB1i{MT?3e8wuG$D7(R z%JgCinvUT1tP2pnV}K-?K%~$JU|7g!%Eqcm z#$26seN3@l8$O!sS-fJPzSJ~1w=bXIY8kK|D0$!7w>9MAoP8z&9#m{So`^A^;RGB) z1N7V)ne&?cr1v)-p%eK{Mc9DLJQGI> zu8cLxu<`PFJb~DHVx$ev5H9Oid$oNzlV89cEymk3P#H9s{XTO8K;VPHmirLtzwijH zfn_>N!|Ttvh8?-yN5k*O@OhC5iP`046E&v!PTbsBch`u4u8PR^&nEXYkI(I8UDw3B z$iLSe&BYlho2Ia+B;}|UwbVxR)hMcVkOeB0L!R$;4+*90h>R|54cb9PJbGefAia{@ zUzV&yhbfOc0*R)0%8}U+HeK{=AnxuNFdAN?-({Z8v@Ncz+UiL4BHNV|y{^PH$8$S< zsVB0pJ^-#u56hW*QLD2LL~|z|jQ$StUd`4MKtR_TtMuHyK_+?N|h(W}D&{m-#?G2hWZM4?Rldau*FX_5i*^FFCRlnMk3GP-nvDQ+64SMw0&T zd#7c?q4#sQ%F6Py1u?wR&X3Q~nLe4)&JQ`|mVWcFBN}XVf@4C?oa@Y4y@hrGbRPRn zE5`nEXI?AvM;E}nLLDtM{&n3lHY&oQ zcF8arEpBex`t3ZdJWDPiSIA5|b;cW0a(A#ILNg@-6e%QSqJ3u;V8(-$g8$Kd6ZV^s zB*O9W8DTcx)@nTWh-GyiG!nU!H7!FJrkGGtZ{V>NU*ulDq)u=VRj5Ij>Y4BWEToJR z2It%@%5wO^<*&r!d`GybA!ZVIn0 zrW|WPXvBa;-XsGhB}m{wKc)-~bV+Oj{T0ckzwc9WW&gzL8X)9dTIQ5l#{g{pu z0W%ITcF?fXhzLg_6ULHR`5#UnBD{kk6f*=47%LZIqb4?M-&lZ$z`Xf^M!(nn+rf0i z3tM8Y6$O|ZfGV>_>xYp{h1AJkFB4vKxNH256^A&n#z$*J74$cnlGNoJrqN~96>6uA zpyCI@S!JWqg2*_TyQSj3RNZF2bl5gcjIZq|-^-%rFw{5P38FZc+}=p=yy^>hGxyz}okGv{zpJ zX=$=GB8+kDvDh9Iexy6f?b+{9sNBmRc0v)DguyZvyr_h}1<3*H=d4 z_nFS)!qUa|TGc8wpS)Eg6C%4a)z}gMpWL`>{wC|sgD*UjN4g4K>8bqh7yejd92=;= zRsa{Y`inu0@%KSr3A1FwL-cBtQL_D;^7-)HKlb!{eJZ&X?dgv(>@Iv(w1&&RN?_8z{4U9jOo>{S3e3%opJVedyOlm39!IvjO^S~FgLetp zSy^d$KnAB348mrJKROpW(bRK&zH0M_57}icJ=xLRp1_Gu`8_ALr?c3L{i>yj6OX{o zNf!HU9_#kXF5BVtU;JHaed>JbS@R_#SMrKl^_;NL8LOPPqh+oMB)WVd&*bm+fYI8^ zDv@5&NpE93f1K^@DK=jeF9L0i=qKUJ;^Ol1`JCkQbdtZ-%Dw)cFRaZ6&6k%$?e;Ag zge-6UJDvJvadgtyYN1*fY!zhpw7aFwYEeq5n_f_Hk0la2Ixc$5zMssQ%Ri^8U#un` zwRf=JGlz`~dRLb@I~f@t8F{nteUGKUm>2W=B+y`hdPf6r^Xw1Ldp*&6eg=PlgKoi+ zQ4303_uG8uj>LuDpCw45)s$)x6NjMqvFYqyJml#pK};X7T+@Tfw3dKv$t=N9O-y}1 zV%ra-R?wUIlr1>ychXJpWoqGNo>t>nX!UO+Ug0wzGU*=R<_TOW{0Coa6I{Rh-`0oAs5YY-rO)y_86hIWMv!*U=&CF`Nao z*MgKCPr})hY&3&t#0DWP^gZeCq3qxwl0`zN9pI4ZP?#ecNYKOdTLTKhf%U3ou`kiOC=;;4ht?u3%32>*k!L@)jZ^zT($E z5oyYVHaY#4eqG>zlp}N``hOkB0)9^zB#_!Dbs_Hl^(Ju1_jqe2$2Nvj*7mN-EgKp# zjvGzAdSSMFwg*6sIp4waOgHkQEBd8)U+6poRa^h6FAlF+Je#qMao`Qikv?n6-o!}4 zAV$m8P_m=_4yK&@dnP-HGt~mf+T@ma|8==Adpf=N;8a|hb~tI!Ry$MiV5nPo=EyN= zWTzmHbjf1Ar4jOIZv+(HvqnAJ_g?bH;o^5d3pszeZyq+?Nv_o+r{pQ>nTG?C z^1I#nW-*vj4HrH9IFiTUWXl`?zLYH!{zEK~|OHeo%d2z*UmJ(m|$yGfjKt(u) z03AmS#Y^Wb$JR?+vbsIO6p$xVzmx;6shiz+*5Ro&Zt$E|KU@)yBd5lmyiEf+SxPJ< zc~fGR>VAg3XX9b4l$F}Lo%G8V=NKFupQ%1*<8}z}k~n`bG<74ZnAjH+05PPy8tvBS zpv+wWDsnY&pATCH2kQ&a4~v zj6tvqdQUGbiWc8DiLu;S{6#!`ui)M}jo#(Q8ILn6BDqPM}Bp5U^9CQ~BBe_EYX_*Hj^*)9rdBK=5ix==Q--D4}4l&?0YTy+c>m zyVxnYO}B8|8T}YK!4OyixtT!ae|%Q@ZtRhGsKCv<+ z`7|bV=!5A3Mh7fuo;#&_OeE0`g0=#Pq*NZX`FJGX^wm~iGXtSS%!p&kP8ixwg5FRw zMPVa=rJ`oreiXQ{zX?}YjpT-;?YRo=+^ddL*KkoTp=vV6{FPd=V7An(7n|#lDvg*~ z^B5N4ZPkN`pmMrvyKq} zJ~FwzQ$4cq!3oUF?JoRUAU*04;lYGou?kI%8! zJFw+4^}onUrVJf$5(ghYKD=J*pZTXvFq`rW0y2`1LGF=ZfYcQn|~@DztPJ zi6bu+zW1!1TRrEs&C4Zq2E?C|=(v=7MJoq?8(q%aw#^Vk2Vj6|CC09(tds|d#V~F$ zVtLtBTfony2js`cTM_WfD+AJFgIt1Ti<7P8pg-$ zrdI={E#UGJ0i_>jRitY4$DGcLg1(WQg42?_?cy510gbXvC{8~o@3vm)_?fu!E_KLf zZii278WU#Iq~yfKKjm~?)k~qvX&gx~aCH-(PQGoUm~kfsv_P?hyo*Pt5p*5sQVF%+ z651I^kut>yP%Z6>CvE@Y!XLkO1=F>FUGO(B%+#;`1Dn}5!g%7NljvCPO8>LEeQFYz zw0*-8)nUk(MfA^qa{fO|L2M}=Ds~luB7}p(@Rp`L1^@*NNi1+6+Sr%w)gTo&AewW4 z8IPcZ10=;hy{OV5SmQAiz8pzePOB<@Efq;g$M1uHL|dw*asQbI>!#d1t_@al4zX^M zR0jiF@)Fj94_74-!>hN^s45zIJ#ahtm+9Du_0UBn%SN;P-FbW|6QP8nJj0EF~vKe&&KS==%Xk|_qGBu5kk)=7-3UCFARln zRC3>CTEnOs2?|c9l=ZNxjKhh$M52&HzrxOF3KP>Lrpdtnf)%wP9h%C}-mDu+ki-3`_qy$`o3{4f*=a=T?5t_(tp)nEX5+~d zRl`PiSUBv6#=J$H&g(gw&=H=3Kv#TKi583na& z)9yj_H^ouygaJ5g5K1RO5mA^c`$D~Da`-{mh%vyEEUvetx8E_$vp)Y{XiftnYglF` z#BxfnA$}Zz@pe3RtBf)h!K!sO)QB8{x7y$#FLyw>b@3`GQ5e_lV!~3ny^n-J*}){- zZklnnrViYphmThfE-Q`RhM_OTY#=W>m}VCxWXd{PgGJy%W$h;LfWCeVCkd6Ao4VGt z=rY;f_x%8kIs1;ZAJBRe!Im2iJPZ>u8jwRZAdCsFpoxH^_&UjUsFOL@66E!x zK!=YKP>$WeI;CMY09UzJ5?r=ur=(!g{seXlqwLM{a6*VQ+vrZz8@Hi+pvlImzux%X zl`J$-ml9u}FUs!(+QEk~*4%3MmcNaRi-0Bqgc5;m^6o8nf7DJ1`CZtBN-{oa@!~9+ zH8eBVS+Sb+^Pc6ddAID?xOPiR2F`u$AN%&1;yl%2#Yyh5CHL-5R*X$dl#~P<6q`RQ zxtY~D-x%xDRBGrGWOcZ|(+W$y>O#f4#zhS_5GgVJac-CLGZBEd9RAw!DZy7n!UaZl z#)xc|^oqLwgLQtl-SI|}gKl=^T5}`8&3MB#$Plp9ya0m3nD(N>^buMk8H7`+^jF2? zb>q=`Y19Tp2Z$+R30{)y1b=+AxgP0`C(M?VEdVpumx{pUz^_b3^&&trq*-JSEdos13icK?yfYeZoCFKji^4S*_FK3=m@Yl9^A?QLG0Q{%1d7P5eh0sf zoVXc|$J|<_X6ofxhXOD1=8pH#O1AN|W1=d*;-j3m*1MJ&E)S*(($aw$9V5Z$74CxL zinZ$)kZIz(7vla&riKRX}l=i6rRnDy`Jwb1s|*uiW_@iPxWugmypJdh*x+0}}3SrAI?XC377t zG#-UG8vzECXI$9^rVC9|(|0^54YP`e!fBX|0uIipjIT@? z7A;FV9AGO=>6e^(XAYtIU>@WTPBO5ZP}5xPq13N>l{qw=SIo|)5AUdEGO9NE0)|pBTp%L`-cjns~u{+bD8ui zIXO8;aLRcv=XUnZSZ)NL(exGMC%=e`CS*LKB14{;EFRM*1A4Fob4|}U3+UkJQdiW_ zDK@$*I=VvPO}QcUi1^{-Spi2GgDB05onGJmt_4_M@|0$tQ4n?WH8me1yf`ApVjoT% z_jRPZ2W>b!{7lJ`wukDhrU+O+*I9FCXeLlfJqb)>_|YL@GK5zn^c=P|ONfzUcg1E} zt+3(~Vk8E2um^KDfQ(%;qKXYCoCgmDt+QfDdfZ#HAYT<5A96qBGyi|e zp88g2SLf-}`Cmu1v?Pp1#hoVl7QPsXT`uUlRg4VDen4_>N=~*8jgQEDo-)Fq%2yvPBiA-i}AK zTqd5`#QKv+PVbs_6!D5c)ZEHYOaJSzbaP0%1uS50M3rS!PlvzN-Hk^-V{w zW9rwOTToK3*wR*4NW5if8nLnxMkp#R{JltRHAeha?Ox2fakW*k`K3!I&X3MI-YiLa zU%zwp+%^RTa?ZE-OJW1H>M=O8GYi=T9%8n@@**(GCe~w+5U+v7`-k7Tep+zlfMPkS zizA6unSLnl)>!y=?lAI7AiJ*N{zW)5a#6+06Vqr@{dUxb9ioQPuz?#pVa&{<5PSS> z$!5y`-io&&;c**_1-gO3!StX6cztH98X&8csx4GBp z8BUz-l!8qiY_-c_447h`v%HF}d(;G=PF0gYko#jaNtBGgywH1)@{GMk0Xj^zp=8|! zrc+NJO&kQHQvp*}3k)=h7b~y|vo77G|AsRqDC%$MS>%$?;qFo)(5fFH;ey43zBW|x zw<+o;3w*j{??Gx+MQOcJNs{=|!F8620W1%{Vay;8-4N)=#euPmgATMzsxRhlc7K1>UA>hZDw z-igF9tf6+Fwu(N#KS!A%YSc9d6LS$Lscg!3K~31|F5~1VQP1j%3)(5(9mNM!Y&Vg( zW2j@N!T+u;x)4{N=%=7(Mbku2!7lW%L~md#Xpi&1 zrws+Io;kE{Vg8Y%f75HeJj#OZcACAIR?qSUalCTmyjiQ|zE{GxX%d^VBKD<#b>Z0s z`S;T8E_ftS(b*h}M6K|5wbAZ{77MOdMuPqh&djs#p{kI18|Pey-VGcv1!y@OO~SDm zrJgbyrqV>a&oG#>Hm>Se((=)-favQv+9W(>on^m%y#fHWJ#=++wPVFMtj)}JikCqE zezg{Wou|))v@eOXBw4IOT6;;at@+W$LKCab{z(HL@=ZyNvAz4}v%3Gw3F@>;WgMH8 z1Gs5jZQ8^xqR;#82XU#YE1re^V450|=gXb}gfm`iOBa|)Z`_vIA;bM4jC)Y}Rm+vtBO?+L4+i zSt+U|L+Gl-Sgb~xrR~Q#KRix*ShuGo4v*iIcF)pQ72qt)jR**fDz3{ir5cXZV}O)E zWHdBfJ_LN~y{^>R=xwjoI(2QS05Wvl8XNU%6SVQzvjhImSC-m)U3~WTI{U=cFRpuk zI=ehKYH1drWMQdsu}^kRkUdy87FNS%XWw^L%#K_2n09xRSBTc%Q9n&&<1sZ9_SWfS zTk#vMiLuz6@_36O3J{=j}bBFeF2i zUB(a&;1nJKLj!nbf-DY|C|o;-B?evMbEu6n0Lo0So5?o9 z-}*(P!NBN-#E&OIkHK64aIKrwdyWonys}z(=jZCn!vjfar0Q`tx(7LQ0YW2_{YA_; zZaRl42ceQBZzto4SG;(Hg@NB&L9fV$#~7tXA_8)HB_oW;>0()cgqbuVK+VEyXo?o; zuAJC%k5m0kl+o-wE5O55BnBXfz_jbn6+kgRUY}u&{K7-YUYFRGu5%}aCjI5=04IC^ ztae(^JmUGbNBpkXr>VfLuA~BGB|8e#^}0W247EpZ8GVqfP68?7E6`&wB&{LYWXI>w zrNXB$BFtl}^Pt^+56)M~Xs%0R;{CxygeE^S?Cl!?E^r~ZP&>g7q_(_0y<9pt>KcqW zB;8>Z=4j|4$_O|@!sswDHHME`9s$WIE@>iOl^$T?Z*&_E0X}JeXH?=X1?3E49F!#n zF27pD=D!*+-gsv)2uoJI@blLTffR_}^xr~}b7bruvA&7Zl4&TM#!3$>t(j~uT5v@(K z&(&EhHa>GE{=9g>;Z>VtXT7*@Z2_>}c+2FfpZ|08mg-Z`- zUdEBcopmK=-^9sReOJ%YpO2m~RRVi}mPud6L+AM=MjmY^NwqDPP~+cn)1@jA&6m0J zFW6lyb{3CKnN5@4$4a-N#uH6klliC}0=5Pqa>JC*QY4)1mz$Or*NP$o&UTLtKs1ca zQkX;V^}c8=^5qBiw|@b`h$5FyjOYSmVWm0S`dhk&CLGKzhWt{%s)eQTnL}s5r?|Rq z-PQW~{{`@sRhu*MNg3dOe15^*l~qs(YZ?7t+>ZNS+;&=8z6)L>fhr0Gkwd^aG_D)@K>u@fFF31%nz}?sGHXF-o#PV>S_5JBxb?LmHxpAzO$O9hl!%}18E@i%d{1{kdMm`HiOeq-T zm(Pg*YTUfKY(T3ny_XlIAnEvb9g&eca9|V4nk%NEJ`qxUSw_K1hHRi_ zHWFG{P?gq}^SWcBBXAqqwBTa#!X^G}dwW|{idiqJKvb&wLWI;PHU#^oxmfiU06Wld zT|lyo4|hP4#%dKpL+nk_HkvX;`#or1NZ9M(v~93d=&}g#8MY1BCc>ccMPY=?BY$y% zo^Nb10X+pC1EyU<4qQhf>Z}g-p2pvw^2p0vq{Sd>c5re?XiWYK$IY4zU=(5y?@JKH zOo`MLV@G^CWKMzcC!md!M?vLl*u1RpE*S#R3t`IIKG1QR)jX|c&YT%;K-Lo=C2M3o zaie_#P?#$Z*51rV`TTcQJ3(HQg^YMmz_&3?9(I0q^#Y^_rd$A-VXP^aH-tD+S93SN zQLbBK^f`$@Xp3Y*!HQ{HO_)oIs=7Kb4vy@%DCjti?0QsDar=O)NMO zM<3W!*uHY5;cx9f1F))MUz31NW{_-@kUKD1rKHV+oLd=>@j>kl_)tAp zAHxt3bDyLmVbpEUcaxc?qry$03!XgaeT8*?ETEwW!+dKZ)_3t@U6iXSl%mDvSQ<6t zukHlUM6{*y&Md!Z^Xl^GNF#Fz++~KQ(6H^ISXuKIL2Z7XgIOQf zWt2`7-i+{u_U|$YJO=$Xzf|Tc1F73yLUnSNR*wviNRY)->uUJ?T=D8r2?;Hut{uAi z-oZtWYbU!b+7Fr^0pDEMex1jb5@TlqjShFn=WN4s1>;>tk%lHS_bosJKK{{!Y%ko( zV}0ijwJ$5(Kpgs@M;9?6Z0b)8d25f8X-7ZJY+(jzBQBw8XCEDQF%@93Oo zrN&qn$`b}-qzm+s>jwXeL2e%6#W?HR59A^UZuzJb!z5%`**W z&p+pp0x_SJ(0yklY!|zZ`Ikok4fNQNvw34O(gRi3hSJBRcHDy5vkNi@JA#>8k_df~)DY^;e>5IC znNL>}^|sX4F1&5s)6%LYj%m&WLFlhr;(m)4VLf3F#xG6I|L45&Ug2F_*!nfLetv9R91-BZzUnwRJ#P4xdjK|zb85tvJ|n1he#@EL{|iFpBssY_tUy1#WJL)H7p#s@c8{(y@%Vkpi;lHI&8W7;_49rrA z3O;Y+tnXnj&o+jiKG3vmL`%(-nHrkba{g# zhs;9H;VCj*ZGig+_zmhj_!m*4N4r*{gIU{6oB!Fgw57Yzmx&jkWSo*USAsWjOWpOT zIYuDBhA`rS*~AFn4D4?M;YSs@w|>dfKhS|i{RUCbMG> z_+mltX?Qk5qS*Ho#Q!5;DeVq=l>?XpU2DV89d3)c!VR<4wnR`&H6ZdL0Ig@noc+K@ zW!JWkz!wSn-cl42ePNyU9cyHZFiSyE*UOjr)&G9CRPN4Cm$`^u3Wvx>DP#lAwEgAG zK2*w1m9n3>)ZT$pT!GAwv|^1p=5* z-k1jG@gykbmm=p~Ir4m_L1RG8+uYV;a{p@S!J~w9DDSnDv|^g=H8soT!14HZV|*3NyV(Uko63;bxr`mmggg#SP5o*6 z!dXAmX(SpeNO zH)APFmKl3R?0F+vJ{fLO$@S^u{M@5*YBJ@-_Q5= zJje0;@yv1D2M66VbD8rzulM`)el6snIqg${sz1WNc04`d=n$@ba$xp7Hf#S@c?*et zpE4UOMv-}@Ri?%Kq>cUPZJUDAnUewxoHu$h{A+Jh$kQRnGzyT^hq(1#Q|}0zU=d9Z za6Z}joHugjab*VXmaW=(5AvXn0!P}@ZjHEG5U;&`syS_;c}^r2df@vq@4EMGomi;Y zXW{ACy-a99N=m9oD;B!pWOw+`I=4euSeQ68?s(w90nogjOUceL+kkRE=hiiFWu-?R ze70y@fbxmjoQBSHjpj07>c?5_>d*HHUvvzRPq&yn(<3XG|HWkVRsu>)2Bb?TenTRK zWf)&}MgG+P5QD`#f&xaG)!YPZTLsmzA~ktf;!Jm3yfA1jo4EvcwI<;8fyMp(@esB1 z%B#y!=ba{7y4f)olrwD#FJFP81`@AMj()^JQ45)Q*q<%NZcxK?fPTUC;++1l^{I(W zNBM%sg=Rc1x2LDOu*j6lE zvbB>1ggIFxryhc>%`VtJy&*0D?IsfR01reCB|T?;SzC$A>)7fEBDEiT(o9 zK&<+f+sth;fdJe0KsN2;08@NzIIEZPC^HdA4Zz>nJ1#L{?zy!y8vfx0{w~7t$Sj;x z83+a&D0~3pJGdFgVX~JK+nP?Arum^BJTuojeicvgS$EolymlI zG+seETyZG~kio=`mjx@rB6qM|=E(Ta0Ab9hj2-gygD8xpyT;_FKQJnH)2LyM6wbIx z@!BmRd)}@?wi#T&&+U!f!lXaOJdTQUT)xqNPNO1x7LbyVh$WymRmhJoWqpLUN++rY z*Tgzs>S#Qw0=mt2(JpkFVE!d~3NOKyyE3VK52&LQ;&y{ig6Hk80W!QsSOH)jN#C}j z4yQ{=NWlxF^R(s+6dW9b!soJC0p3^B2hQWU7erW_7GmU+9rn7y?RpTPD*;QrXYbMg*Atc1DEhq&#T%cior1g-Pl(}0oO)snL?%nyl zOV|#3u&Wx!9l=<61ClW|j^}qBIh!PNETAsN-MjbrbqDA(pt-cP?%cZSbto^{pS;C`2M{V`ETPaqg`})+#n4>K2^CV%9^(?8OEx(c6^{ndI za~|67UQ%oK(6UyD)3G#f2pk%Y;LzarR3|uVl656De242i$D~qwmwhRz1qV1Bp0n4e z(s~r_{-LpW_bgGtne|n`23sagUB7nbT~x(%?rmL({f!j#i5+xib3JloSJzK8N@`;H zWrJn?#4`e+DjvI4r=ti3c=ueu8|T$=Sj^T$Jast68JhcRRDuMxN8jA3D-TlBQlhMe z2G?t9UQK5A20>AE$3sU(y%DQFi_|<7J(X6ZzuAA@=VsSQZYVtUDtM`O>L!~rF@1jN z*Vn11Lu|Gi8VN9MDz$_`%JO|4Of{y^B^SwCMb)>Q9A{x-I1sim({$fgcY-LWwwvNF zp>sr?{~zDiEk?4I*{pCUAie}44*>RofHR+^j7EL}tPY>vNM~9xPb%CJsXg`;2{L=qR}} zVgGE=J?kMpWjgn*g*@%8?Kyn^6vqQ`_?*L&&96HmGMo@6E4X9=j&~!2w znZp9|%o+ZL>BQPO1og}iNa6&)c_EUk$mpXOgSbmN(}3s6Dea3%*e{?EL77FhJV(Rv z1a#~}6r~h#5sg$Kpic=qx+EMBAj(cOF6%^Akz^Q5eWbw35zX^-CNQ#nKSwP*CGPC# zhm|oagyidHi-01HfX?ik#`lliutKx2Yt<_XQ4z|}^eO$G(1pW~h$m4(QiHN+ z4of7ez}_al9R>DNi$ukj2fMP~6l>;#;s&2GqFFJVN+ZFG#e|eBD<4kODBna8LE#WN zC#)mEy*EC_>Oq)WewIV5PTXsDTFew8OHe&j$?da*#bXo&1aE zEXV*PVBChdH;j#q^`X^TzME|$^k(0P@4*uQRmcIT0^jJJ0rt1joiRUahaqnDSpQh2 zP9%qi^*XWthD>2heE79e=|g)IuZA@h$H%TWa?gy9K_(Yv3Wb2T)o6FD&!k%XM1`sG z?T`;fV?9CVC+=_*%1mfp(J-!ZagS1I5uGx5oE9kFvwjRTvUGg4TlHJIoLDZ!_-D+5 zpS88BH?+*r(#CdlS{bg$`*`_z`7S!tuL<7VUn-o^hg23<{$cJYV?kbM=1A9+$qF`4 zSdcr8cpULQ0KR&8Q9UOtVkfIxRh?SJK#}nGLirecY7s!V!G`BS?V}wr3kj_-JP#@< z-6Tn;kWdzl1*OXV`{0ZSjrA^2m&e3MbTLSzOtVLIZ;?ohOriUQ<(?E%AhPno5{$fa z!3|H4M2!()R(#-Lv5r=MJBeuijglC@R2h@t9O&*&vpv?$E*~BtE6KhhED3RjBqFq5 zZABi&GzpMKt6>5M;SldOW;#IF}Gci^~!USHt2 z%I{}^TI@1D5|#OJ8v}C!LlH}aua#_cMb1EaE?m>YH%9>$oLB=aU{)H!j-|Dz4e_2~ z5d;$AIs@4s9xeMO|E3Xer{{ai^X>7F%l3w=Z*U2qV6a`W#Q2R3U5RElPTwgaZt;{4 z|J}1I^YZ!761v8$;G5N+;v9qX(ghsEipj|=0^-`F%EvM90B8lJi-a8wZhRBu5FchB z(V43Wj+lI1g&I&hh;PhorLIAhB2TNf-y@w7_&fQYTMM*Tq|4qT>84%+}rjE$J;ua z3Hf8EQXDiTw99Yu$H(W+{pV(u4Q^&{oEJ*2m9p12o7Rt2>cl`wx~9Hf)OAGo*dR7N zWjr0GUVXT9?)`?dNhmW#j8QYN7j~xy6HkLZ4x1=2`t8)0iFOREo0(f(PT4<`X~T`$ zQr^u}S#^3QT_}Vv#4J8Igs01F%1cxaE)n<@v!Hh^KPRV=*_dZqqrW{oa)@=_SLP-m z*&oRc@Q0A%?yIgw{QU{#Vcn-#^z?d^l?U8q@slIihs|L}@ zGO)N;d}~Q^H4#a<@jfNJ>inXg^nUZEf-!fJF2J1m>w6N!lISSU1wdD9Mu9L8RZ|<* zQP_bM03Lll*t$*L=#=F(jGie*-hw9#d+!0z=Rhy-A;8DXGe^T%_Ri@3%icr9rHv~{ z)RXl>?Ty_W7!?Ve2*4IW&WU+PBnkRp_%bA9^Co&p9+Od5V^750*L0EN!EtThG?AcC zgR^of%vBOBxd|+)2v0?u+nfo0M5PKO zx}3*QPMr~iiNon~eztgeUo7Ez5fobzQ56i|M1c1=|IH&@xMYM+1M^x8k3{Gnn~-;nn!8VOBi8o?J>R3#UvA%Onk&?72S6m}K`qqwY|^IkgTj~8SWYdc%y zpBPw!IvyUHkq)&bVSu6x373FB+sjF@|1OgoJ_+o`_<4DPz|l>3x=hf;UZw#mPhTyY zj9U$!_wM&nf8Lwhoe?+xI1PKpQ$og!xkB#b>LtQTC(M|SR=XHXDJ^C~W>iKn8b(!Q z(%}soqlH5P?-_F7h+cIHo|6@P3iP16i=@k!4?U^r8~t56$nqqlI%w$xVNC2~MU@8j+B?P!ILosurLe0DJgM+*W z&_RN}*9gX>O2g@rfMXCNNGCPKthtzNG5Ufe8{qo!eZQozgJ(QIEJj))!(j9r3n2dS zc%FQ;nE-O9IRDAVaQ#EGmkL%X6f1sHXfNyyO}csTxgbH%(m$~HzE;0Xh`l{UBsbYF z85;v}8pGQFC^q*C@!m?GA;RC%ks70Z_M_bek&@=3pZ!aHZI7QT(>H?E7#?Eyj56XJ z3cp1CRFFnmZlGrN@6gglCu10;eHrR;p_2k{9S;H*c!=k^Fp*nV%ZAo05ot9vw|SCwC+u@te&_{g_`$^pbyl?-xh`!9dt}x&9Ox+Z{L1F z`|eG2iq(?1Z<)+yBn5LY>H!ZkZ`t&-F8mZD(cJlS@xqgrD}-q&+3ltF9YaHtAW&`o z@X>W{=ianV@1Z#_THXA~(4nDG9UW6I4<2+(@~v9>AQgfR8Q!>I`W}Mz30`+|(D@wO z_)kV{&Z20j%ml~c;-Rk6>)pDAF)=gEoi0v zj>oUIHClvuha46rkpuwJj7U^O#Q$greMIkR1b2o#K#0gR!bksu1TFAJCsOIjvSW<7 zjtgb)Xlv_G5^tgA^MJFAg~g*Tf&i6@n&dlE8)<>E;k&2QTsw(?0tA1M34nnyBg_9( z%sbxPobS`t7Q0e2nPQbd5yXbi0^tA9oF7KUBH1BWwJ<>~yW1zbWk95=gWnQj0h$GG zTyooh-KhffO8Q9{i{hfr>6;;jT_B>wRX}gH(zqyD&xWiUoFX4<`hmr|8O#f{pANaj zNR;qFeEl%jt;TYXF&7U~c0o3aO49tPGHUL5z+Iw|kOZ zk=8`FLCML{1S^qnFb2#K7fz}yWjNH`ouVMPAd84>_`aO*PeRUR0 z3?oGKzbUVef|PV>ti~1w37tdOY{}ACD3zCHI#r-ESAQWC>8j(S(}EbBNW5^|3Tlgx zqnH`KF%FybYiWCAXD;r86jNj;1_)~A*||L-Gn$OeF6L2hH^znO|Ew%wlLQ2U^)*1H zMsc#+3t-~34geE>aN92f+$df46B5X)i1pDEhU*_%^ywnIqP8^N4juh%5)ro;oN+(X zbTMJ>-A@GLhgWF%sH0fI%PpS?C|HNk(D)5LtVOO}(Z4~l11G|U{ooPjg*Ip{Pcy}? z!^P+}#5?}x&D|krO_O+25Bx`JVME-S8og~xM$R5G5^bO~uphCsw1F0mC*HkV3C-RB zLtes zy}6wnxbjjhu>DSFejo5y+vujy718iEraVUYen!91gHAGEAOg@4vQ^Uewmczk`BqZr z3`7D0a0ME&8BWWkW==bEf~hiqCJm@445l%z^J!Wjwqu_rAZmhg0mcbvz)Z$1=c!|0ygx@4+9{7&9SM-nF$pFW+x zLtM;$Q8tzhk#hG^*OuXFE$HQgNxjrksa(&}a6T3M;SSOoprCnI5$`zDjUsI0220(P2) zhN2cInC<@46aD2>{sm4e3?Qg|Eb%9M7shYoNXc69(GP7*rXg-4#M@^VxPLk1nlkNS z{Z@;rLG1b5+(NCtEBUY!ABF8mO9Ks-GkAbc6~X|>qWS4?a7Vx$MT-0FT&3(F8=wP8!sj2*nVcA z<|6s2Wv8&GU-XY$ZCU{09>e0b_H#~n;2kG1W_Z0cpK$P!e7lNR^Hfuv5u8k?;HF=u8E-DmZf z7S{d|ZQJ3zFuZJZ4!*~V_5KfrtMr5^^pCm62Jgw}Scb0ok+QyZ=!1vqO;eqm)l2z{ zg2F!#D;~2nxXq5X;Ncd=?PsBFas@r$Xjk~L|Mu;=DavSm)2pKJrqIB@b=QDBs2Zd+ zcc3QXR`2rn0&zC>2IX(*m!vW#whf%Hy1E+5>l^KMEqXu|0xdi=**_s!liST+R8aw& zAT}o}C+qt9I#0two>caIa&q>93S>UkRirAukKHINLlu5-E6W0 z#D&UV$;iN{6y&1$nK^{mM)||yYz{Zc+Iob{jTGX~IRD?f0E{av8oPia<^S9Sg4heW z;Aiz9OV2MU^B;5Ynjc3-CO8WRM@E`kGNFmJ^nUrmW!VYN5%s-sGh*eM#9H2!sB8S zg_Ek8WjU%9L??;Qn_@JU=S@H;Bb_P4*J>hfOKb?*Pd?{BuL?sm&WBzOoq&Qf0%6IV zoyH4-FXe-)X53LbX)-K|jKP*lZ%+0NaS!81V{mo{S#zzUT64hpa zpIS^R?bHi31%xiyDl5RCvs=|l1scIgcn~r4y1;At(NDyv#}Ib#L20#ml$opTvcMov z;GkhGwt!>H?crO)y={2O{pyP`1b(qos8mVK;R>Ml1N@s1L(485Owgt9A ziNc~7S);X^h8Slt<5}D-dSv&V4;02li_o9a#@H)1LnasDHu5`H1v&?O)@UuChOb5r zQNwR6^aQ{~UwR##MLP_!4S)#|v{l0>0KX=4`%sonB$_T=xW(9cw9$0TZc;6}U@O~U z>zVK#1Badit?xe|^^b)$?c#nv=9mO8j!`cNxn#+4$YIw0s$T#VQBCm%?_fNb`+@of z@ap-f!L@7I5{-?Z+BtaeFRNZc0xZ|8tjkv+=vrOzm<6^Yv$63VnA=AIRPdgdntI58 zNUZ>V7*$gb2iOawE777HRJfg3(>EIfO$dsezCu>`vdDo9B}Cfjo84v}8?OjRC*r2d zqCsN_5I!AfQBzYx1ME^KCp-S#BkezT4_9Ybup6E3n|Q{Z$IZS_OQe%3>5t&ZcMVBfxpRHPm=6Vz!wyR zZ*WSP?dmmpd*_Z{VYP2?81yit{tn9{$%BAAtJ{&j=+ON(J?e3EY3>aKEX%?rY&;#? zXhAdvpC<)_%SWFk%Y$rK=s4(tpOnu>b>G%=#Rv?t>&0tVxeyiO2zhC z@EDRpB4T8j`;$tQrOE}Kr9yV#5^L=aD4>>KVo)c#zO z{Tz?K`YUA<0zb3(W;zZ5J7}BZ3BdnwGohYzy85iqoSvb!bM!RsCQ4`PKhQ`eQQNs} z9{d4)usAX%GJcB8G=K#Vbs9)dHTr$Fhe64w%~QNsAM)@I?i4FeNG6sCaBW>fX7P{- zAgOG$`FdL^&$Tb$ZYSGln}zfUm{S%drh~zp_6}w7{oX0g7v)>|NGt9UQM^p`c@ywu z3unFXl-K#`8#`9BZ%#_r0})tgUq{s3v?Rr3vEO;Bee|Aqn;`4!wAL*MdP{u_{@ozoHEJ;Se_4uS_*|9~5l54bToIhz2f@4xpAfW@;X z{roDmw#S(Aem(oipX6>;;K!M9{QJ-hK0|oK90do#cM&bu;q{htk-v6iZtmCa4(65ZB~mV_?sr4Ao%7#V2BIZa$C3i*jQ^WB$T(q=5hOv1UvBQgC%SDl*Qk22E>(%;RHaBODvi1u3Xjv+!&Cf8I_eY2_Qq;+h!u!jp9|DHv@{$oJrL*TCASzvG{+@agg6&qg_G-*Sy_zt=tyI>X3&H*VFH z;rDE&j{$Cfh&3K5CF zZEnuo#2Ls(CPan}jQ{BoxrjN{mZq#jJFmD{1G|_?JUGS@LozPbK19|FW{>^4eiY+c z){eP7jH`E#*36!YaihV7OPqr989j~4LINMH*n-6l54pBF&%R!=%rKLv9!E}PL_`s_ zUPOM<-vctg_LjKk+g$-#IUP3@q9!_ZRVAkU_s6gr^NP84&x3a!@W(&fzzEl5rf^uS z(BmgX{o{7b?n^W{F8Jy8JH9$VI2*F_lz!l|g19e0O>qq#vSHX)-H@-c! z8K?g6yd}FjVO}cQf2is}7`7u1NfvW-Rh3nTqJYyq|Mn6V`(JV@zss&_29vbuR-O$h&bzaksctRSa-Hj7QD^Hzv| z(5{0Q1iFR2>+6T-K-5|F$~7zku<145RIk$V9`l`{k<_)Qn96BL5GYi4S1Z^O_pS%X zOQ7OMhSj6W_Gl9|ojuB}y)vE@qv5*=a%7M#lrV^fUnh70%hX@#F5uS>oI=i3N=r*e zcI0ZhOpV#+Mx4miTxw@Wgbo&DXWW0m8{!Q?oU<>_K7W0B$Kn(4*j{=YG)7nbOn(7f zAYEg^&(H7p;RCC|R2)2R3PWvb$2BE!&~)9hr7Dsj5R?S~rb)XHwRs&$CVVix+XZ84 zB9YC2WJHQ1H@{6Fi}SE>3`rlPnJd2|H2{}AIn;vqC<|jQFJWOpG!g%)+y*vpQQY)C zF66bO|L&9vqNrD^N3(Jar154E&{V+r*J18VfN#1_vr>(8uJA^9d6f_&@antEzHB&( zpCdM*koEAmRc(ZJ5RgzNz-qj{MpU^Z?C1Wgf`r*(k)}Fn%>-zAhtYEu$blyJ##$la z?709&VHBTLs^c8-Jsr*v+69tl>e|128ECQq)tIchXdO zLg)T99|idUHs2M)byvu(zRqe=M(D_) zZf-!8`IEjYBaYBQfe&ojJGRtwxG+!EkE8S+$ zz~5tp**@DKI+pWF%k9FYU@q`eQM7Cv&~sD&wMqlJ#^PHk-ar|%*c(SF&9H=#=jPj5 zN2fh1i?3z@>pdP9mI7*Z)2A-JyG^4kBnn+th0=NE%cPYUT=ADB^-*BF0av3YhA-fX zG_e_GVsdM8I~I!+zHfEglDsDtd!@($s;LGsXZOy_5|kDugC9V=EyfJ!ZFg?VeT5#= z+nMi~b##}E&eRO$45s>^(C6C#=Zk@>kvB(rq9+%JOn)LWJ0}`)>uja3W9o_O@_$e;(9@lQC_m zYh@2{^ml~cs2D0*EnAT#HZ$H0hK${rc^tz(SDX$l^6Z7}dER4(TzIzj#{eA}2!5TF z6QvHsLKiIgM~w-cxg9B32iOdxdS=hAuTDr*CBKi5iiWmaUg$xuw@L&AQfke!yHw<$)3-ntsSv)`?U_Df? z{<8~oibP`OrH+1&=7o`knFUr?okAv0RS3DTY#)bh9Aq#g=v*QqaqpdCbz77LJ3Y?Q zqCCB%F{3{A*_cLH$@7@ya>ntd>uF3I#Wi6SHq@D=I6Mz9%=p3&u&M0;>JqHgIMqvlmqUE_?V3%g=t;$Er7-S29ymFawY*NkPMmYN9|wQxup|?n6?5`a%KF+o}|B zozG${B$|bSb7A_!aK{{YiCshyZkTrM;a*oyy0nLiW6~sk@)~#-Ra7M%x(S);1E;U7 zhKHq;9ME!pNb|s#UGp-Rccezw;p0S|XqE!Pj4r;-asUrF;Gj0`)s`@3nU{`2LPX9) zBE!70wFmstI+nOngHw04aElYB{IhhY!{nD-`Pz$5$Cur<50&M`b!LB_z8C@T2_P4I zJ?so5lqz6m?#(1F8z>~=fq5k`?}ZHqXMt0etgVCDMP6Z#*aIadOn0{cY-^m5yE<#x zYI=9BeFI?GkWu0jjB9`v9EgTjJ3`ZUwOw3riFB%f%~(gSkaY*Dn3JmoJeL$!YMon8 zq5SL_$9=JajNB5-binhEg3+#FuRZYafg5K0Tj3_BvM!~n&I+T9eu)N|zVQkz* zBjmhr-{^^|(n1#Bz6L`hZn^$J0VJYkW4>Ns#_+^WSC{gpI3dRhCevD)i>Ge@4lH7k z54s@*KM^po&C5z|DJ&VOia+H<+FlG<7DHv$$BsB&1w`}H6!3u}R0z1+VD93Rn;9=2 zL3b)63i%CVq8=jOB$1PaP0TT5;{0}dqD!pKhPKPh?rQA>#2>idShGXQyvq^~$9;4- zY+Os*)!YSgkZ#%@z4y&SiKs`8T-%%mu&zDj?L92!1P)e!Do$^_yu9vlSO>R~_oDn> z>%3D;W@UqiMYZE%$GAqT-zWX3>qf9E1_ZPtppZN6MN5B@h4r&A`DoZL#U47q60O{n zZu9BiEFVv%UOKS)o6$iFZ=y1>h`VTkMBujIgNRGIf~G5B3GiVqkXtk53x)Y6_fw9maHy6L(~hBw_R? zRZ5z%=DbC71KRhoj!I{%Q95%U0@1;|RK|Z6@?m#zDf0(rkjG-MnNU_7J$NmJ|D+fZ zEre2uLNZ_Ig@B`MPzLs`4)mxz;m9|ghG>|r7)n3~*pkWf3bz7T9XW1f(lc!V9^%*w zIMWP*hq5(wxAO{|q@@G)_bZ^N*$hVG;k4g}&vnbVg7_k`&hql199hE=RWjd)N9lp5 z+oZ(|^}O?1jKCy|X@JYgKdEO#LN*@=w|-clKmJtPUH%oSZtNhEj^ zb`z3=*FwWC5#R!6n^s6gB_(7kpuKK#-`hil1RTDxm$OstnQLVWC$0d!sU!x;w)T?$ ziN3PpLBPx<3TK_PC|Vw3gG$_k0GCI?XDi;Ed2(A0226zFU`U%!QC?;p0I)hP7e~N;g&QeX8EAr3OeRwV`oqfap$@@I z5mB(~%H2LjE&D;*;W;dboRpv>uA>VuWdxBdD)^`1&HMsyhA9+p`lkvvQTS6u)5R{m zvx$iUnbmv0$6*N$jFZgEbwItH0JDI{bN=(@%Ygm^|A(50SG~VkB&CBi?*r1B!JE!E z;FEca$bE5=3Gm}sSX}@CNB?_O5qvXb8s~oIb)yKpX>c}^xhVmrI?jKACdUN^KPnjK zB1=pVTGNaKfmWFCORKHr&f%kuz?PT1=vYT^=ym*7MHR3_)aFE{CK!I_P}C#4qJUG7 zcOz1_hq|o^ARD5;`2TE#K^0&cA0kJ|I(#0UE^$|dZC=F3o5$T?0x^eofh<@n^suIQ zE;@VVJV6L(TwQg*mKmP(6NtN2G9*p63m8BH!U==qP5&5k1qs)Lr%UtSSIof}Vau@V z(c{yd{lqP31Qn?z+?2Q>h2#E}qBmfrSzzguj?SqShKz~Uyl>&5VNrNf;b0}rt!PAm z0^%+vt%$x2wa_K+4@Z)jd+Ah7@};r>f>7|^?Q21dI~;Pc<}R}fC@GL}2SwH9m?Q~B zjK~%5DfS`|=`3CJI&*@>6o!R;S@{%^05b(H2d~qZmnt@v9R*(Pg53$}p{m8v#rV5e zECFtWfi*S2#hryFvK(95Ot9TC^V3)u7|}i3#NPucO>_ph%@GWlN}6%u^d2+Q^|lYF z%Af&LEDHRi&cD~p-_O*z@e*)u#D(?~iwq8WifzIo;VO6qji$Ri0vfSf5gt;x&KbJq z>l92?enZ#Zu^EjpvPF!#ak$qcM3C^UD)5l98j|=3Sz5NS@n=>R*fjGBB3G=N=$R6* zn*I$)B{81Gv`K||oC3}>!C3-tE7_|mDu18m$QA22dWOX2JN##p{QGSG>?vU}ZBYu^ zJ7Qzob=7M~5^#)^!pB&V1h|3<;;yU%=>H_@u6q!KV1Kt}QWHH3Lw)jsPJzxSH6Z)mK>dfST4>AaIg}< zH||J!jX_cO&~(>(FC#3f2hCp?;Gix*!T9fM<8iEOpogks02%!3Hh}hq;9!wq%lV}E z+yglBr3dRCyah(xCvbb9ZV_xkxL56fbOjM$l%<4(qX-UJCz*qv638Ng4h;_pXeKoh+#}GqcSuUoD(qDc9e$4m zLQa|TX=NmNFl&RSwLKZomYCoFCzg3peeAXL;!imJC>jO=g8j%$?F1OJi~vqaVZP#z zLKg#uXdo(k1&_MQUv&V&JvO`@sQ~;F_F=3RhW~LCbg^2t9vvQeZaw{Iq46*jvdCn5 zAYpk}DH=%x*6aYpe4+-2-*Nenm*ATsYb#J{$I+#rVp@*sJFFm$OuvJ%JW{M;zcOi; zBZlkDjg_q}%K!IO3KNhru2nR^SP7a*F=(_x-5$5;3fA2dLsexnuQivCtuC-Nffh*G zUjrChe4O7{YLA^?4Ub5Mf)W{)+8cMCJJURXz0n*=8U|d{1iY{aCMg>Px+3>Wn_>l+ zBtYnPOMq2jRaQu%H@D4#Zx=Vg$3Wy^JrXoM3TJ=jZL942%&4^KFB&%v-%!xv# zNOG~WmtfhiTAL3&Od#d_;IIPB#MLZrG33^H@XU{6n%SA#4}Mz5TN_0HPKI@Z*Kn;#do$u;`i!EfM?JH^s`6a zpUSlpSk$ei=0uw9R~O52OL(=b083o8xHBs1oA>wlHf2#A=Qo9gZwO{DC%y7{BBxS zW54i(m8h!O%gR#K!uZ+>#>ct1xn%aQx6CD5G_2%#SrEs%^C7wauaCJK2@eM5qa+s= z=6ZRe{j7}2rC$* z{T3z_NnUe7pRx=eWrH5c6z~bv%7Q4d3O>bVPqM2(g?}Bjh$+Q@zxjC=Lpgz>t7>! zdtk7;1sE9YBW&{(7j#hb!Fs19`>K=0J7g*Lx`bmYg6E4uiZ7oGK7*QkqkBE8 zN-HUGqRZfm5qU~(XeCQ;>LCUuKUiNjt|a8W=0bAhG*dx0Ne;$2F8;*+xOTPdf)u~w>rmswyPbTHA-peuP8ygH?2#SjaaT^VE-P%gzCZE1sR8b> z%y~zDG$HBEpzQ8Z;z@ahMb4(4_G^f6MG>owCdflp&fo1 zS5WCLMOY?~_uu<$|K862t%a0(Tn|p<`^WD6Sq1zH6oQE*!Zw%jFHi{vORkBlfX(U3 zxrZ7aZG_e;OY20DtoMueBW8w|(+Wf}c>l`=QGz3%PO4luRG@mUVOV-#q$%=klUsd4 zw(HwM_Ajd1h1i)Bk&WwH!)7iTM4b>>@oQ{8X)*pFOBBWe#M)}LKhq3H$z)$rak(7K zAvZqN=(tLLxpvxdOY3p11l`u6$orFl@0*WO>)C-a4HiZ>TrG0Aohi8y_?qnGqu*bc z4=%GEw!D3wy;2#PG@JgiJ~I@0o_uyZ`pnwi$mt|s75Ta5;E)x?ewes{n0SY%$U>6+ z(-`HIfK6{CK(~fQ!hX!FdN-q-O^_-SF&w*2kgkq5^+ZT56mv>$sk4P{9Uq7eKFFw@ zj^c)nzCAATPA0$R{5gXQ?^^U*dtK)91*p|#ZGz}7;~Te4HeVW~%{_65=D3BdKROZg z!-Bo-_mFgrr}^OU@A~i1zwLWAsd~o9sS--JpsGH(n>>!#7pT+z?24me0tKyCeQAAj z+8$h5tjGLp6fHFPT>?)8ghd<;E^|9Ja6PyYa0$GD{1KI9?x9?+J4f{bWq(aBk65vm zbn3u^gAP3bvG?U8qMZFFYOl{d;|TfQDTq9&d2;>7Z~vm|H06cJlV-hj4KtY^V%HtL zyOINFx#U6Q7M`}i(^#C6;zV-V{>Tmowf!X42ed=)F#Fa;sR7w-7%(pEy6n{>AW@r#}u(_x0Y6_V9MyxBXb9o7^=!T$1VJaZ!wTTkY|J zk<-ZR#LqikCLh~f2=}?U#fDhlIKOK4jq5dQVF>j`w!ap`%$yXDP0ZBdgm2!YHl^E} znR!`7Z_H}Uda&Ds7~woL-@i%t(AZPGfWDOyxvN8cqY)+{Qzx9W>lW`;C^`+_Qe4Zz zRC_a3_7XuqySn>rlJryW+Q)CxK`8f5guMlwjZsql4a_JtFVQ~($5kA=jp1NRevx>gky z6puodmyRlv0JZ|`z8K)krBoxqkZRdezCH@by`NB|00oxppQg=JaaNs1Q!_pXUmToM zF$mn$JvceO3FTZtm-2<;&AHa6I<{Ig0;I}AyXs=dv{2%D0X#7E!`FdLSzhvgs%UzV zDYr-ZLhl4$`4|xyxjqCzeG#qZ6STPu-21a7N3Vt3&_@{CPhtMR9LW+fkDW$J>rPnA zh^>AdJ=I+xBQ91DgANk86Z&@d(6$EIh;0c90p7XNbCd5=h?)M^ypt^tGIphQSImDd zErh*#c;P_A_5H8zfxm$?-yRKPK%As{h)OPypQ||bzV-IFMP=gi!5;wNV1`^~0K2YZEI{BScU^6BQ(8K+@! zJ<0BEA~!SWcnjmqmROLv3jBWs=&+}hG;M8WnhFT9RcvwP#a z_4nl`NH`+_3<3XK9=OMy^WW4FVJa)wUEjUs+4$D^)Jn&I*qZ_03d7spp4EJEFxXrf zkHXVEUqS+E_otPD$^g#e(4wYhJvzdoQrhmj^jmj)$9D2Qzpie7_m)yQw{^+Ykj`8#H~IB*6M%J$2ni$odsb z*vPIpn}>uIdD2|^(e0>M3y(*iHSJ*@(4Ud&riiI=hXA$z|^;v#{(nwTqYixS}<&| z2;S)S)E>5K?OS=`bNw~8_1XMUhgfL#anoBRi*oHpE%~blldX9tXAc|^#cVPevbDS6 zx5l~jkOU5^of_49b1N9skq6)J4xO8`FPg8qpRBUJ_J!m~Z-Lhy$rbkf$z&R5#sR(~ z`woHyGUouLtF5IGgra5eG*?LoO`EHwuD5{fl+GP=$O@O%~0@WkT5wev|mGxJ(;m=dF1u5X4y`ePFyM00y)ME z&)s?9zO7Ba_m_Z_UMGsrc(R=ZS%}LK2tNSO`Z&KA1$dZm8w z1#d22vvOYY$hKPnQ>h2kAcwl93+tbs2ZdHErLkuAxPA2=W^=Zrg(vKGWcE_F-o0|) zBx~lb!5}BYF!@-480{+~fGA0>rsX|w5`jj$tlsX}~~NZvLfmC3orz`L^}3TGFkL^3jn?)4l(GJjZsDo8H1T z{5AZuH;$??9E@U-$f*joF6fli#BP%CSR;7(V<<*&W-u``Cr!L)CH&I zQ@Ku`b6R(n8ZDhHul9swFQLnMXhQsFwbNHzidgk8Rj$6QAJ+VZ7tTIVp>r$CG&tws z>rw8&`@V3MS3w-fB8Oi5HLcE+hf`0}-|r4S{?CD(VYS&+vk5!=C9hsER{R#3l2St3 zn7!5aG&Usm*X+eVBWkx^U&@pFbB++n(;vU|6ByT`1QeK2QFfaciD*8EIf6CStzkaTWZm;{N zS?<$6jomeKe+n(u|J~nvadv4K+IUxREV>n1KA*6YR^4--JUW*Q8g7j87@4_S>&^np zq~wlv#kEu=lAz|CW&o*bdH|%xtk@G#0)EYoR~!D|Ram@UeO_5SD0B5dKriQp=y-(O7*d@tEzJXD`F6=${Y8d3W7tJsZ?nI!fr z2cQ43wu08apMt6QcWn|_U6!gc5#5f@@izRaI`;}Q6J)#1>~}2fRp_k0dC=C9u$*gV zFMdY;XcpomJ}dQfnJK6qG!1_LZF9dlr{3sR)rTg@D!aFvrbhzvBO_h~YV~#L{*P@9 zs68%v>yO^axPp+l7vc#qvw97zd#ijIh4V|i3Z^f$5Pq`ec<^XXai-Z{sEzHoI?CEYp{I{AqVN7pYxr04a?e~aR(~;tcR%h556c_vwAH`h9@en5o;YBj z|5xG(1-G+4B$&M3!oFCPk$J+QKI4WN=j@yPSjo`qKRi)2&;I!^SQr#osYaSD;!W#X zCYCHrH4vX(#Fi<-c~+r3)b_Nd5`_6pnlhMY5UGmMF_&Ex<+en=wVlbW?~eXzI>uuQ6c9Ie^45)AU;OzDF$h|JKP(nsDDyq?+$-3Kwn(ZbeT{-+?cR^X`wN*dTibq)w+d;xL9l6eDUnstb`4xSvTZesFg#^g~C3-_S&uHqZ7l3Fv&dXCiNUEYvV; z_lVfY&X=vXM?OZr82e)w{itgedwrN)>$;z6J#GR7Tl` z`+xt6mAhb#ejLi#|HrVtHeuK2!SGK<9X40K@`l!DPmZsTObs8_*TFvS_sE@%A9|&D zF7$Bz+26xnqrw+|1QrqNV&=~_SYV;HS*WeXe|_Zl@TsSXIv0ey+|KBSRy@-VqJ7zS zyZ4CQMiWQT>+F3_R1D{A|I|lFE--kbceQtQXmHo-0rj$(pyZ6ki$C162YaSIoWuf= z;Ex~KF|t2iQgjS)uMQkv{F416`!zJbUcFlMNBg?8+P@P*U+z@8G!_Px0{7^kK!-5- zE9{0p!xXSqaWt>7x{H$7MhKc(=@{iDmw$=WhDnp1YSW&eC?eIxaz#qeSdb@ZBc(1L;S(ytm3H>Eus^%Q*&b zY(Wy?Ev?_mZPFsY`fO|^J(nS$`k}a9*{owu|A(hHkB930|NmzUGlO9?h>hgWb9*a5eiZElwGtUgRx7tl2rCBJA;_9p5NvD`Q5(#_qyGt+p9Bk z&bhAZ@q9e)550@Q?eyo`gEg0_x4J*ysLLG~7M*jAw7eeKb~@+nBK6s^)fWHXRv9P_ z#z8cz;AKex@t=Z{adLV*#yR5eWQVQ3ctdY65kvyGE~N0ls+uDaG-J5io7 z$P8c7H+TA4;vq2kb+E*H#yvduI;(G@%f)j8;{J*ulfgG+3fRP1MIw+1SI^(L{_V{F zow>2MUi^E%I#6l)>|I9i+^>7tR=pc!KNC#-9%H;RlsUf)pF!osUch?Tmxxp2>Q33WVQx{rELwFUvrNWx(F31Slb`Q z9c2`^IGwb7a;`}KUd^4f#<|s&E-8#w+h}{HfyCSCn#HAlEJ6DV+iimYV+N-8+c)L1 zAQo>0idoIrSh7bT__4tc_;WDI6pB8qA)~`gITu6yF|x}0Ray;B3CF-F;t{Z6>7%%C z{?0YlWez6<*n}ehRS)65Kc-h7rAXSQo3g237tp$b1=Yi+UYx|qCTN2mTQ~OH;bR&{nK#Zl_H}E8lnp9LS6z0c z=Q+}LYVw=ngIIz}W{{C^aRgP$VGlIt*n7&|zc$hjYCrB4w?@GKVi2B6@Lhrwu)1VR z6c)XY^QXVmP&GF~O8$-!9lLV9@GpOtO^i?aMBeGQ6F!G}QYZFw?kU~_JMa+*D$NpV zIX<>K5iKjPg+w0+i3%Q_&&g_S?lEE$Dkp^=baC;ycEiZhZc036cj!jL$9u!I!_;vp z;YHOO=V&*wvZBG%hbWuUs5vHkd6?c|DXhb8&(|T$ZP_g*kmA6^2Ka$2uE4hHF9T6f zc1}RpMP6H4851f=psT`aBWgxZh;_B(@DBK%J-EwP!!^i-UFH9*-Eq7Tc}Q7C+8;Xv zfg@D&G~4v<<3G={CqfE zyA=3p(>7h>x>>X*bE+?05th)IrinWLjbYa2*~SPs?XeggFBA5^ymlN&&g&>pLb&s4 zdoBj~36(o#q!fC95rv5H z(WuR3b4@NzAj`sNCxK2QZN*}9J@$c71Abs8=!yrYnr{~@EK}#@NlzCpL_bIXI{EFz2K3T=!#(tEr5=U&gXtGL&9zWV=sw~vw@|Y zL_{TpNZs^*CGO=AS=MZ$APoA;1p#|mFa`{(fC7vo(N5OSAhAn<>xUHa*>6|w79Kgp z4m>t+OU8Y_?aNc z10UPMdyFW36p5IS@B_q7g%>Zh?&cf|;bIk0lN7fyPmm@{2*@g&5{5KV<@t7qc-UnN zv+2TRd?4l6wXdB);}sFQOy$tBfNXa1P(`Q6Q*9~b3bCvJwUMNO(_hjv&i8O+^F5D< zgex>G-)wCM$2o|iB#5LwOq8?y!jn`Sv5aF=)4wcgDHQ<|vSX!+KDbcPtO)CKr)dNc z6%fs%L3Kyi!zhQrwC&C%3<6ZQt$$x232LZ=kE3BUc5FQ`R{hbwcv~EknId7s-Kqu! z7SH=mFr@bkCA0Df_G6oGx8DX*?N0HQ@i%nNu_$zt zU>i6`#Y@ib*)!PAooWab#r({zKXdqRAwE4LW+GEXslggP7*LIhcKXc4`5W7vkDa>8 zP$2WM(E{!z$d~&Wv#HlHS>@}9nk|-*QSB?bGXt}uc~%H*xlFeKa3piEI$BW5fT zF6;uc@zD3y2+HcH&_1G`C7Z@h@e#u=So5qR^tPPydyVw^`2Io3FoP#c-mTTMIa!2R z(UaX-m=;_}bS9o&I~_%DQ(@MOv{a{$C1N6uXoQS0uR*0%qc4sU_jqG}U3v%HN=pSd_2TA0x2QeWeTuwJC?{l%B5gzA%UiXoCp}KHDyN^XF9GAn6fF=gQq$i zokH3nzoZyG1@1l2bW~4q1LniZ3w=g~LAO!`kxKhREi9~F{QL?z`Qcm>80nG)QEVg{ zDn5+D94^{u8%6(m-KdJ*A05MK;5h{Mb?aFpP+Y?}H!x63J0+kTeWo}s+OC`nskUSGJw+^r80yQdS%h^sSxRJM=J6rwU*Iupk!m>zXBe_nXM%e*SQy_ zJdeUzUXE`$3}JrzQSauYvH{gJ9|*7}AWDE^;V9?E^|4D297`f$SlYmH{RUKA1%Mu$ zx%kbu>RXUN;geExjn|6F^{JOCtWtLEEbe5vxZTWHW4Tgv5`v}Vr^reDBddzrUo<(k ze5ZCprF}YmR!uE*;ls3inIy!lX`p}oF^DgX4p}?X3Zr^PWd#mvbt63_(%rw*I<%dz zbnt5YCS-v%v5G^;g9Ur{-s!Mprm9X?W!+nAv%elT3=!Bwxdc3Tx_ZzloTF_!+= z{W>1-=R_sAYm%CCTf%xa6|I!fZJI8zeY&aj1o0rxLN9y`J)Dkz$ zFX_5b(l-{_-*@?IIlt3h1N_-)7WpeF^eyvn| z18m30s%Y8>FM~Uspr?qI-+S}nFlYq`qIX@*0~olx+b7LL4mbjbeVqTyil;7K>wI~0 zy3NIdjERLFg*>k5}Ha%M>^Fw!d-}jqf!(DkmBkjSNwf5LH&TXm0-bi&49N z_gz~03{(v@kEPbESA;IQe5u%TL4*O{^Xn1t+6>Q87^g&Cr>(me*o?fX0i2wUt0CElODEP z!T9%G`ND~5HTTp5UwwLu5C%K_y-#n*fe#;?y|JGiP9U+OM#JFfGy3(isJLwXi?K9E zQsYVe^IkqUFsFqt{5@NVms7OVd;pJ%zznN@nN5k)pm(OP^hZ2?almo3!|8oXt=sa= zfefn0p%Tx@GW82kV zCbb`Tz4adhyBrAPlN3`hGm-_Z2P31o%+S%cHKv=oHghJM8n2ELUXVgnyQlhZ5nqZr zR#fV?7`&MMYre_7|M4u(#FOen_sdqtFBf*Eb5r9 zeMIX~H)o>`v{gK@gs)wxM+e%!I(wSVZQh|4nQd0BE!rDth4~;6P{29&tV}94#yH!CMMK_r3eh_sKNh5ztk(s>cpsa(N3}3 zOJ!yr5?%y5;>w4{s>R=ScIu(qS{Zwvwg#Sx+q`gL5q{PneEaH$F1L-R+vyX%ff@BG zrIWT+ z(5qPuU9Fd)(61qAWx@33v&{2n4b*HO_Z8|)*b|$CRfOQ?{`sBMTPzJd1Qqjmnh(Yj zyJ0yan)b=LJ*|$MvaU<^^)TK{le*FN_eb1vYQ2+pYs;r&m~QO(rOuJhcgo@u8EFtS zF!*K~slU29H_l){P}SKpbk++20mAY4{9w;nZ?!DAibN}it}{W?yP+*ubVeH4(3){w zkyTTS^W+seb1E8wton538Knspi;c#bFStbh^KbVba6`|(X2JjWpX1f-?Tiz>{o2>n zeHaeV{2d5-eEHbsndz1VS?(!h{B}QV+N)VTY9&YNI&eDkncYJ~tRaXzb z3I6U4ZB&G=Z13shL)S193Gau^gX7NK8nGk!m%<(Y`EWR~( zP^6Vxb;xgGZGsV8)42pTu-lhxh+G2n#pFuISul>|>0378Z}?KPGOPV1G#+emVKA)U z|7i;Y|4&=!rW|NGa*=&j$Wln}inyRFFf2T}coySEy2&QTcOo_c^AzJ;)9Ljr@0Bgy z?jZsO)7lYF7>&$`k-Ld|!#QIT!8IewK4Z^5k%cRo~d@-fqE zk?pFE?>sy9wT1t?z>WWRf!|;U7LR<#{}nPn#1e2)&`ASz?76c9aAY{M7EmPaoAb%S z-3w#*IAr-8M-E9l%W*2PS4YSM+%>9x8;#abLtaig(tVs`_PINByrk3N>PyA->Qnci zirG0vI*kPpmHZthVWoS(<$_Vsfww(V7-94F1nTYuzsNjXnN!ABoV&Ef#Jw+455j(U zy1Z=CJ=^g(?fJ~(A9wTF5#rx3eUY&pSm?a_?!8g>wzS1(-=43&(3GqdE?_+joiuv! z&MlskBJlczf(NvomtC)mkL_O|JM4fJ>>zXh0{0CIwEtf``8Bd4zdmf^Io}e-Xs^vR zK5*r>GBaQb@hQDfKL-1?oD5gs_v@R_{B>GI)Yp~eU6yJ|#Qv#gR*Capu9=zW&$U-9 zabt;NSKnPRgUS4TaUg$DD|puK%83jqO*t8+%e=M!x02ZHh@p7V1XsRJGEc_e^zFvw zevDi1AXC-h+mC-K8fx034gS(7gAPdGotI9|0l{IjHToiMB#%EO_(84 z-xSwc`*b<1OKO2B#F#UJg>K(TgxA8hB`UK`O@59DM7meTLZC7!H)HcNL)3aZ#sPxn?)dGnek>_|x~-;#iL ztMm?)ewfj9M(dn(%al1O2Ph9E!gNCtPxy4E|1yW8o?o;+&r>2UCS|V4 zvh}nmr3m_PPJ=unrV6%c<>5Tw5Z7mArw|_mQVNylnJ6r~2#5>V zf4k{<&T+U-=Kau*3=-X9Eh6F!Bf~3%bz&`Ix>ru(OV#ox@xu5w_$LrGvYUDRDD9YQ zAJIXCxGql{_v^=WvZ}?#-&PbC+Y{T-fIG{Fh--pv$fzrxzTKomp>$3z9}sCA-rOOM zrCw4%!h%3LN?+*h;kAeDnedTpGD2T)+wV9gj3SPNxq&Pd2z2mii_CNwg75+x3q}!F z&l)`CPFvc|61CEa#}A*<1(5_#6zmqxO7>Rhs5*PhqC6d+N874t=B$!8UrS#Nd2AMK zzSgrH*x7N%F%*Kzs4C+O&WXx~1|#Azf-u?t4t)lDF37Hn1G*^~$@{@Rks zMPtpXvr(qIgoozPaN(8Qv9q^Sru=DN_tf}?F01O^Q6$jYLd`JaiCw`2ddHo}T{ZZv zCr8)z@UbP=4Rp>91Leql?4$TWeD_#uYy+)Q*V>MMqw@_CP8Nh)k>QOixaKS8mh1Gf z4LsYymuGogR1Eif34y7X2Q-3ZUr5EEbyL=fhZ*Bhem0}!f^cjE?6*}oyC+hY6q0PV z{wzYtyyBbax@2qnYvt;D-vjW}p^D+w>F`XqZo>2*2|>ulYbz~2Kibs0_UFlYKW@eP z;^t+6x<^ATIV8JnQxOwX((Z3~)g$PGCF_*vA#7QyOHjTyT-&~J#ra{@sp<`$Vpd^ur0lh0eZ(6R&e>`IZD z2D78VVQrOaL|l16j4;^g&yn-GS0D%+X8DtAixQ-R-HDq&$4F>7G0*-PLJJlXIL;s-V3zU?;Ie>s;@VSSzpR1nWX`Z4b zf(R0cGn_{W2MnOVhgE?76)q{{r17H$ z5i$GV6Cd5f!nWrxPE;TrO)&n7(N7GQM{yWbL%Dv{tMUIl^`qv(407e(C=&Quj6z<~ z6J8b)rRt9kv;siQQIOTE3?-bFwXTavBQ-IpQU1+KCNc&ND)x=x$fSba`ZElDWahw zd@z&T=kxQpakQgJc4W2?w$EN6aTT62BH$35ONwCO5wR?F53Wz`gniwHigPkc^Ex^- z>3N_BBn&lGk2Z`N{_FsKXj9eIr73~twb4klsA7#`9&19hbP!ddUMfJ+PX3?(@SmMZ zi98`A5F{ihAwHwTP3j4IjbUM>U@Qr^*ViTrO-6<3tQ@}%R^pKc)@;P!B@R*nXa)Vc zA2o_ZUtnc{5OBJ^w7^y(0`@_g5{i8w!R`RiItQQD~>L7uCcetU1$XI%MygxKrkZj5X) z10`n28aF>a^(#ErS^I|ZI5d@XU&RlfmUPoO-E)GyA51Nwy?(}t{_Rha z`k2icrC0q;hSOye21jBa`cG%7iObSEt}Ahhp=%YxRW}E=9~PoFuap5dxaLtdt-V`v z+4v;x$Na^Ut+taanF0bctb5eag@{Dtt?Es#;nw1044S{?vJyQ%rS8pkbR4;9y09IT z3Pf6)`o$9L*DK<91BWwg6VrU1;^HgfO~6qkAT2_1?|A+ZL>c+Ij^_=@VwKM)H^Zjf z+V7m2?O{zr$hRR>V@*NCJtx(IRQd1hEUsLSt|ZZZaAo(&fBs&cyhcDaW|I{>Ka47$Mo^GF#<=G^s;c4P%l&UV4PQB7*yi&rg>t zAuwvcJs8iwcZv&Znh_xCr_uDIOYKR0&WNcF1XP`s!0>lWYUr|n{d&Fz-NKUupp`7* zqNT6T5v3m(bQf6vP9Whx%_NdULg@2sbB2ZOKuTekcP`{$YOZ{2RO0lsNM)6C9PyMG zuEu=h8Q1xpqyl@m!Ld?=KY7ciRxhm~)sP2zG&!IT3WQ*~7g)u)ETy~e+8sTZ;(}Sg z&1_>u$d5(Q!d zSPTBU+vtb$+r2dn?Y#;9^7!vvc`NO49*_-bs>Ob70{df>QB&3zUGWR`D;i4hZ2YJ> z0@ep-vm0feUAGtIE%Z#%?7OzOq-m%bVUc4RAJ$1Ib$A@~ZKO)s{bd2(rq?lbRsFF+ zSWL~tQ)x{m9D5Vi-M%ni< zkY@l+P!`mq$d`)>4=*ClvVvr%fnqIi``IQ5Ue@iPccKhUOpqa(_}J1=UFkVFdS^K; zQ;2hk{8Qi>q5XZgnI?HX2Kj^W>fMo3i(}gbiG<*>YsTgN%lJ=tYN|5%_a|f6m2_>} z&({&evEGKdz2U#=14COw+PxZL%R6K$A}owKBlO8#oKt&U{)7$^p$ZIbe?S{%;%K;3 z;bSrr*}+tWWr67>iEIc=6P4HHkFG2iTcxqPs`^iOk_;r?g{JCr!%>-&>``jMDn-_6 z_*SvN`|0{ZujSrPX9#?X9y>0gx$?=YD`9LRQzLP3e$WQm0m4_z(q08trMk>R`O{SE zCIfAxBciwJ$sR+SkvouFH9Kz4UD{KBku0Pp{h{c4s4S81R)l!lT4v<=OJy*FR=o(q z=q0vnPJjuXkHY|hYioJZ+CXoAHJfP0P})OndksGzCF)>emc*)|>cZNn!kj0C%*6xC z-xxLX=gNJIc+~HGzebOCpadN13#H~g^AH_OKXLyU%N_(X>we7pv3)uY>3BP=t;jiU zB5J9Iksr_8X!CbhDub99tE%>=AGkx3SW4<3J-7T|D}6Tv$U@tZ116 zu~+&}xOD9{4v@FW8<{JbRChD>+xN!J;{9s>ocryae~ zV=U8E^W|aJp21#a*Keuw9uTyncgMSS_A}12q8aD@w+njVdq|Nm7Tp$4&BQmgbPRg& zZyMU$qjg{QcQl5pxPSWCAz>x)i#*Yg#*X8`}kg zT7knKhK~*e9SpEz4(tX$igZ@H9Ez3qj73DI>X@Sr5uWrFi(+qE7Rh@H zwLf_>Cnqr5SawHv>szLm*7KT=np5o5?Q?bVh zIDf>Uz3Bs|KAh$>Xc>^v&&mE4cRD6H*_YbbU6DohlNP?%UpwWNuZ|9`SsEC|KLLO0 z>b7Q)jxWB{K{E^mi!o?y`r68PESgPWS%mFdjE7wahy= z*3D0gK?1dX93MV7pKr5%8z>-?RnV~+{VNn7{N4Xk6WKJMtE!Oqk+F(cbl|`U0~cCR z4aE=b*lAbi9shB};JuWIMTXEj+c;74BD%lH(K4T3a(`3P`#ui`3{;h5ZZLKSDlL45 z>madAh+*^l^m<^M;mmXLOEGT_hQmX9Ezhq}6%AqOrBh)DeX zFah!X3)~lxn*L8jGS@zHHw9wu(rZUM++QlGnzcu$=hY)tKx)A0mp;KE3Ud~ZL1e$Br5lvN@o>>J@BSU9~fQZnb`-03CcXED-R zk}r10R*BU5o@0ngVO1;2_V6T+~bDF-HaYYt-q!7s?aiof?+C!c@J2p6`yo zy?iVLzdzszeKa<+JF!;N8@gjZ6Nh8j`#lW=pwT>9R$7EE=`_Es}j?ex93>Kc#G4Mr4n9(JB?Q-tkc_-cECtpW}rO*4$J)}qsOeU;NQ~vdE<6d}; z>Z0veBD145MSY04-8la@k%%Q@G>hgdsCbX?_DYyQE)29Muu=ulVXGf~QqP*TPLu*5 zp`f_oTD^gM#J90@qEt{!cl52vczqkud(N|slU_4EtBuj8tyS`MW!oy9Ope6@4j3MV}N~;wfY$F+@uzfh9bZG=>_*qk7Nj36+~;ll#Qpk?BfsFttZe zo=NZO1BhN2B@ykQh(t|KA5G^Q6oe~9N`;GNiJc!(vI7yT3o%1F{3$8&&+Xxk2^R}@ zcS?EB?bUR6ZaHRLl#7Sy7udhwfge+he=IX~ZjeAK9PLO-O-hD#ZpDbMbg0Dfjx!#0 zLy&{_(@o=ywc5E!)Be8Mu}#XythH`7DS@( zi~M*ms1vl2>C#U0IUS{+2A;96O=%vBTJc-(n^Hv zqO=}ht;Xi+j=TZdm=A&~jjid*ylFEt8}FmSa=RXep!}PE9)wqJNpHbxv~7vP7h+yS zKAlo<3REAQ3?ayc(K$gQ96131Spw&deCdOoYyC}J&Z6+}_2Trf^)Fug*8o#ic`a`W zupvlA;x;oY{#;;a$aNTI``x-34&cE}3BdX0Ue3*+RE5iiZ-o3nF-vdPMi6Bk>Bj29SmZ1|_BuE4B#g>WJ9? zFJl~E+{6*^jQ}Qo5>-5|BJy#9a+37`E%?3?7btPMw7q_5&G_0;MQeM9+aV^qHvNKgQoTbgZfOoEWu z)VhW3lrZYuziX@j62-g#`&05cc)`kQU8oiT`&BlsM}}6y?*abJYk0Olho_-1>OB%} z3}_(~Pks8c{7~X|73t9&h<;y?6+C|Rlq*QYPXwIL9=Vs3*kGPG2meBoqOvrF(S_H- z<4#X^)hu#ZbbGj8TqGyWH$*cQaC z!vAk6YBP3l>+iCr`ktp){)at5B?L$#A>d-C(-f?({YttQdXB!4J8(Gn?KEx26F5Ff zF5p5W-|a9R)_s;G)wynmtjB|AbdfOikn=t~FpXUeaTcUwi?@Z2_3P1KLl9^ZX}pw8 z18*X+A{o(VX#I-?=HMM!Ao1nJ-@4+UCa}I>{Q$&B5H1#Av+YcUB37sm}>s&)2>6&UQU2g!ln|LBS(|<>tTY@iXPof?qJu&-^M+v+xVd&h|neRp{9m`_l+Bk_?>B8P}0<3wS7EwVz_{s*F0! zTwPZnuHXVdoR;$C!Z50zg(YVo52j&MnwkYvOT>*0ggzS@PN5+eVubd%5R-L}(os#U z;$fwyW`Mglif;bGYyWerqStV6_&G+;S}?3i77w2vUcEmRkGz0rYT>_-JE$vjnlAdL z)Ld2ESXD@@?=YR@DAyv7!A=auw`RhNdf1LB2xvQY?2tu^q|wt!aJ_tM)F0H~Q{oG^ zzLl^9-V2souv0Ti@Z2dF9|bV2PrNHLoF=E@;j_B5lY2!UC4aWg&FqNt906s24v@fP zdV6pnc$MI|#CbmiogXD839`We$^qQo&Y+C+r2boJ>tE?qmS=jDBS5AWggb&e-RWFY z9nHKrarY{E5>5-GM~yL=RSwz9&3iOQ9XkvL)~1hZN&t7H!Nf-*+9-Y8_TFh8l4!(l ztv4J&bX9EN#3_+7Lg~cgZr`_>{?-w4F?GO&x)K<*bk*+!d3oxtK)|{4rCRQfri@KLO1|2LM^M%QvLrsH-*W0DfM#+1;Q6}tTWT5zJf8aT zU>y}iNhr3Du7NTg+eXx$oyN^&Z8|&Wo#6GQ^NTXu+&jvS_QQ^)BTVWtw0x&cX;z}h z-TitE6gL)62<-nLlEtY{-A&l?Jcy?ly4wAD6QF$Sy3r%*Yx})5FrF*|Jb3eu^8iK{dh-(9eT^HAkPQO}moN&~26^_iQB7Q&3#k`*L{kmg{VVA;ljk5VN3wqPZyyq2^ihwU4*?eXX^EC3B z_0yC8lhqz3kc5NmYSw>Tx05uGZaSd|EwiT>9lLYzAFV(X5!F~L2-2nEdWUy7sk6@* zSB90*I2=Edi6R?ml1D9eq>M#ma#?mRwic+Ne&O4fvjm^gmBdTH4Ijdt7EI);xa~{q z^KY$6_^n>^FtD*YVBpzc%kpmNUQ|^B1DbiX*7FeEZOk1`dns0oFpBRZ3G!H>_cAY> z(WR+h7!B*wz^5DqF=~xSo`~w&ixRVXA?+#7-n!}U^dyE zLh#SL*^-&86_jIe1Uo5V@41mClrS8md@nQ8L+uGZ$U4_(2kFkpyQb*AiTY*^W%~5WCZU5UuJaN+R z@vo}`S0itmi3P+&d+O)ML_Jz`dqN(-gmn<(y2-llDch|-RJLB9)lU;j1(s?b zSk6{mN2^8e^d6p#=*Y-~RRk|w@6!#XkA4&iCi<-Q*$$;|pW9JgDJI5s3!S4}R@M2g z?Wp!8^#XTID9G)6TBJgI37$HAsH(sJwPFEAGN^92#Vods9|>0h^Bxwk6ZyIt7=$kd z{h91Wt?SuDZ2{Pg1tYNeBy2}WhAQ@S{5R*BzUUIIz7 zlKnx88mj_FYF|p`r@Bo<1tz@k4a}Py z4h0G2#i19(>9ip2{ahVrmCV02+OZLGj&cjC&149K60DCNQiQI|8=SnfneIhO)J%7SL2_9DZb!wfydQWm>}3@|3>Q6N}3R#uI;(1BVzR0l`z-|81zNr$dlWZz{C+ z>+V1Lv*4@Fr^kMu9M_+^@*3K4o6Yl?rL|pC@3+&Kt~!?>to7N6!>IMc7lx)*qBn1h z(c!?%;R`1wugo95+%2RXDEb->d1Y9TQ}6&te$Cqk_*PRh8tAR(TUx3s!i zGky4`e2^KBe`&<2)F$mUD`yLJ!@IBFALc9Znrf$dj3}*59FtmUY)$2X;+%Zek{PmT z1jfLVzpplU{$sRGX9Zn}zEdhUtq3hH{i}YEv0R-q_TqiRiRZo##}cA+%nD*Wno8&6 zB`>rB_mv{%Z96{|Ord+5|22ryLJn*(L*Xx3#4g*Hb03I|O!rLDKX?oF0>i2+kZTj$ z$X4C%+`vxORbbO-M18Z6Jo4}~FTZD8w~Gy{1@;~$jgxTUw^)pA@AIldODA5X#h;2! z|J5( zJ{d=bPb^KlK6pOv+#yMvn`l&ay5wZT*ihg9Xa%M0=G`+J9#a8{9%s{9{|WJ^xp7|2 zx=YP;eroxJK|Gk6$*5&uz5uel!^odu{8QY1VaxvCgiHmq<^+^{<_*;;5^91$sJQwm zrF&UMXJ8Vo15a8d2sTpd;8QRd|M>sO*z)@-@Bd_M;D!8+>$@m(piQV=QxDLokfbR? zRO|&x09WCwi?Nd|+tslpXZ|{JKj){rtS(&=OnLdFYc;NO`}hr;Fo5&WKJV#&s!HsX zFgJ%^OO2s;I4Zm=>0Nn^$-L^9dxGw7tR-}1&di5y)Cjq=HuYXon{b1_6E~DraC&{p zIL_tlkElxu^$Px+fA!?;qqSezQnY5TR+cY5tNo{N`ay9~wzT}UG%#A zP9b^=eww~q^!sXVCj_f63ddZG6PCFYt&qkWUTS*_T-5)WJq1qxzYFZ89H`Q`I^&F6 z5Tb37F^73kFdf4qubO^2M;FkX(W$Ql9(K8CB+uyeOKIy>7)Oqoujw1vTFTrwXxx~_ z&_?D`I?LTb77^yNQJ1ae@; zKf*-w^i%ows30!RnbpSJ#tx`?3HsTR+F&C>XgLAxRV=SwH95j+Z{6@`eC3B#Nus>y z@|(t}@r!pepqUw3$3cGjqE*YF-B#X)$U~9~u_Aw1nT6D}a#ebL{%){utAUa@dK+wmk zVa4F(y}Z&U=FbSF&M||qx%aatddEzTIwjIWg)H53kJ#|T8C%hJHRQr|)2-I{6DP(b zfBbriK3AU;ViON?QThN-PnJl8H%34RT@HNS+(n=H_@Ki}Em9O^ITsL-9 zjvZSJqvWx`ZXj6|&*&S~v49*{j2`76f&n%*uRqpf8_Zqp0m2LgbLpr2qea@@pd%=9 zf=1DCdfDiJARbZs!WJ4$omGh>(fVhcAqjK=c=kOk_4jlYcfGxa+=Jo;MHXiXrV@8( zuO4fSo?oqf>HQ!|Si;Q>Ea>bPSLfjp1VPyP zrCz5?xzfM5_;|$0f$|>-88kPCL|^x@pWOn{B);dlymoKUVj7bCCOVm(x;FLQUyE;+W$R_hxmaYU8px8Y_ zqym?GV02Ol?0AA8{F_YN*V>-?w$PK`o%Dj~uBhBdw!kjqv{Vt29y-c><3 z`ppN2U`{g=0E&E+pHu`=8#)Ne8VqoC01^rYoF5e@ujGYA>|)-qz?8VJHLe_OZnyNR z_!R#rcd`Kut;XHgPra;wfm4)Nz&W?sxpej+yy5cB`G-Z*a2isH#Lj|yx9)D)z0ZTv zy?|!XeKJZcwPu1M3IzfN<`MaR%=kW-D^-ufuwu{%4)x@%A*hVtA>nCC67n?}rluI! z4A2S(0RS2`y!v5cYGSrVN#!!CsO(91wEmTM%W-dWo&RVZwpGE$eiviXS*$EVtX?f2 zNN9bSly++LhK?1|>_8NX#va<8l1iRM=4T$^z-Vggm>`|L5RUqG2UK@zIA6W{yG3Qr zBNQ4B?!pYr0~1Vyu|wdx?UhQ|^?R~S^H2A}J_?_rl3hHnvnu8;gkSavHb{HOJzSlTO!5BsD30wrbf@9+ryN>roY6N%vZ_U(*gy;3WCa+N7^CDA+3o8|^%UN%Y(SPZ4em2ng*}mP;3#XP1odcOh2RrCB;f`g zeMXa;2A7m*Ia53({(b(u9?gGz-A9n^?N-tEH>bG=;%}{f;}wdlBR6T3lA!sq6;CCxQ-p4A)vt(C3DG$=o2_srg$6p8+u+%> zQ-6wzcUN0C9Jdola=L^Ixa5?Ak+YUQH?yU}S>DQ0{U2MDo_ozoi6)9({xX&%mr~T8 z&B@%^e7BKbo_bH4D5=VY=8vnG<_nsg%zkkSD@yv(Fg7eXliAMbDA4=ECK<>Iq67@5Q39Ajc$aQd^acA&!~oeoeK+l{K_=Do){#gGc_6osNV&u zo~AhW&M-A4U5clQFEoc_ycL#-T*IJD&i31(3jqL*hre43DMpHwutZsljc_pYp z3n~wQ?X?4aOXCXHG2R3eT_T=V{4K-*PI;JJ-(c=W$^g|eiXd1_<*2E>jPkAsu>@%<|YeASc1DR3Gscxhq;J-rU(;`a5^@e(K@?_pjFtx=wv^-G+|46xiN2&ROWS8K3-g1S zgq|*u;*5mRKzdm60?5j%+U`#_xaE@pt)Ef1niu~-{2&@8qSDHe4md|4!0u?c=No?U zaNy0I0xFp&i3_F?G!*b2F+Q(W>6$e5?89`4=C&ESo<}#uv~b@_Zxb-B8LvzZms`}J zzcj=A^1V7tFDa7={Qp=w_durG|Nrk~8^)GHHm6M?hhm{Z%!YEPP>z+D2p#U4s74N( zIaj74k{m0dqQhM(hmA@~4oP$;Hj+cdmeU;fyZU^8|8@GKy}fr`ufy~Ce7tM~>%6&b zJ?-)8dwYJFtv++#d}TSFkc|H4U58T@V{amz2+%I7;uVGkq-j5T&GZu1aY@u2w#eQ%j;uDRvfJ7MJshcA^$%<#3k-2Q&`#WNEp*oR$G$g98?oz{E{v@vx z_Af#&F7j?fInh{;kqz(TvqHgHQ~ST1YI}5c^|RN54VV6%YD56P!Wt0sufu&+{od&I zS#3JltL*YLJpHtBBViBxFHO0H1!hZpiL_f)ZS`aCvln}LaS|lLa3o$}7`vH`gk1Oc z(lzpA%vRUihAMvmp9}*JdsVEs8UW%lKOGJyy{8q&%F(mbOu+K#r9c~mF90ZY+hddsqLTmtXuE9B)D&S!u%;h-g{&kPK0VE(6k6NRf zuxb?m5YxB!#fJV_WVxWJN*CU*PVhVB@RtgIZT1)5Q!~5IzwzW7$S5!jnLXx)w13u| z8FT)h4KE%`ZnP6q5~P{ux+jS#yUuP8+dlpC)DG6c!JntpYMF-waZ92e$+g9o3VtDD zW9Qfl#Iy9UOu|UYNs|l=k9%XEBE&!nWgX_3>lS}Z2>lFa$?6G`FmPFhTGO-Io$9cY zrOsr#z@&S09x}HB>~rsv9{$4Z;?4^h6krnEpDmDGXlVfuv`4b%bNT`DN2;vo+-f|vHn$WMlkJ0nC8uS zd+}vm6&8@>&aZjKH`;F>CdU^BX?!*w{s+h@pEZ~=>IZ*@;rs0{!}D8i2Hr9yzIZ^W zmp}h$AoBk67VKlpB-P}@JoLsBGV%N#ddfL2UlKA#aEz4@FA}~ts+hmE5scNe$&U2; zaUjuN;D4>Bm$;lkIKY7fIk9+VNhD*L-{KZt0shK8yjo72*`L4KguMyXX-ZP4ef6!* zLL{`+110P2G!y!5!!&)*VmjkRm8Xkv7ocZ~$8~h^pizAKxwTxr32Qm`B`md-#iWVj zwr$0r-dFUbhdkkR#&6vPo%T>iMeiG0nEq6GVRo8Dpq0d(e2~M13)#i;XOJu<75GJK zSxS1WWhLafUhr>gR4Z4Y*`Qm@hMbMpg!3WMhU3MFw_Ld=<{AQ0XuHk9;a>;usX|A- z?v01Sg(8$%2UNUJ1pm88Pfe;s^;8!56kNn3YiNtr2>Ck`jorgSV;)lx?!0VHs9K)C zSXu5^vQcNT>V+G{q`duN7qoc+OO^GC{h9i#$mf$oyk~c_D%>71U+;UaDpjL!ZfWr= zsJ4UWm$q{@THcP^ym&0Qqv%&qJ}+^lU$!UZjPT~cpUvBtzO1Ef{c!3+$kLgUXQK>= z%%#Pjm4tv^tCYQ}f_U|s_iK^9^DUygZ~6#3b5rQ?o6dBS;lm=j4$#u0UHSVqy^6=7 z{FOdEiLRN+A~J~9e}{g7T&Y(Bh~u~NVd;Nn9o^IeSuy*nWpE$7{+?9Zo@^Jr7f8;J zZ+oNXTJvLNdzaNwl~b{>6T<(pl62KiT(?GbbJ@j+TrkUZ{z|l@pm&x+Sy;5=rNQ#s zJzDTVHbe(t6mRJuHezmo9S)i>W*%VToq1Xkw(c(P1kc|;`ZRJ^#Cww-aRY|+C2}&z z6r|QJJ|#TZ&NRPZgL(#s`~da!gW=M@iU5d1-1LQs9_ohzP=@dDSn>Ye-7c3pTGqp% zqE(s`X$pSVDqi$kqAf^V$2)C6Zy>IJk|(Jdw54Dd&%~n^#u`u4!E!g< zlhh8qhLj(WNRd?6{imB=oqj&bdLPn2s-!xQL^RqromuS!`8vnMMT0Qv$d&r3vo8Z=UxtqvNrJ;*8uVvvzR$PcEz zV+g^cbsWek9z8xqv6vSnyZ$F2jX{2w?HL>qkNml)~76NJ0L)O2cj?q$1B1w z=T@ASt(NM{*p&i3h{Pma5V6s;!2ojYD!^czvS_pAdTn88j3<$JVnUi2fKFdxCCGm zFdDiRRxm`BWZA{Nv(whMTL}O)X`|lq=en@(R0S*8;TX;NVRmOiD=fFgW_(1jblaT8kX!sC{2WZX`=L`T*Kc~bp4{ zqFy_as!1WVGSwkeTOJO<{#1UA1%4j8%ZA2>-?6j=;nZ)&V4qLjA7QZcwY#zcw$L&nYvyYykB-#vrly1ZfaGML^-E{(&!|;jE}X3ndpQLzG0v?M!tfCfG#kyaIa3UIuun_ER)zGa`P(| zT^D%JKzPzU672^EHjh18qOSq(NvffP?*>V!p~_qOG^8+q9|6`-?@8UBEU6;i1xDRLL&la%1;|g0(}0j4+P~ z`VMEZyyuY9Ct3LW&hW+uEI=I@OtO<+udewE13{6tdmF7b*S@RFl0WG+t~6a72NVx4 z0toLp5Hk$qxbO5?>nC_^>xK`e9=y3kJk--N z@$YH5L%)?)F4STvJ`@w}i9DuMkdu|OZ(El5(a0;G%N z>Mgnb-Uwtl;K77bk)$2CIL~;eVh;ZT1&s}~F0Qwg1EAe-^^(!|7a9kOF8rmfAdBhi zl5Ph#LRiM^>@8yf53uwKsj%=21C?#Cn8;McYX|) zv0f1mFtju8zSRTO$a*lZXC4}MhbSvgSz;|s&~9c(m}!sqh1$2Sn2hEPF9=O6s&uux^G$M#BgR4E+^?o15wii30wbSv|ALxi_WsZrI6Jj_BG);a_nMG zoE?HGo0Dr4Q45sxA5)GXFEpVSc0+Re*7F}qEO4pu7Lg9?%lkgzhi|{ zi|7TYQdx8N3IquQA{qr!OmV`0(<2UJqw@{94kahd+O0+tU-UfQN#QO*Y2 zX6$AW3x}$NLq?~#^($V@-vACuiAJrGE`T#kZPjMpjFIn*M=izC$v`@MJK}{c$-4YZ@PgCCu~rlJJQA7VqX#1duN7&w%N6Vx%lwh!*;t^4r_Lc zo7?Fu8U5(?!PqeHSke_Ol~k>8I+mYYy}H)-4q`wF?|Vrg)cFvYuzd1EA!Y z2FewHw4zFA=)?P}_q-h{S$S8PdnKlhY@^-hX@GbHp>u{qHv~y*qj4pTU*tbBY+=FBczF zEiF@CnTU1&A&? zL1YFWW3x06Q2a0tL@DAGFe;#UDQ4SdrQgCsga*;0md53`dK?5XV<@$t5hvsHfEGh1 z>o{?z8T^xj?!P;;;ksGi`{H0(EC=tTTC1BXtDGFM_<$m` zoMU$7%9Y%yIek&vty>j$r7Oi}=klz?W}yz`G8{Qh+N1o4mR#^Rf!0z0^^BP@Y4(1&4_EjZG^oaS=7x$_M*Fs1+ z&15VM0Z-IYLJ3M{wH`3=h!_kU=O6)`F~7OH@D#`D9&HM)MTlVnjk-kwPX%?419?&j zt|2va0ur;9Bac`X(AB*?=-VB$=u(Q$ObuPbF&zwKP^%3m;v{nA-vCn`1G%Kc2C(z?h!a1*M^kSnQj>9F?h?))%D;a zf@Okz5-IAVgla;tNQ7jUI$Us=(gy9Sw!c8j2(m9DzkEaC+3E}MZk8cQ9pW`;r5QV# z)lM>lxAWm|GWf+ZTY>0x??Iy7ty7|3*I-Sa6?hdwyy4v-DJCihkebPfb+P!hDfjP$-l| zbOIM5_aqoxQf5Md`VvRiXt1^wuvOBbXtpp*8?-jLPjs*XBZH<8JOU6_^#G>$FNwNz zI*T@!8`louZ3Hd=^x;E3#UT^Ao?SHLan=H0okCeSkFun8Fw{#TSwzhIoq5Cga`_<; z;Y?mci?ATu#2QsC3;$(vSJ3KT3(JljJti5nR8(1iwV>eonA>!qion*;i;|+JrtU(=o32Wj8B~An4La+I7}+~o}HJsuz6lOFY{(Pa@+P) z%hw2_p&B%r)Je;gws0Rfy19|x6pGr;Y(xHYuq9`z?r4OVjgU4hKAr2Orp(&P0 z(2?e{4zt2!-`@=F*Pu8bZ7jd$)Z~HKV63EA0jHrSp_{3lH1>omM|V`8C%22GA`VoB zlWa}-SL`^tXQ(QP6|ll0ESzMs?CRwl0)2N$BON|u&o^!dNY1wAamA(sB}TFHs%?NnZ22Lz9_Z1F(Q}5 zfq4ExE1(nK+5ZEe@wCppm zfTRv$vY^GB^LFwMB>l?}Lp5-Zlc;hwVBEm5{ac? z{aS90wn3J7R|b(@fDf4jWPvBcQ;WgS_}Dp*b`7E=)|#TyoW!Cn4o}$#7-|gGp(b|0 zy6-K)8)}2HT02sL-w`T1MhBX##eJtKLQ$^G$?lvVziUBOmiu%M@f=G$t3Bknvts>QPL4^_wEkD@bPeFzb~eM?R>+;^ynn+*q8P(e zIcfZ4Vv|3RQT1O$fgO|yjz*iVa1iRNE!tK!msL@DC{PwjL&^g>sH|yL67)#fa0Lww z=a(dsAwL^RZj3~sqtErsh#3~davA`0q2}S{opf7TS$sSjYXYA%E%o1ETdW}nZ_LU8 zCblYG7p0NP{*lo{7|wuxzsmy+nB}yW=LIV7wDCeY56z~aZc5^z8xn|xd(l*$h3l7B zOdL(|WI?PgEY^@gS9i=(@MOT^p&@h?=rLU6lv}?7f>bu0iRU;8R7Q@xX=j_;&)<-k zZvn2R@s1i3tQq@y1S9nLXr7ww{7N&cbA9ew%esdh(n&%hnW~^BHf$DjQn30ny9YI+ zAG#?-wiIqxI6vt-S=LoA{ECZwpbAnDrdICNJ@-QZHwh39RKI~DbMF$l3GS<&O`Ral zMF9%IBbS78L?o1fSFFDJ+JCw*a`Y8F3E+AUVBo&3pq})>z+)QuTEoMnPT0?@S)^Rn z(dg*+PudH-Vng!_>%@W&!he1-LS{Upzl9Hlk6)QiP4A)+V#-dLGL*L|Iha4wO1Bsn zfNzmN|0Hy0e0io$voD2L1UvGmz$7}gFkrqhMBX-9NRVy#GU!-Q2wS^S;2y)Jdt@3sdHk=54jt*QDOMI@&)I-fs&p^xR!Z z5sm9Cj+|sFaGeC5tA({Qbzi23h49B^^tY2X{Y$@a(YcrMY(9G4(I?Vb*R#uaX@*pc zhge8gg%w8f3#&`4O<(ty+urNG(LW5pfoR2H_4R-;P?c~xPo{CD;ChGs z@7eqBx@SI~u<_GaI-Uv==t&P=`sC|;*bS& z>v{=+Z5};+Ckyr=9=fwVF44wnd!g_$q+7EZ zOsI6OU|3%+#HMPb6ULjy*^c-=Fm3P>1O9OZGA>aRWVgeC&f5(n+^1N7!Rt;9n-Qhg z39Phi@OE8Buos~0WhJR5W2Y)n%~dkHhIR==w|;ARIT@7NI<->#(BVW==B`mQj4GCj z4pHKvQyZl$2t>d8|AdJFe`Rg|6DIbt*6`PN$&M>|sIn``x`*|5O47X@FS^iAC6D7T zr{x{OcbVMQx-Zw)&YyIJlny5+p4vLpQ#yD4>UwVk*u!E9-qoD7-ML!p5n|il-qDRpBt|q$Ee%!T0(;#)crfz z6FHHQFqa_hF0X2leOyiZWt8jvYQgwFubMu&&54_!a`tbKPj5FBN&Rq;_X#w{?_u+& zTlzDekn9a871j=~JpS2r_0Ex$>mR{~0=hkiZxA)c-w*g#x7YbU-5#>2s@eQlLJROa z=*D_2hVwkNmp+**@#Vj-yeYVcU0HH(+Kk_Xzfl+2Ld(jKYc`wi$4GW>t_a<7t&qXB zfX1`bXeF!6M77bLq8PTIvjKz{u9r(p%Sqg8qK?c&o2~hgx;N7Gle(#krB9dT~`L4mEC51p0a^(tkchq!B zwCGhfh9cM?W25N(O<;8Hhg0eH!ICV``Dj0a^wv*Y?^H){VjfBQE?xnHLjs7MUbh#? zSOlB{f|LLZ{BY^`{l*^x@sL@%g|lhMuZ5Uu#l|u!8_GIms>BS(Lpy0m_~^S&d6p`? zWt}P_RwLF^mS%q|dQ*rf3)BHEmjY_XLX(%LQ#P8X?x{OhKb++zEo6RIsGRAerC zbAY~Uga2Zkw}StbqoVREp4sd_p3TyVe<_yn*{_+QDl1+uAGg(FSNtrdn%|^4Ic!J< zq`rrnG}>>@*%&!>-wJ~zVL}JpC8CR8+vCE20t*Ip~nn-80|wv5)<-58OT z6V#}qnx?UYx*X?h6nl?lQ2BDWga5cxe-rS_)`fU_f4CforcI` zUr)dMasNc?`IhLI$EwY?wD)^r^BTUaB1vn_6WQ1=BMy%fFfCsetD{Ehhb=8A1u9=C z_Y1e~K|EYc2dINVQ*GBn1a(Pm-1sKU8+w#Vhq2OmHzQLdr!0Yn-+Y=q zV)aYA`w6>=Tyu(#pTB1VRgW9LXaK|3Em4K;el-18&002M`bAovI6%b_CyD({0pB>! zz~yu9RowUwHo^h7)?z&JY zES@>Tlu$#FCm%d$zb9Bjg05HSA5BIFr943IOe#bMHy`ITO4OtcGE>!W9ZoTxa5m@H z)eEoZqNQmI9xcBxU)RIWCPb=bo@R>oUD=+|@|;9a&O5mRgQpP>D^}FqH*7HVC2_Gkdw$Y(M<(W1NiN;j*I#(Fq#_DDP}^wH zoSyOzea!s+$L*YkDohSn#Vo$oaCxO(SMq!J*rhpjo&T!GxoRNCb3S?d#PpLtjoVyM zbFK>V;@A<)pvxPk1-8K2DQssYCYh3FLujxumpeDRGv|Pfr!;L+`W#t;u2XEQ^Uwa- zl&|Q2NMJ|9)TvW9-9a^3g#0OgKA!$V%S1a^7sN(|} z_#(HzaNXVK*CTX4D_goK+LDc!o{x_0>We18`!~B?x4Wacu9-ufC&ZmkTG;wr*r2cR zkkLPl*s?qnJZwAh$7m@mJY!_*-LCRYx^m15)47k-cW-&haX>_J34*Yldvmtkv?#s) zr+%@1b40BAMG*GtZD`&oMAQ(s14;tSZs0_Rfoc-+a7Wj!a(6 zGb;>KoxXaXQApjE?Znw>s_>u~b7ReXT3e;akja18`fxEvv$AA;Qe03;Q4Um7(#p6W zKo9sX?Qf0!dE7BWL+$iG*Yf1zObS1h=_P3G?Xgo?3{}PZQXfIR?3|IOAbKm~2B9-R z!V&8eU;=r$f1TWEElrzy`A_DVZ@IpER$kBWWLVCb2}k|*-EHihk4lQhTJF5$saRRi zi7+M$uWx}~dA2gxgInO;QFs!yvuw}cM82u77(dG8@<@j1-0Zt`K)t7S#Oz*_|Dn*R zkEP?2PCcl}7Mac2KI^Y2e!32MO}}l8gKVFObFqQSO!yb#C__S$@XSq0r4zdKXpg3r zjXK^`GT*;`-R#!hw;hXn%IyMls@WxpV!i3YZN}U>^ZyH@XFN>4^+a85ctJ6l@L1=@ zIQJks?@;nh<`+UsX<~2F!j37zYnT4j!qYo7#XMOhw>%c^jFqpCTh!|UF}ej^-EGRu z4Aj^2NH|B;8}F2fY2MrN#(*w6Ua_%x{U$?X3cB{j?-y6M!BxlMfp_k*QG}_hwIPqr z960xJfhPT&Z>@4ja?#}2nK`U-CX%|g?~|dpukuiWI8kYi^=b11hG(MfzZ$SN&$-f0jFTQ3!{i0nb@|2X1+Bu#!)wz7s zJNbuya2`0J^=P@}qIWR2##Q;oJ8{ zHjhtcE>2a=wz!R#$MQT|mM67|g5vn@O?gPv^gN?8a?&3)#dM=X)4(e z_E>@C)UqU9QmhquMjBPD-UU+t>pyG6oU2d_Q34ZfeS**n9fmRuFhb^o>ts zvs_|l9ts#=Y@7MJonxUMt>@S!Akj46M-oRNl64Ir|L%3UtQ9t%-}?4sVfmYLvq(3% z!^)m+L8zOX+wRpEgd|u`Kibe(D(R$;4yQL2s1doW$rJ}sxX#9F!C&=iBL}x`SCqG# z3?yhCyrZ=9Tt{D=9RB^QYS4LHi3*NiAM_)jppj%j3N-H~`d^3E2U$k7z$T&w$8<#giwY#ft1W_ZD$Vf>Vk zl3*#ifre4JcXxBt- z4=or_Uy=1MTJ27l8GkhY0m9a{gXgzDI{m(@Q@wxtlZo_4IcBkcOY30Ii=nL|x^%a( zRIk--N28;1i<2YG%^kFf2b~6(j_E^>CkgzX0?3PPYAI*Ni(Q}o5e_8>tA`!!x_(Vr zvlzE$u02gSPR{+Ueec}xXm0yQZ7srksZZI=bN|Ee-3W^3@9;DoRs!2e*c~sj;2jb0 z9Mz0VtrPdCCvTP}L`Lx86ZZ>{7bNjzA5JD^T$r@@tnNc_8S#4S>125e+Zn37Qyi;&B)L zY|1h(*ISO{Z8YFh{r}wF&`~$$84ml(kXdaWRW$HXC^{|kCQ5*wySdyP6;(0ji9)0X zhzW}fLD&Yjl*&IvKE8!E_Xch7JvjyUDhI6*>q_%)WcP2-ERAG|N1Hxos0Q? z$ZgN^7D*4~D?BV8@roJNYmk5caSuh*8~5>XJ3;zrTg}1K$3u)RYiDR%5E`YO;l&pu z3TpGICoIqWakB}Hye7$w4S1uVs@QuDPOd;3-CD4F{F7h&o7cI@R@h=?W!vQWN~jO#w=^3~ollilPtL3ri;I?S z)E+OFMCww6+V`Rz-LtSQ)Go@@kM>JC<;ivvi|zV}ji!nCFgNy_)THyw`DEJ@b#;W8 z@KEcOZBy619kwvzESiCRehKQ>{g+YnZ z#$V$G7Ff0$Z~g~p1zxO=njibMbL2}|Alz|f*;3^zJVRCdFAndgXa73h`oREOkJ`ky zOc;qj{VcjzRxT*5HrAG;6!t5Jx!cam=3TI(4=+;!F0pHYdC4kb zdrV}XZT(2|%#J9NHFt5IPB!rl87&T`jGHcx<}rN63j)jg>O@R3wu05X$G6tKsY5TY?i_q>1GCmV=hgvQ!5)3y)Pjjr!)ycm&mQlCKQYA0crF69W ztzZh7EKxVuTo+c;ox+&OFB)|q$?EUq$dOxTvZUv7qzWH5bJsXBp-OQ&qK>QX$>gUe z2HmP`80Kxtb@#?QFUA@s#!)KN)y6AZZMGvX%FakSfP!A!d!u~rlcTR# z=-6jr+B_cLBktHi?_x8h{VMZ~KT3uhfk43U&OFyZ2Hghkz;@ZUqd%03FdxnJ7m`B} z(uz#sPeyVR>(})Ui2iSud)A$+CJfOZ;N7F=(Jxzh8)2}bTjlUAry!5{I|ff!bO;b? z3y=0Mp3)K5zFz#oUm7n_rr6DD8R+@kefHdvYJp9jet>BaUWtwsw82__cz46?QsXy4 z{yoX`WQ$FA5`9%}pe@69@xO{^M4k>-u@#CP>~m@?AP;I{l%q`12{Q`}G9%*&-kJOs zmXmH&i#~HN3-7nXO-VJ5r^ejAPVT7M4(mp4#2WGZg-?rs=>%wR%Gy4J^FQow1o%8q zi)Wlkegab5CMdQ@`1iPDOqV4LO=Hrm|D!wM98CA_suzV9)!Cdb6)zUu z+tY*pQh9{zES737^DRTyBXPMc9D8IGNj$X{)h5ZKW?aC^Xc1Eu;Q8*}~Uuz?LXz&_oL^v)CO6*RR&HDVOA z6t0DN_HY%MJ_nM{MYmnf71bV@Iora1?9U&tqPg=2KwIB#ZIbfRkE0~AbxC^MGN3Z++ws6R$w<6vLr5kM z7L2RL2Mu#QSA9WFi$>Gq`l;}cSib`?v`eD)T6>M94&ohH7Teus&PF1WOwVd@*pQZW zXhKGs$?#<7zklCz+6HgRzZ(lwIIo5*2|g9-#35;(BqVTJQSO9%IuMe`o-OjxOB>!1 zJmq~Vvbm!UgYicyDqRF3bp{gk)&=(DaI9VwyqL@=!f)k32BGZJN;J+&nVPJJZA<$x zCHYUtleppZ}jhqmWk%t4>tS}|igz9_ie;H&%A~jo=m4J9Tz0_N2tGajuxa-5uu~9(){nlEt}%5Hs)b(N@ZomIH{9kyB?k$f4qfb!Aa;H`z6Wwvs|8} zu|W&dlwT(b(#2ewWH`s2ARjSR9_6oeC623OGjn$*rV`DsCNu-WCq++|XjL}|230eD9o z$%p;~ZMg)VzSQNHkUKu_nO=llh7Bmdhl1D4Mocu5+qM>Si|p(t)H=jJ){1LFCG!yn z-OF3r3XYMYZxt~@H*P}Gc5LZivOTq;Ihwo`-7ZVw!`H7hZU)8DpKaH4*S4n8rpRRt}dg8H%pXD!@X);R+);p^5;H7dsOluvtU?0 zH81W-40I2#Q))%b1ZBDmnYACdOfoLKuZ04?6$g@Mm+`8^0NxGlJQ|qvxXA<9^w=P# z0P@yhW^ToyM44lDXtG_KT!ku@AGXI zvasHF67!0AI9Uhr#)ia_d)B%}Xi~As-tCu=5S|8>wY5V738}5cqc%PNLr?X`0k~l@ zd6a773K2>sbK&-j{(5TIq!OH&SAbsT^DS0ndv6Iep++2al)oF{#Fx(~S&3INg4D<> z>4;`=vU}^fUX(j=?Nqe)jxAdZMxCeMa-!7n>#zPm#`&BR9lAt$Q5)J9W;pn0%cxtC z+{3%{>1K2O4vASb>x0m_$80p^l=9upEqA7DhTrCWjyroD|L&Y**h12Cv5=W$vHpL*svkR%+V)gq~t@w~mCZ#*N>p znk>1z9OFY_-pI7RE|Xup=Fs%GJ)1Cck}*amUbgt{-^IZdSTi_fFi?c_j3dT^(uiPZA1 zX2l3l9EhINT->f+aB9ICO%`)3Lb9QU z_ZYXW`K?hZ|8l3~h1DlK_G(w4_XGF@jdwnaE)N9dNRYxqTn|~F3 zq`AFLcF6F*vmzbD8c|MI$9L?ES*I!Sn@xu)q9Wk3aCb2e4MZWh?8Sd9_1MDsx^Ns6 z(f|-Qh|Q*)=0Hi<2yoF>{Vj?v3YKGc>p_R#1?T~vMNAPPiKAGS$%I9MG}qmRvQD?S zo29m+JC99UnA=2!nf)0aT;m4W!6|MVYja!yQCeFF9)(f+|EnksQ5e-y zcXas8U5!`HKHwE)WNJAC?-K{Z$sdL`QL>0kU;5>8+o2MF(UTBDz3}E9Z*R}xnoPu zb3W18r<2R>xNIZquy`m)lX^|hUL*(q&1M}#LYQ!#WnG=C&!IT!0shwTWjJcpmxUX^ zzzhJn7S;g<9A(iSBQK^>PM*}11ncWZTba)<1@PV)gbym%4zIIZ)mq4Xp}YQo^!X-W z;`wc%@?T0XCDc~X*|_2NSg!`9OxsQ6GV8$2z8zG)a({udqJDIIK4mj4_D-u#?(HNi z-#tYxX0G5y)GVwGo9@`psq+JBam++zW#u5T*}Agw#j_64M9HVwHM6KeyCy-1u6Z?# z2o|$TKUZtRWoQG_C7DQB5!t=tUEojm)30rGFoaPKxy|h3zI}TO&nIA>L}h!06%O_w z-DCD9*)Hp;DH1aC4i0o$s#&V+IFltTM+WV-(z1Sl^qmxo^*mW|JcNIb({H1)&ve|6 zcoJ&B7|B{|p$Tz-@a&0d-08~YeLtzT)d}Djc-aJeC__8K{$RA+UqQFffgutqoW*>q zXDs$M;dLN~Z!0YSc`K=RzjNbk8U=zu(CPvdZg54rBD{=FnuNF7fZ5kucJ{CI$ zAJbe|^QOoaO*;PFePbRbB?%?*uRk#ut{E*B79V62g4#?(1BJGWJ zk&v`nmnAR=CK@dz1?l46XZyJZ-0LI5Dd;1stK9;Sq6+=}fVq#8=##Sdqj7aY2f7Up zbKikoPR&fla0;2B(aNR|lO7J3y`>TWC#s;J;HGrtRr0!@Je?uybMBhwyH=t+hM+eJ zYg(JJYf3mfWDZ1ct#8uhp1>5G(M$Lk?g8+Ph7x=8ddeO2E1xGSt2J2%zJFK1tC|-q zH4yG__ly^Hhm=~MdCGfoNX7##cc=S z{QRwjqnPQzq)@Iy871W~|I4-)E{e&NySn)OGcBgAnnLZ>=l?M}GYbX#M(kR&)-;Th zj#O_{w=tZv-?upYEU)0^jKq_tpW?Jwa_>K9kXa~wDHHh76?JI!YVBD2L{>QOt~6ll za!r#dclATYSzD(@Y=P3l^~DM_t{W!A_hT=rAN78;AEt%d~*huxmcx)C2bP z&&$6U=5$f$-{0;E``nvaj&H!gub;d4Qac?E-hB@`#oK6WJJ@)iwV0D~Ai|@$o?Qv$ ztXbe8&e<7I4rMXK#%W~jzzrveFa@6@pJ3~N=+i?)R+Kvsa{?l*zv!wo@W|ipd@W)J zRUY1zRGdgCsq%f`4sgD)uEm`c8|^eCX9nx)rGWj<@_!cv@2`1S@%Crv7ibA=mq~G1 z#PG3#->QS^X%Ag$?r16_ApjK)p~H8*Vwp^B+#+TG?Z)d%HpgUdn?!d$HuuQskP8uwzl{mK4)}4_Mfz3wT1Ow# z@{M=9%;E{iqo2D=3TJ2h3O3s^5Y1!1U{RB`VR)Ui_T??*4%R`M2Et3sfS?;q@09yR zZBhKlYHivn`AgtB_V(Vh>*pdf)VeNi0D7glX!Q|QW!8@wbzbw%FR(Q}ay&6Df#pcP zcec!5A}VJEy!_Eo2Zr!MgP%_qG)nXH!r$w6Fh!T5&ZS=x_uqjG_nQyhyi=`?cj)OL zNUyig$?sY?f9g=fy7b56?RBBEPEjiv!;PvH0~%?Cgo|zUEE>#Wpy#hW4HcQPHfEon43fuqmk(I$&My0csNn1+Pu?T@)4H15oq+4bjQ%}t?bm#Mc-uR|B77dkooM?5BRmEgAubP;w~oxZ~$ ztRg$6a`V~>JW3w(oaGokBhvniLEVkm9>F9lj0_wVd*M-X?sx@M8PE%#0dh6$86pSr zwdU&-A8~DKlCqfB8T%YgLy>GLDBd#sw>c7ndcA=QOu+Woj#{2v79@*;Y6`d>qtqDH z?~zStl!e}4S>R4XI^)^D58F39XYY+3U1J#N{@Cbze$6|(4mtX6NP`Kc2V4Y3dXT{4 z&XkPMe%@11Rj3_<#X{oo7 zn{>PDVB&R|DxXSbOA4{_(`8rZ;qm55%E;cXA=caBHy7h5h=e`waU zsZQmloTzy*T?*Qx6XtPg1ApX-Ge?o9phZsZPP-N)xbm4?L`TGg=*~jy!=4DIR)~Q( zx&<>!k6?4N_q%NC|9?E4dpwi>|NnQg4P(n8CbkJVR4i0zW~D~ zoDZSIq#_;YtRfpiB1+z=#O4rDOiq*2_toe2yZx>|a??L{?R8zR!}Ixg+#kcFj;a#l z>`Z}^+ee*U+?&A2k+5~be8TK8Q;`0?Ejx4hCu8x*AMVzW z6^|ML(tgZ1APNxGkg2mZK&uR}&f(Fk^|o$XQ}u&+SpbhfgDaf|5FHNg^7D-88Z$rC z%X9(fBof*&t&-r2onL)w?z=4b+bl1< zgi7cXAygsM1pWgh!hDxP>sA0Ap@oODzs5JliH)>PSROL&W0(NDwPc_bY$B zhZ?q%%2dPNDVKwHgB^K}7mx>3!E`_o9R7pOTgw0Q_;DZR2ivFWQN9 z?pQ^f>A>(wua11T= z^#wwFr9UMOqE1}^*(M*xUq@1*`ZEgy!w%n-X80*Ps27Mt;xIG z9Fm-S+p^jr5s0MZ^qxrkHqtIm*Z+xpBNf?PLUC=3`i%^fKXvDh(}AL>7*%n5={}tk z{LVV5TcMPxa<|nmPbCh|WhP?=l6QNi1(6ttuecMCwNAA8v9E>r=DQRFv1#B-`|~2F z8I7kmR!w`#%p%?P1SdwZe3e#xwcM@=@HBvJ);`tie<22J|B-b2ii+&`v~8j_Um(w3 ze(7wl*PYd+e!-853GAEpiB4Q=ZF5(p^$s0w@PXYsK8%trA*$FQ14ZBd0_>RpPDbhS_tq{A%ND z_i162+C!twR)=xTBV*00JC0eIcEk14Yf!x#k=%)2%l+-&`EPF^T}V;Ai@y;(*=mlm zuMV7seh*c2f{!hq|1|vV)L7P}YOw;MwB6|{hQpo;3K>?G-gOJrFgW$^q54KNL^U9Q z3$ExN^r9HB@hv|6Gxx6>A3n~RBnU{F5bLUG!Vi2)1#{iTboq@0*ND=` zgHBLQ*FUAXO1)D`c<5Nn>7T}i49n_scI}ALz@N9w75R;-Z>aDHoBC|CB~#RIAMxUM2_+0-(!1@F zr67mLyIH74(p{bUs?~8p#u9mA=gytptAqSrmmF9XLOuPQC zr@l^eGhDFiA)L4Si-~75^hbA51|buFE-+O+;Bg%Ya&r_IT}IqspxTAs zAq2iX<V6Qs5@PcX$0u_>nnM8A}{e|GKh%`_L9*KYwrux z%uiaabDc7I5xAu%hxkKpSmUfsKYJSssp|F$a#R(B zmXkHjx@;W`hav`ojN?fnyca?yxr`s9WdyNE2zaX(rtmfXEv-c^XE3Kjk8t1uB!AKj zefsoi2gfN#*x{_?VciW29cv8XpJINeAD!XL1)qwz=jK)8`M{Z>K9cOkH&h=bWay~T zUGb%V^(YrdaqTmjY6>%AKj<;NCTJi}VJg>arFemJk9?7Bg1Le$_EVT7tT9RIs5z{g zP7X6;v;_h?oPz^+LYs=rw>h5pHPLVp;L?ZYi*IXnimWy;J*3(N*}uQcNmCBXVCp|Q zVfy-}2r*+}ttOd$@P^k`!bnkO=WW*63wBx3qX^6THOuyO=Y5h0OnvOA6frd8XY<8R zVI#Z+B!ge&C7H>9o3lNbvbFpPG$VKi^sCI;DT1MQ4T!+ z;@cn{cviD~#|H9)u#d%<@z^5Vk8p;x(cNN5kIsRqz6=hCi!^93DP|H*V^B3^asp1U zLasE4qf>FPwXB%_=Y?l5^oB!;7>NZiKm_{ygoT{YQdsRU16<~~Qd*+hyzWx1-Hmdv zJkc0ZWVnEHOkt0}z9O&4!$@I>I;A0l0+hFxAjJm(Tb85??v2tRk~@2?RxmJ7-#>lh zmd&JdQ_F71tX1SyUaOhrvJL<5Eg!jk+YjD3v>3DT^Jj$C{r9;C#l&4lO=rrj(M0DD z3qWOKjp|-)#EKxmv@sZTheM^QqU-KOY!`CvlDz1g%b?NQ4|dJmhJAcRG8DpYS<>`a z0CSPOkG3kL@3p=&>eRDNf2$L~Sp^>!@Gci1HYy7d)^Sj!;7zJ%&iPKdm-+(_c}OfhVM`6S{;0g$^sakstrZqlt0c0opkj{1vaXT;4q!V(ZoCZ z{*iDjNzoPD0py7bd2qNh*D;6V{r8%aN#EGQWAzT3jr)32F{gC%~27FWO65yP+X~ zGJo-yNl9LMjh^3jxb4z>vb9Z7z98T!K$uNpAV=> z{k<_aA&Xt0Wd0{OsFO28!5gk^uQ^KD6c}0mJ26leiSJ;!^gAH~K|erXQPbcs>tX6G zDCmwDxyVbqzw=(PWNLdx4M^WjklK%WuMwFQLkRb|IEK``8ugLsPkVW+HU7`(2$RCK ztd)u$_O7~Sm;P=B+{pdc*sCObGl21nPg3}wHhSmMoa+LmWSD9UJ zTLp`G$DzU@YG|32Wa+;Q1|C>tB+K4{lIT#elVyuuWrE3DyrG-PRa zMSpDhctj;3)19{3!QD}!Rap+6C8u)P*AMl7;VGc?1^o>QGms0W zBP^V>BA=oPl?G@(g<&Mb1$qM(gp8Y`{KG1IM69=~7styOD+?LgyVpSxaE>@@1Sg%2 zjKyJDXlr+{eFa!WibFx!wSV*lqtimp-L#O(RBi^LR4B8@F!&^}GCH1Tdol^B>KCDC zrZJ79G$F}@n$rA9A65sO`JHrLx`2lWPlj-I?B1O*MmELy_f37yo`T>|r9169Yw)Cn z=1$`XHib!uxTmJNi^f>D0X+1e0@E*5*1x8x5d(KcNB&vSTEJfE@eg@#2_Py)$zvn#xJnsWsSTljddwiL* zc_2%xnXqZ=K&Ro94Q9SKZqu<4XZ!0HbZZU=x=`6W6U;KZMULp*9SVbKH9o2)X@v~! zE&mBFOfCHPco1vGHo?!#S~}JKzKy@c4T=0PxiC3>v*hlnA5Aw_^_D}9Op7}(U0I3F z$%B?Qxy7qR!gfpV)V#z~B6$|;u4C<|~@2dC|&5yI8zx~NFBDtdqXUmL# zBNG;?UwoJw=NFlsh`^y*y%V(!AlFDVh0TxEzi3yA#l!=EFiGog$l&m0<4IffOeN}uth;mshI+&FJd8jSW5}$kjC;s@**GEZN2+O24#rE zP-*UrG!C8Sn-Vi-V4S(&fnh0-?Z%-F=C3c8QBVREYrC&^eW??2s9!V$bhH!HnssPO z(NNT-INeKlK#%F5^WrEo7ECCL;Cg;6k;%uQ3bFDUd7S-uaa#K~8M7hz&S;pwRzvxg z{avki0`2Vt4hEU-K-$@*QSj>^Hs6FoUqr|269Csy42SjUIJ;hUQkHxLNIf5EdmCc3 zjZweYSjNvr$iZN?FqN2oRJ6NnuI+mZD@^m7_iM2GqQQKY5$jZh`JSj8zn!v|Zpcat z2q_dd9;i5;{Pt~sUDE>f8Y?IJZ;;3bzoV~eORZodcj!mMfs+c^X1U8NS3zE}*&o&N z?B=DYL9?(|Wj9c@q-`8Kg;b;6jc207{&lR88k045n&ctg9qMcDoI`>f>fR0G zefWfo6kca^1u|h)lwajLC4W-B+QioHe24P)$b7%^ME}Npk`F`I?&%WqV!B*kn93yj zTrzW23@Tk`m?}&~tv{=~pD%mk2RD(qr(l*dY+^31KKX9j1j;8K;!oM1)xAbCS ztQhAl51r-nHy98gryo%==bujVgqA=LG~!5d(=HKGj|}TvxY1BCLReImtH(Pv^)hB(LKFfY>4RC(yXT z_e6F9QwlnEqBU&;+5O(H_g!pZAnOBRK^30eP zA_PV7_SZW4rU7^M$F=|$5|hyU8sxShpg(Ax)~bA&&6LAXY?&}!Y6my(@^^Kxy^DLV z=Nk+~=DJZ&L$Ot)@XA6z*1Pw{3uRwdB|^%O8me)>w!@|7KUsyGLm*RZY1M09*s}4W zk=gICe&O3vgR{r2qtdCY|7{3kdYA6?R5eaj)1XeptY+eM^^rv1p~l9J{$IF**KD?( zXt%Kx9>8ZSW-D6Nr9}2cjju@z)XXil80=8>i^6zKeP9O(>1%xxWm?}6`#TcANK0SK6iN`al{qTv$9uQasGDVBMa#^-1>Mt4Yn306FrGM#N=Ww+G$G)2*%ge#f zYwNcSeZ3_r%!C#nzF?_$az6Wv=+(EjkS@OOJVM=awfQKbY{$#=qIopxQ7r0N}4834Z4^y^1LBj zAUIIE)5u_xk#1D1j1NP~6%U6HaD0>c!_^P+JA6I^LzWzbv~C?=UJ76TP>)Rsa=3W5 zWL9j5X_ax1@vdty2G-`h$tkjRNTV8T1=A;{@TUOGCLt*W%8QJNoQ^HR`;;|u2uk=14N0sH#XM$6675hWA8gwrsNacQ; z%rqd+bg>(9Ba2F&SG5lU?9$+S{B&DN-_7Fz>cM-LvO^_69J;3!Z)OrwpJEf#8a^pQ z6Jh7ShVSTA;>$pCYCe~6jew+06L_1g(m@H^58{kL!ifCPk5xcu75mS5u6E_QB|_{ zkwN_!exkGUfdjxo+{U|k^VZ^$i9WcZS7kX>M<+3@ms&6N_czi!H#as4^4%C-E_R^N zg2^VCdqRU|>q*9C<0%Bigs0@?`_(40u|KBkd5n{_YVspMH@IPgPR#0A+j;utI1@pE zrlzLWqGU>{wvDiT-z4jeZW`z?Yq?EC!et`s324oNLx&C>SzK%=*)~$Oc6&OOwLHL# zwXz|%xyot@uF)P^mh()l-ZeRdQ(zj^(4)+b{(jAB!K_^$ zMTGMc4Ha#mM@RCn`N6Hx1D+t&^0{fe=9iGGG_giVuVNG9E)o(C_*@CWln4PM-#W#MpXr9-j2)s)y$TNRz84e)Kg5HyXO{RT6@Az^J? zJ;Py0yVsaBhLmOJ`weDT3PU%?~zKGV}6n~wi zFJV6)2QQag8V$b*%F^_( zYt**Y28Z_WopAAFTS}Dc$y1L`YHn|d?DO!~+cy$#Z-_4rY4{4|$RjUFvy|jdp_OS; z_Yg)-*CJ!_8TfzG8#LDe)hN?F*bOF{J2WY2(pn*gFSwR+ig}B*>x(pj) zR3VGagl#v=%kO~qV&kTbn_^_xK?OR&jp6T!JIZYtQDmEu>PxNiP*;qL__-yTb%1xH<>;qQ5dLS$7=O5kl z{%4RQy^tTG9>2rjT3Nwg0hd)>f|VEW=S5Wd-_(r7t;I`VbRJt)6KKH{x7c(jDGfGm zj7+!O8eSh+hMY`ttoD0?@i<$jbKyl18-xhlW5v2QT|K*)F|!MMv93Ka?876I(hz#V z{6zs*Rh^1KpDq+V61S)#0jWLu?$r^TGoTBq00iA>3Wf8VsSD%SAdAd#VBXP@Db1C z({r%%d-_6O@YgE!9H;~G_vOe!e9E8cMc2Dj)Ta)8T|-O};ohwEc>2LK7jAa1s!Oc$ zhRg3#iw}BEcfi|{Li+Ir$s1fxx68J>?Nd z-}w0W^hr?x9*&=f%?sJ@n zLxO0qzSR`Ttli+dboG52k$va<8pvgVTc&fv!KyL+NfG1GDPIrq_rBbgQqUcS^)#L; z9!%8ub~DM&5|gg6vv5Nt{@Ko|S<5-m#-_*deeTskKiwzKYe8RWX0?oo7I?60%c`rZ zW|$mje%M}!Y33arhsPH&ZF?9|?*cJzrT+zTb$6IQ!GszzCYkMzXPW!K!lWamgY6gX zd|i0uHomLlNW|Acd8O&Gi#y_Tuo5++!LnVTc3>uY0QKutDucXaeS0tG)L=(to&5CP zy{qjgCbd}h@T*@zJuH1@+wcL_cx*PNuN8 zrM9=daO~E;8m5o?Wz0X(X~}o9ULO($+Lit1cNXTP>2Ho;tWn` znr^4t2qaEtowGkc-DLP{I{{#gI_va59jKnZ;O5FYB+L`OQHFo<&R--`H=Y4#ew5dW zKs-V%yS>9$wXDmHmdI99`PCe?cLT2e@8ZooRPu7*|h&NdK<)K1c%=kl{UQMPuo*=|ARi$rtbeSJ|G`Z9AZvx2dlm!;u@z zb}hNvH{U!7VZtV!tid>5*LqmdO2;Jji&GiAidQW)@d*A2r-g>; z8(khfMt+3xv%}FDuMU6G_oGdYnRenEeeWN;J+`w#+6LFS-06R zDd$dc+|IX~I9ycz-dIIEx3$w*i}q9P@y_K`8~x+cg%2LvI?L{|UuPcD;M_9cc}1T7 z=HmI^FB43|{wfVaWm=(v@I#M(g~DRLA5e_F5vRJdQExlAssERUHxWn+Jak z?Hs5S9FY zH~5d%^67uH7OTJ2#~lBYR_nQ+;`g6Ppv>6GQyHc8@AT78RJ7a7?(`AtRr>F(ZT`_e zPP9Z%+_j~f_4`?L;@#0yq>&~*zOgvHGReWl$Spe8I=e(>e2K7J1|xLD0OGynd4gD>YKxqA17=)Hm+K9 zd-|Nn*2`z#`y)GMrykc2Z5~QtJbC_1_T?t8y>H>+#ytYFt)2d~*LZ20r>55my>q?B`?6BKe*T&BM#ok=8d`c5?IB%SH32ib&~fJ{eGc&(&sKK-AhKMFh}TRJU&?b^4dRMGjAQ*TDJ<}b|Ab$2J!Pr0Q?jg2I$r4;IoIKk+D zKq#%8ALG219P`xCmqPgF7%x0&kE1Dh9<4IgShJ0BJYewWe4%aoa!{l8E~<~{fr3Wq zE_ZqL>)u$h`z3|QZ_l@%T&`L4kdCmL7Y>z^ImKgla$24dI-s`8R zgMT-9tRnR3oTNP1uuY2$W{p#FbPq00bB*o}^_g26E|?o=eOh?)Ng&Gn*^pGUX_qA5 zrMbyDn;3m~Mg1W3Fy74bQ2+0fQ9pnB1$K9++Fi3??#eYi@80~%&WQ-^Btt_-mhY`3 z6s$e?X57a_wK}Tsp!#B08TXjUP;94msISi1prBc;F{g&OZ36U{sI0pmeT3uQ3t?Eh z1oK#R!RjG5p%0^B{Ur9;6I<=%nA{`Qy4-}=pzsUnp$$L9w{Nv3eeP9B_BKlBd;UXt zwYzF9ns_PTK-iP10##HV$A9+Vu2ckxv3}1tOm0QyZXsh`?%RP88?6X8WtV=IU)IYA z&h8Hy8l^q>c%wugXfu)|DpsEsxjp~r4%%ue_G{OU4g{$iE_kicc$TF`>9L07l?5(` zXDL#yoEi^pd6T&mZ$h%m>}uH~J7sn7bvahO~ysF=x9t9+oIa4dn(acD8&WWFU6~80n zrH%DixsM06ZPPT2()SjePondr7A7gasz-{Z2S>%<6$|ILJkdH>hPLjm?FbFnH3i1! zsm#~_RFGBhFdM3YxE12dL(-cOQ*y(3Ouq?tQ#gRFTGrE?kZ-9tzSx9iVCl}{XZuO-PzRWn0=Pc zuc?SYnh&E8180FYfyd--<%Ks5%b-u>S6a_Kf90+JB_EsJ=`lY_>#qmzIi-)Er{o(1 zJ3EE6X^ym)oo{ZhZ5{n^B>C+}l1pXGa{mjn&FRLXC`?zMB{JmIt8Zlwv!chEKd&Cy zGB$DketUpQ?N=hwB;t(nYr{U}tBX#Msuum*+Mv^>^OH%&jeY)cE3D?h-|N80x7!u% zp>y%WLq-ObDA4Vj_;UuXGWzKxEg={OQV;tbyKH|B_WpC&F_4#m?a@#{xm>cW_z7E& zTaw=uy6Ini1qtBoZjhLf?hw2prinxo1OMXXWhi~vAVOpShYWceVjH<#b^?wD1oWIo zk#3m1+^iQluS#D(qsgJypVD*JFI|}_G7UXoZAF+HPP~56<`^W`D6;AH>xQ?5n>+56 zC3H!~3LWOU{MJ^fEPi`7_x1YTgyk^F9-m>h?%bn|hfEGxrT1E~y!uvalvPUtZ|c4l z^_n-|&ZkvjSGzB=?W@Zqj@o9LQ3o#GBCJ=wD4E;{JfF^p^!uMF`YjHB9zR-=?J9u< zt(@h~sF477Y4sb$^R`GG{>j7$V69VUt`BlJmoo|n8j3@b6GFNI5(6Kwx-I_xmE19Q zueFqY{8ROJr2DBmwH>Qdf1;nwK9bV<_Az)eZ!WT_{_=EVVg8;N_49*DtMMcI z5|2lYrx8@k*t^Gx+L#8@FL~<-kr$koL@}3(a7{Z)86#cSVoQlm0B&MpLkzm zIg%zHHJV;V96K)S${d^uo%?fei`~Gy?Dr6<>(CMDhcExd6-|8WY86NkcdpS9B}#VX z`*}hCsNAjFH&EtlzJy$hzSH`Ie?Z!@pAsdq6+{e7*YCx|k^G5}8GAg51S`yYT$(`J3kgj%XjZ3bcCuqCS98V^MzIa&Ht3@j7Nz@;vgf zPpM&vZ<`6`J1|5Djva~;3I5zq80T#MFQeOa54}Ls6qpEsTw{-GM zO>`0TCq0Yoo2`BcZ|UBEEO(^SgJpa56s>|fQVHob?0-pzK(Yt(i<{KgoMt$muG~ze z7r~D;ya_O%9FRcCTLg{>P#p%ym4noWht9utAN$7Togv22X3BfAZYR`88HTyg8(3wm$c9S!4Q=#FV_VA7ltL zY?s@Aak}x-NIK^Glgz%^``L3Qy&eZFHoyOut>flYEII&53;8}URjSGfekN-+Zm~5G zuj!9G!g8_Nu`5eY#4NANQt>-kNN?3b=O503skKQ45C+IhxWISfc8Al4ng?rI2iV)&Y?E&AtkCR z7w0r33%hSS%jauLQU}yg74a4r*|)*;WA-^fh5+t3R8{51P;6rrjTh8`O~TqvXB^Ln z(;6Kqcis>=N!)H|ND1{ETn}EnYPrjNy@zi~GLMW4J@GP^915LRSMa&Y%F0$TNmoEu zh6xofoNQkgN1IrLAvzk%yYSNJ6JjutaA?iM+(pSZPpv_|nslW}!ZO!O=wZ@z}CStHm0H0Vd zCgx?$xebv${KH>#YQL3K`(1@QhFtG_6cW+1pO`9z*KduMkm9DW8%?K~UW9pstgno}{`eqK0$&H5o4UOaoK3U$y z|L>cZ#!i44?zPZLBjC6tu!BHV5{=5`*tD4uI8eKyU|gnH+T3;IdA*tRHG`noGJHi4 z({}+O{8e@TO~6LeWte)d@>=M;inBkV9{_)EJo+mK|H1*a(mK&_YhM7aEx-F@d*idB zMHnISNAGc=>0tl1K^UNe_48;2&jlqb6!dy$&AIJKa_=T6LlHg;3k_uF^^r_9l}XC$ zOl+mtgsP7`DX$?DzZBE$dDVC7VQqDM&mzT&DhwWLT+14jC%3<6Oa^GIe(N3GvxP`V z6^XB#Q$EM1jXBsFciA3>o7pw!Tfif>ic4=T?fQIGfQV<`wyve-~ zF=O4P*;XGjHFRz#V_ns&G*$vDl8j0=-A$~`(S)`}@v4oz6fT#HTx8DrkmQ$)Z4_in zhPP;a4@PJB45&-{oZQi;xioP5?Z`wqTc8=hQloz0`TO($HQ&f-9hUdA70h4p z>y)dP9MEA}eI+z)tZ@+duF4qv$eLfO*reLmN-)|q#Gl%>A_xD_spl02O5$uwX#%3X z+!UJxTn<4U&ANf?I4Y`0@+GSf^zY`I z+5-h8h$uE@8>(<)S%)i-^0T0N4igaX#lFj_Qag-{wr}lUY#_Bnd&{Sk?3K?t)x(4} zxdho>w{*S79Fg%tew}W{8pI!G5mXVZ4>=}PxflqIo;>k=Z0S0&F?ka zb3;zAV}H?&8&NS&uPK^0Kl?Gxcw*C0=e^DD5c3btA*uQF`m6r>Wi%4}UDDT+6>~Nu zKA0TTq208(i}w^+f1jg@X$(ZE(GCtDnY^>h%MW^M1tKEVXm&EVI=7O#?S%aGdC|-6 z@$p~f(2Ac_6=@2i)`s)%jp2|!ZGnXTH!-L1C@_<}vc}$0dLtF5HmI1-)nL9 zd?G8-!7nnL!)Az^kUhPdScUhnK3IOiRQH4y+ zN|1M8r4S~8&puksbO0ztS_GObQ-T5(QrHcz=aL&*>0HC#-F-LZ;r;Pjgh&-^!Rius z_veA(qts~)wAiwZ6q9t-uKBv%o6k;9E6gS$)=ffxNi{2XLyj25XS`*-I0QVU5KC8> z>)?OvS^xk2V(u(;3-qmSjg%K(u*4z$<8lIs(3NIm$aw<$Pgc#6MUz#g^HM^eCO?9i zb59MYT{>1z%NxdxT_h8!x?z?$Hr9cf6J-nbm5SwY&WC3+G@R~M0gL^KeHM+q+WN#N z3!*Cxy5{4%+j0J)54yF77Dm3=qy<+u{vwPAq`uti@{3_0o^C;78NCShq0T*x<1kH4s8FK4RAw}#y2F_h!07?vQd!f5Ht zXR`kg)vaM-B9RrzlG;WL2st15goX_;Zj^(#9IHI@xnAL3$emG+<%!k_57T-a{a-i! z!NU(*g%R~tiRG|7a7H@oiZ|x~k5^Vf48VTJp?ZNl7O0P?&|f*K$fWJ@WQMxY1ZS@< ze_M7V8~$?#h|9^GiP_Dc6OmMr*`CiXNJvq;L2gTJdx8aa~0 zU;Fc@I_e&P?@P+>E{C9V?tSD-Ou`;q2FXD>D&ncJN`Ugs*Jh8&R2GImNCJ{I<-nbQ zKbR@omod`WzT|-6PlGLz0<4Z;MPx6GRR^OcSgv@G)MyZxlqMy+;XLKM-~s1PV%++% zxea@#s#ABJy#6XC5bC7sz9(Wo#w0S{YdHmZtn*0UR_=wVa!r&tt+Mavs=|#-?N`tn zD-tQFDT#sPX~H4vwGI3MNhoV-GfndP9)7(v%!5EQn0q=(28{d`+{svI%#n~rE&e=C z4s0cHwsoB@wN0L81KuBJ&okSbkd6~cm9TRYf!n?b-Z8uUiRmbRK3O)pOtx*$24#7~3# zlfY0i+8^QS&b?~acT@Xr{X8|1N$P}gM`62srXTwY)xmoFv9wNfty2oqVs8GKDE2ih zQuYY66cm_=6K8qcw;dhMK>FZh7Ev84NPmGbSJViCRTAeOI()fZ*guio)zu%WOMbV; z?j~9q(}q1I$TvVc#gl2(xTX6i!KXHYq;s4J6&O^lt{2GFg1hEnv5(lhBM-k??Rqd$ z5-ql@hN%gCdrI1mz;!+FJJ}}iues|^9mKs$>Rosa;3M$ZlKEtxe<5t|R=-BI!L$Iu zjT6bYK|-H@&oH^DKu6JUMCTlYzFdgOyJI{EF|ZjP;V-P8S}C|j4lYX=EH~g8G1(DGbv!QbJ+G7(Ytr%epqi;^vw{(Uzl9)0yqSY1J)0& z2VjOlB*_!@9DVxhJ1$Sk*D&|}>3$NF7Qwg1bSZ;igHHHu6}2$7voGov`(sr$Z9Hq` z6hpJqV&qLgJduKRK+`@zHR5QPD>w{6+S_ae|Js1%TpvrtzZi=n-H~6dog_$A{CwW4 z1bGIY} zD27x~FXB2n__BA!QXf^$eC^o7v1f}GCL5*`TGQL$bj)XC)Q63RRsh!Hap71TZ4Jds z4q~#G-NpGU8vGSl^+uJ9o2VdGbQJk<3%i-b!=7Vw&2AmOvIP!sI8H8(V4>4etxrD; zfEoAU01!=emJSTI$FTXnhykv2X@(}cI(sEOl>%Wd{QmeJ{ykUvsA;b@HhCTUsMEvr z_(UhOC3I`2B%3!R1lvS z0vN@k!wZ7hguWU}D)?@Zx6tq(7qzV+nf>Z#3gAQ5I8!K246oU@0y0arDmiAEPhcm2 z3M#1t`jN&rPnOxC{*z_`SYvch+rvq(gKY3nLzAgY)?ZC+hyItlz|fL);%M?;;O0z! z692D`&EQ9dx*TLvJy7o)&-Mfoq_m#J$MTv9!40_XwexN-%L&_ zYD)P%aVD&{@NjihZOh$}^P|n8spJ7PNuBc1-}=v}CD_2fz<~jl41-b) zKNceSq)k+yz@R~8GWZsdGAPu>rW#AbcGVV=q}_ig^Uc&Cc?Qs60)%IIRuz4vsx?1D z8)6;Ei86d%rA2JQkb{NK=QEK)7Lk$G12ik0&y2bj_Upv zS{IC2j(st?Sn?#7=>lb7?l$!g>dc*`&ZC}veky%rHt6`~nQwYXgD<=Lg#1~KykXZ{ z9li$j=(5KEfDXXip6w+^iRK(0j+9w1^CLUS(hxp6xD#FBiY6X76{;!)T3K`qTZ@>A zgxRyaB@RLzw!8&xHwNT^VIYD}q8=s&KEN$y}&$YrR3R9naLL#i4N4 z8-pq~NK%4wPQ^VE`md&!GzuANx9=JPtL&6Gnt31v7YATl6d4`b{$`GuCLE5wqZOYQ z3k^w1Ffy+d`Z*tPKCm(}pCpyO(M>)#hvTxk+yEO5Z{DW9mh$uEtL>?8WqQIaPegWo zGBE&GObn30UbVqxBY5&@ z!8{dBC@{=*|MMMxMBMllY%c-Hcgo=Hd%0wiCYFMZ8gTSR*?5f#Oez}>-VrJ$Hsh1! zc+1qMhm#7WoEcEhX%?2CPxsZ}tQD@xp~kLjbd5EL{TW4Ui97dKzhQ$chmXn&HTELD za8`vXTbq36Zy+SnBJ^^~LkDMpql9W`b{?*KRl>qUN1S14NlE)kQ*T<#d&_|sw$FWL zXV}c<_vDH+Dls0yp^S?%=SK*q@4?c_eI=kDKuA_*_(hZ(TR8)*V=M3NuO$+gTf)ad zLE+q*cNgDxzu2UT!k(^@iLP9A1)6jBcxgbHBNu^`Y)+@|{Q>JTX@#KXm+~N)GDoSd zF7b_B^57*b(EL|3_BD8_D1Wi+4=wEK%6t`&$2@*PVf3o~@{>NQQ|NW8 zKM=N9#z#Z<0B#~2J_n|a;h#$NQcQ*viEQKy#*f0sLAeP*tfenZBpfa?@Nu3>hyJJ# z%>Zj#*+esbx!D_2RO@7e75z^r{Kz&&8kG)?VN@{R_bk~1>&PfLsGC@#LECzd(4{lAdaaZ{Eh13b{P zMlL~jcFAyMphEf|X1gj7SJOIaM($ctSXXyG)*fF==ll_4mJqsYqeg(mMJ4vq8dX5J zo0E_>fRuJobDzH#{(9|%oY1F;NU@}Zv>@uit`l`Vyh)VVl}ghe19d-0!KJdb20<}} z9uMk8f1ZY2QlCcxGbBJ1#pXox4195?IIA!^}lA(c>aUVG@mk=#ggpfqwX;O)E2-JXGfgF8`!LXj(7 zq%PqKYG9JYTNp1L6}O_%Rq^NwOe(?Y%hm;T&P(uVRN%7VIz<&cZH7!Jf*EL~7jOCA$6dn250Qu{GRDV?q4+OP;;RDYrpeZvQT*Z zkjwPl8xOS)ntc|okaz6<>~rnwR=@4V2JBeLhWPN`$I1%FrIk8cPst~?W`RZl@)em4 z$??`3xK6(6{U7;iwLIa^u;-E02&JvPA8)71Lv|&unQV=ipijpn*IQ+GC{E)t%TBs7>eU+(?XLd#XDr)h@RLSGI-_-t`j&LpAv&B?T?6ApW zKNWavx8=~Pv)y@(Xc4WwbXAY}!blDtg%~*?M9{HJJqLo<QYi#X<$h^FZr z%qO@tDCWj(Q4OItb?)cj?{gP#d{laRH5p|3h5i{zo}6K8G+vZNos4VB=Xdyx>1k`D zVzE;d8ANmE-JbgQjR=b~J~c2)z8{Q6EPPdaxb@!?R-JELHepL|nRs^=W~fKVYLYZj zaSH?(!E^x>f+#jk<4;jeX@h&{y371fi%#r5^+_H9|L5+@&#(Qc9eJtRb2gBNk4$F+ zgnxL`tyDVp{JV-IsXNmh#~kIQuf_VjGn~Jn8AP+z3w-o%5_R7Ew&EWdYte$ZGno;> z75n;RX3gl_quZy`9YtzKECd`c(=)&(u~5OZ%}fDrA<87_ED9~vDsV;dblLpvAo#W$ zQq^TvS=;+j>l>eRAU98xtZE-Lj}_S%PvD=-X0-nC zJDN;$=(y_CT1^=8a`AFnk!8 zpL68;wEz-LrfZ?9ihXF#6N_%F*Ic@LrnuC$9RY#N%M9vv3y&3UkI2W5U?SaUWDZe zK5mFAcSV(U!HCOeM4-}=3T4DFpf6(#k%dq5ec=d@J1)$ujAG`+RZ=Hei{pfF9%a< zKL}gd)4XkdTAl_`a-XU+2*#~%_++W*hd(}4$?J@RA%Z#q><1baX1YcN~ z?4n!!4X;KD0}F$vC-va?$N$VP2(bCC`NxhoQ3}0tmqOPbg`cm&$tBmjX+3rI7trUl z8#>B13``3RGmVFHpmfyk_8g`U(YjgY&abX-Sl+VWeZ#ATte%|?0He)h&XhDv92U;a z?^Qwtd2bsuszdBrUAsU3?0MM4kl>XUQAF@ck6dTiKca*byh#tJ?tHgnxZ@`4T}-^) zihrhJSA>#6W(?!G3@V?SC%4q!zETW2n|7-lk$q0m+XNY z)6vAeH=XK>yt*Bad=swyIvTWEyQafD9N75GY3Hzv>d1sk(2O7P(xBNHVdcb!5q(uH z^2%}x(|z>mUO`p(z3XopaI@Y8jaekzqC|SBRPJ?TgoUh4LaKMcgcze?&1l(ENkncq zjCoZxAQ_k$w;4;-_5$DaQSgCZItzRSh2|?>p6Ij>kMHq2k6dze=3qQ1*qsej=ovwJxBVqQ2|baK#sPj%O@!MA^cGZ^GqE*TqDd zuWA>Q!#q8@fCJ_ds^?OH%QlaAEJAXHr4hy3=ibcpGuvGfks939xoXsCkZ^iv!=`L) z1F^56nbhCic@6*$fmkV~(4=PRezB;51_o869va7|jiuF`c)j?nDxm`f9s0K-Qh04| z|MEIxNoq~CY(o=;;c4|i1|A7>PLKaKLXln~?y{S0aKOibV6OUE9?NY>EzWd<0IJ;>$`pcHk0pasoO)nyZW39&47eoJK z?}^rP^9slEg*nO(!<^IIuEG{eDf;JLTSkemrE?B+EwUABG3Mt2v2xgGm;4LI`v#rq z#(g#T+CRGo9Z#;j##rn>v@Gn@vNlsIzh(TO!BH&U@+EZv9S&JZnU$vQ4dTl>Ey!cc zGniK?xZ1;UGjLUG`M%cJ-O-bW`@wOU7=NFpCl%#wem&bX`}=Zizi|2M*L=4P(K`p$ z3TGMkE3VJ~<+jTHoQSnAOHv7#{1rEQSW;`hvi{7=lK#V5j${pBO>rPFTzOL>b|r$( z@M_w=)t*xj+R8|pFTiV#vKxT~&To;(+;_Z;o781oTYyi}tspQF$=Dc_K5VL!`ZLeA zC~ybR279f8)%lWvAk;-pG!mv z%E>93*|t^IKQxW36U*J6vaw1p^ee@{Yb!c3y|}4%NNa=f+I&o^LA?8?Myh^_BepSv zUijOzYs4)BfjpOOGJSOW_AZTAcb40*Dh4(+7qWHxi68rD>KcCuGXCkpK>2ss0c!4< zd)jwSF2{i(`&07bZRp8-_htA$O+TdlvIwZb>A2gKi3HU1R!wo}Cg;LF551{J=Hp;R zetKx{CP&QSrg#h6WecgWfJ=#^8P4~`IHWSLQNr`}b&?i*m5;g+wfrZlbg^$h?Fi(2 z>*nX@7flG-ivQD+(jNTabQ<44`5rl#!?6A>Ud93$5!*itIR{I+QnnfwNd)sZX6R*> z6tVeW!pmr&DUd$KFy-u6>_^(%gHw)$?AmC63`g12G1LqSK>sq$*x%q-Ek z^+R-b%f?5);=~L`KT9zD1X@nP%W^)xg8zC*5ZIV!X`K-1>HmA>1sdn9(|?9+e59P913AB zxd0$G?uduQ%kwv7DDm*EI~I{F^sOiu`=KJJSppvna#STO?z4JN>a^I{u8yUsj^9!VlW*NksaIyi0(J55S z7KXlN>QgN#+x+Ll2J_XjV@*Oft0-p%#`VGMDqdgx9F+Kq`R69t`TM7$lFGNFE{S(> z;@B)h!ufCTiinyUQoz^gb+>2P68%1FVegZ}EVSQm zU8(waf;IvS5be2+hjOS=<1s%5G z2SGrJRWa<7hk!9~)np|=WcCS?;4UnYjdHB6qd5#ulGi<#=>S0tX+P_^hlnXJE}yR? zs;efKAqv+^25B6MC92zzlIc6=kn2@ct#Bds&0BGCazvAEV`F3MgrM&+Pj8z}=sb{$ z`Z7Gb6P*YsCy;s%OcCN{Cf)l2V7Z+_ijA=LJKImaQSut+5Vr5$kh6niPEj(Z(@-B8 z>DNvcAiY~Je|0`F+(7RLC~h)h5AX19Y>aBZudu=7S6tO}?wXl#@Y%10C4DT9wu$&4 zX_}XC{4X;`VT&oo8CNz*oFs6@(*7FB*;`yVi9_Q5kzEm&sTymGq(&bOP~U>YDS{gN z@UwJHY#o0N>}5Rw_pDRQ9W(zezXgWkG1UJXeQ}mv96v}8fgca zH5ivQ2ZqJV`&#}-!3@AV>*_{KO|4xJF5nDNuy@YQukf(E=zoBZYQbK-WCqNsRrvqS z66KZU4}ju)8+d?zJ9f9@e?LbCulk2hFObgS!-_g_^3XY27%DbmBA6^sG>`n5cCMcm zPK?w?=Tr&#GF(UV>Kw&9l#>h+nm1`yeD5e8Yo{@=X?uW5adOo!F6_b2`qsY(t}Y)C z{y955zkKjh|D1C_+n0dJ(at^N+Shd(`?fiT9_Hc763r?tyxPFouT#KhAkRfQRr-Xe z9tugJir$@Jsp9VX$TQS3Y+|T962APg-qm(t(&G3q_j8n7k`83CV6m?i*e0T;#Sov+ zo$_+uISfRbmZsYU0s$KE9!+nE?8;5?t7@~=|9A8a=q}>X%a`9ms>>^)s=HKk!(Qfw zbqtL1rs+|iML8*ceUx-S&+}E)GF+LM9(;Y^027&x^ITq2xUo?VFf5Zj0on4#jSOh_ zC4F+mz~Ji>CjfUahA*|eMogEJOE-&%{6XjH1M>{!Eifd3V3VtBxi+8c2eW4QolJ{$ z23fz}8Pmy9P1`f*ec?5WGrh7&M)_3>o;Vn0qFW0iTHC-m6-76hxk_g0L-CAQGSHGB zLzvA&3)42F`u`ttztCBDA%?p;lbvL`loqDv9O!q{{8Cxd?|o#v0^EXz-}_Rhg5>BOBl>2%bpjyX?YKOgWZ!(f zBZU!s1r_-nB(2PZPA*Oh{LBvH%ySU$8giEn5fgO4$b;Dr;4GZmaHdi{w~fgN`dqXZ zF;5fQ-(kVAl{P?ee*;XvNg!$prB@jWww#qf|Exr2^TbWSQ>U;C(gx6Vj-QzmM`a0h zF6B5c@eD%G+0V>zg_u=mPKNt>1qWVXPm@vSDs6bvP%J8&EAWd*MAmU!;SUriCfGpP zJ}snySZL8{p{Yo3z(zS-buH#ZJ4vRjZ?~jW@Tcf4oIaL5l+6w}m}C@sFeoI1wQc1e z-Qb%EZ8-yT2H~b>NiFlwnsva00KPjW?B z=k=OCq2u-;BPs76R*)T}WJy7>u(2q5nk0!;ZKD)?;5%TLdf_bMvOv}NVtIWFzD@$s z2uvZS#n3sCk83UHEaHVw^vT7X&hWcD z@!jC^*o->PIxkZn`<|n^#RU9Cib3d0k9CdZO3j4GERdqYkV{l#KF7WjX^{i>bAxx% zW==WfLwi3c38p_Ow&ujz+-FC_eaEwXi3*TQuFo=xzs2V;Snw@$p3mQ8%M(N{VnkXAS!T@bmk;CLJTy*wNRYpmt+I(Hg#tZd0lQkv{@m8Cbi z=G~h8(0g|#=F;Up^a;#pHy{1x*mmdi@nifMi*(r7Xct%I`q;GK_V*cm7AcBICR@z< zFU~(}%z+=@)uE3~7SBFSG;Ki99bPr!(OkG7nmQ5gaXM}%!0LGcS^Ow;XTJ3BedA(#TMHJC%&Y5w!A_0)czX{I;H3Za@hZzW2 zmaXLo_x0rlt+^uy5dxr*Ngkmwr#|4zy{YZm{3%gBu#WiUkV_j185FgMykelnNlH&<>XP3ErKa!XFF=+&q zw(9JAw&dp#XMM@mM&}i{7jLs%Lxy5zj_79NcO5yRlun`Pr-)LPRA&nNj7Td_W^INj z;t&6u6g+2ONI>K@aNj26y`RdTAchP3&nj#T5cPkm_>G+@zsyxbiC)|^Hy@Vh_y>Jv zo8)m?d#Peb6#Vq%$h@@!QulWzzv2A45q%uooZjOp@SYydzk{q5dCU&T(sWh~eP6Dt zyAQ?zGH17}b12x$eSf8CkQ-ejQaCa!z$8eSBX1}W&_*;f8orV2^_^%Nc7Sin05`q# zBL**oT)L3{=_A5?=9{7hV7DWFL~<5X0j;q2MnU6&B{0)$!r24t4E@eIYOy1E=H0q4 zI+$mkg6bbvfXlu6{ZYZ-;$<)wpRkY2WuJoLF99}CIeEC?ZS5*kFL^@YprMLoy$v20Y2)Qk+~tKxU0HT z#qe+9oNX=D7AQt2b)oM1{dDM{M=G&0IeVPgLT?i-ji+x+!pr_p^gwZBwkb`4iD&6$+b({Jm z6!bpp{AqkS4Q15|sGoj!G-j}WUH?WDarLHV5 zb1>uyQoKPt?-pcP@T}H?W|C;{o_9+n)Mo8M&WGg>>WU8@MN5q+UB@iC%nro=OQfM( zppEEeF7yhmF47$z@r!THIe;PD&n|%`yZh*x4oZ{!u=I(;zTs_pk7i6iAvB6O%aB;9 z+r{!KdFWpqT#|nFE!Yg;E_DlA)q$;4?xKIo1<70R3mx~|mL90Oa@wE2(>n`44=6;= zxExmrNEN^E)vb+1R#)A7wT@k^4^1{)KllSu5pAxY}-pNcm#IE3yCI8*(1g{g04UD`RRMNzgL9RRGB+m=lXeA>V z=SxORu{pw~4Te4r>+U#%O4`25Db25pvx(yN31x2wa;*mY&Ik6LX{cYjbN3%eO?b+5 zM?b$PMA;dfFe(|Fif8O}9Ekrahn;3o5gd}T)@E#}`cT+Y8olZpj0`pH9*r(uZ_>wBO$)d<`+zd+tWUnqz@xi3erd^NP&}YpG~}WR7koa#^jHGZI{5vs`ZVrW}KN7XLc^*brTxZkZe& z_#W&h6~Vwmp3BQB;LMv(XRg;eZY6*##{mW0bQdoa;4hbX3d9GCZ$O>W=#w>|Qn+*V z2NxfA$UE-8FygsWs#p*4e$`P~)X5>h+`n~Hm`>BM9V&2gGiCXzYAy<%JpX%oqi7sg z_s9`f_xa^Y*O8Ov*S#bA-Z+I8&Iq2>gikIDg-cGmcsz9cQNAC&R(RS-4=!L}=u{;H zT*^~I0Z&CWAPLYH^t>c4O_ZcPX9>d)FllZ!K&~zVGJ-hAuhW#|X z@1(*lGBf}htzZ>7X0e~C0C7>Ul>Z#<>=%JSiro9vIT8wD18S%;NJ}B0%?8qwLwf(D z_UYqSR0k{R8%t#OXZnb^-}QrHM!$3eON*`4kC0HuFS-B8)SE z;z-d5qIjU1UC51wIeS3`5eSYLk0-r!g!8`_)^lbmSrOnK>#y=x!f;bAm83k{ihymF zK=4UIS=Zwoa#BPd6GkP#ZU66`h#7|X3@i*!J)7IeMmVB=V9^=+P#2G93pVuV=kdGx z^uL0WtauNCgW>RSr8g;PuILo#5C&C_&%;G>{?{F6ALGq)(TPB51kMZS$C^-~S;%!+ zE{uhR#(AXwdTbYk=ZS!JR9gPm@oEf)2{;TTpy2xJ9Ul(4R)I4*#QPTk=~iCDs`cvg zt@=TLCjl1m4>HBuw4n&j%0tRS9suG8-|x>l{Vd`&1Z+PR%B7y8H-?MF!#HIq$eCb} z>uo0D6d|=QA}N-mQ1Okm7tzVUK)|*y4hb(w8-shjfbc5OYXf<_uRZ6WyZPsbGVt|q4Z@yVxu_V&Xbx$*1C zTzAC4eCEV1rgtK0=gX!X;a18%6}$|=&{=ykB_;m5&gW+ZULe;FL48$)hyHOhSE|`| zGrU#0CEG7a!{ zz4z%(m{d~?B9}kNcrGSN7I)RyFa7ZK&3_@7s0N)ZLVqtG^dQ^&CfyzN+?zN(UVKA zcOPwj^(kcjQN*;`t76~%=S`Y(C+7=_svmg2-`wqnmHfO}&_{3P{<(Ul?O2TVBX^;2 zMk+$S)t^ssx%eXcXxiV)>LUvD&fvGM8#h>AmBny-Bw6WKf?dxRDYd=DXe<14d2h_k z<9BDKgr;Fr!7_$7c()>^C6N;+mp0l29zkSi`yC#0IzrGM*|Gx;iJ7ecU-S>nKl87? zpW#2Fo-y=vxGCw=YY?{HKv7816OtQSZ{RwaqVIoXigGWhJgouYIg!#^z(=NJ+I24S}b}%@Ov~lc|7q`Vnc{AD$nC5zcX@Q2lg2C z{-5cJn)yq8ixsO~?N&h>znf%|!bV#d_dNF9A4Ah_tlX$ws(hWJcCn4E3dt; zb*WNM+r56z@H(kJxdE%R>RwgWM-NDrP`FP_NwYjz@+gONqI-yH3-||=x4FkA`NwCG z6&tuBD966Q>=Y@npyZwE6frj#f{)3(a9ysTX70<3>2G(Jl)y*J=+OH?#mK~Vodu+` zMeZ3V(X?b14E2($eDwSLDZpG>4!zYLGyi<#;ub=VF!`#W$R?6=1o}00Xx3S#K#dFW z@!L=$6N2v6H~pzwwa%`U?N?r_U8_E!C*irke`lLr=2#e``4lI&+`2jfH*13pO-_tW z7N6I6cu&4lT&m*NikJ-z9+gRPnJoUNK`07*i=nF;`%W($SMIjhH<7c?t5o6nR#nf> z=UG1L#iNE3&s!b>2ICt)R$tJA?r(KwK*IWQ@Pxa8LCslixkcbJq4;Q$h#@e=Ih+*V z1E>p8=>QEntU+W;tZZMYvMKMM?xqbt+ zpGtc~J{YnVD|W$+o=M*pJ6Rl3aQQ{`Z|#QgV2jq#<|on;S=iVUeXs5UWoo>utFW_} z0R53-eTnqk_j{^mv&DfdQ<<+Wd@(-KWH-0Q@TRG8(wtN#V~rW>pc~XTx;5DAhqncB zF^m3BVbb^Nu%9h85l-&yO`s|6&kSm0&fgXaioyjx{oJ zD2lU(%zhc_Pd%7Bw*8hZikZ*Hq{x$htz`=9<7HvI$fM{~FC zpA_6Mb^lcqb?bF|+e@zd0q(g%dYewxk*dCJDv0NTntB#a> zto_J0?CPZY#iDXqlm~hZoshtJI=u6k3JOSSEGiDR+qf5Rcrd)RhcKN62eF{IXI{#^E_pQGW7)9BW)Kq* zGav=Cf8o41d+VJMJ~}3F=uq=f3S$#xdZ%Qq`}pnC{JqlLp>a>o++d|aVRXvQ<9m<_ z3oG(eC6(Q7rsUuUUpk=YBt6Q2a7}eaZ{MIM>aY|nFC6)g>Z^hKV$Iea*|zS4WMajW zZl}^@?Z9s;U$Ff|&cV~P)ZrL+abj!CUgU~T)@pP?L-)6PiJ67d74^d2Z&$tqe=7g_ z>Gbe7lYxlwe6b(`%VDK&PNr2ar6j8h^?sBk=buzx_06u>@p)g3cT=p5mz?5+Ut~#4 zZ`rT@R=hQlKr9S7FOTc89D3Y5$UHSTUsS#E!tuN(wpkxfh?{z!3KE{X&=))~|I9KZ zVff`=a!vReWh}dPNM>iy*Ro>%hlw(#FU)%nfhq~{3~bSV1PQcq%#4=`P@g#ZdjRF+ z_~=cfD!tULr19TU35@b!YHlPLiqzTjwZ*D+`;xKsfveoL751lZmkm?%=jVJU_rVlmVRmh`F+%%98`R7UZ&Q zRLp{ss1LUT=al%H0CQ$+ifh2w3&+yzg{!mN`%HNoK0_oD?o2BX1Z^>X6W6DID6k=0 z(AmzJ-={doAM436Bm(Nrtuo~H!CZ#dmW={AGAzF|GX*m;|f?S`-;dLl9= z<0eg`1MEYw2cLz6{rF%}zpz)bf|558+;8mO^ym38%2B1sGxg^WZu-)G(tr0lB5%SpG{?i;qT8 z^JO9~O);3Qc!FPOxgYXTcCnbG>?aLU17M2uO$st3R5bFB)`W(ZX z^4ybYmqrt6mm?tMV?I--#A{A3c7)l-ey94;>(2xme#!e(x8RaH?m%`9n?MlFZC3BA zZwWI){^%%pXnxRUAVjv%|7{2}d~l_8_EFA?*JNn_vs>}IV)_SDo(_P4BdDgn(i3}7 zzeH;^K%IDZAoT3wdBn322Yj8^-GlYRk$d3V7leBr`rwy@kWDhKUpMMEKyf;T(@X|! zH%fO4el=0VeF%Xq{X5*VH$2%jJ|6Y=3mRKfg|In7zYhO0xG9Lo<7$;e1x!tzA{0wn#YI*I4(V(+P^3f-ZIhM zw0ZdNJk*ql}lMlYvSIiLinLZ4S zJg^`eunD-Eso6b99mf?H~46O ztW8u#@5IFL2iyk&xkNiOJEih1cS}o_F8v!*Yl>oYZk*@X(g0{_as zIQzQ5HwitWC-duxmvQN_C)4B|w#v=lqm|=o-Q%BoZf>Qk^@cf%&^&H^f#->p#Wc7l zD++5%Z;dwOMIDV5x*Pon+6ip97FGnS!pY?pmhZVGR`_V4Iziu5XX@HWz>ejly}y(9 z;MP!a%lw9QbLw-SS_A~Lxw=@Dr8v})zDuNIxsQeQ1GVd}{v0u)2p$=klMW^gqNulM zI{+k{AZ`(uwFQn3pYG(P6NHaF^*) zKdR0#UY8KltGsp$s-@!Jew(kt7LSd+YR%5U@C#v-&zFupTaD>Cr~< zVyRcmywJ2s1&N}uTM_1n3O}VNQk=Oca zJC82D1ZyZMbSXt|=$0?f&^*mU8@g`%lBLMx8xB3g(l+R;PlD+cKUUYgw+V zd&p8bjoJPyI^>biU{>Yw>)Q?&m^Hp$CJwqk6#n=LLS9iN%u%9BA~uDj!_&tzdgMA| zRg+KY{7c$nI*HA2hNqV#Va##wM-t6KhJNp*rl9Wte;s2f@wx}!nUb9R0QHqHKeW2X zlpzY!nhiuLGv2GTl(4N7VZ|P)`o}brb4Z#ONJJitSUI*Ur3!A z&d%5(CI^pc8YJIGL7rhc4Ir}or42rV@8kbtvgV8LNMTs4%;<@h0spgKZzcDe-3PU> z+qXj=y*cSU0of+XDz1@(;%54^7XV0%^M%Iq4yJ{T7|wZ5#?Y~)-r##9UBYv^lX*(O zlLbc`O>d0U8`=1F_|>sDaXHIZdLS46HP75ydt7KVEu*n@_Q2}TPRV_%P;v1^A~emX zyWgjRIY$POFkZ@Pww=gYT2P&Cz12~rEn-dKyJZdcD-eMsz5p(Gy}Y8qjaoWwORip< zZR*auR(0A$rO{8wle+BX8LT3YF|^s9VaUWv$>KDYPXKvv4PTu2lD?($UBPD8YKESd z!ix`|{e!k#@1cw)6-b8^0QJ;bL|H4-4W3;%LH0)){v{26TPqw5xpjN>wD4JsI_vm+ z(MiW>C~g-2<2`uc*5mLDo_=)`({5kfhfEOInq!FgjBdDAgQyi^JnPw43y@xF3U#3)uRas-@r$VW(-f2<%Cod)4#`= zLx`Tv*JF%gIri-&@!TDw|7E0|8yJUdQMH4KRnK4E1t7h(6sGmwi#Z|-E~P1G$9+Bp=Ah#DLlkn*5s9sn4eu_OXrw^E6Pbf@vnVz7#Ior1iV6XX8TtAZwab z0riX17m}9P=!$qpH!{jT-!fIa#(z+d8)B;uLk+@DU5!qb{|Cj<_#-$gbBQAGow)&{ zbXt&X#iAxWFWn>lS#_M}Yj9^+2t`n<)4&YteC2ACbbhD<(zSqR4*YuN4{Nbi^c%F$*7;a1a zUZ<@fha?r2#A2(HqEt0$rzN1B{Kb|iXP>zR>MK|J>FItT%#%qqizwwS4zL^j#IjjP zlS(*8cJRN*4?q>$4<4&)gty`f`+;M*9$H+gNslYcT+SwivzAac*-6GpQ5RriyC!Ul zoZ|%Jo4J+8Z(CC>Ab)jsF`Rtgh^N0C#o1V?0u_CtC2jfltg8-9*YisOr4vrOg;kgk zV&5htB&<^eaQ$Wx%e}L#SM;(UPi4+sG0{cb1!3M!ZWTgT355-SsCrrZDGP*!F0#~n zUfv_by$IRa%pTPpvH9xl59Worhku|O@UgHvb^*Q1tt2IS=9l|m0f0K+oosqT=b>tU zY~Tg+uEr(G8jj($vw>g!8lbe?J*%nZzZbOA)!7Z0tdU%anVg6dqPD&#@y!8p^MVgG zN(f7on-~5H@Lr2u4`X!#cfoobitvAZvu@1x-z^eDbrVk>0L~P{eZ(t*w&@ni2m-*gJz32VPC2D$mJd&n&Ife@l4VPt| z;Xf)83RgmF2jepATaF-3{;RA#RgM+#P|NSLvAmn_a}BW|-}*_KYtgePjCuod_x|eY z?Q|5ZriOq4y2zdxo2ZYUW!8H7CozJ#2Fmk4VuL?62$o34qD%wzT^zvH;a4W3) z(4_$%x-^t;zOBC5%X8bw>8F5qn(HK`>p(y;>)v`A2Y9S=%HDwRCP1(JAE&IXva<5Q z>Wai$2>?jPzIg{jDF{O+uEcCoKW-km!tx=8@pjNA*OSb^ne+m3)a53;RMygeJP}w_ zhJ|&#jgHRV!nA@yQ;fXnK2>_CC~Vc7e1M~5)|Fnr+M#)&aQU%`LE?EHAox_^JhY`E^AKKu5(rn5)8sal@<^(Rpbw8q6>0^5(*3W?ajko!@W5Bn znX`u)eBTxzUYOWoySU^8pat&R#O<)U>%rnxb(JthBzH z-MK042AEvp0Ia8R!u!NQ@Kg6;{=;WNL9@qH7pV9T4i+n(=WRV$nB!%K`(>p=qx+(hwR|bhgnYU zxDt+CV(16;5YB>KW*EU1th^LkH@2WEEGaY^HoB{6*m_sfZ-3B_G3{(N-tQ0uTn}SF zgvkF*K4@Qq#e3J7131rxFv=(A%WduM$px~vah4-j1e?#&yr zH#VBpM=F#zQ!=%vQXobmA`Hu!=8K#Ak3Ty8R~T9)f^A0e)JM5m({6f*BS50gxZLkn z+_iT($Nt@Y5om{{&)^Ry9kQm;5mq^SbVAVVGAb=CZ6>T@SPOioKPEbb1Th)U_PoEa zP8YsYvMT)Gh&stp6XxYU42q$8pcZpfnN+bMX9W~QuO+~#oF`>kP4-teH5G?iX&6o64OCV4rAkwZ1s0Jac~9$SiNp;!ZpI1w<<<%ZYyh> zQqyR;cPIX@kEYjIzw4KYc0e!h1ST_!hmA%5Ep0LD(Q14fEp4eU!3X?9og#qc%0<}m zBx4=j5ZK`f7L=FDC`eX-Dru$in!)y$v)4u^YIbZ3j-2|!Y*=2|p)&(ri`lE-p}I~4 znAZz-z8+F~`Y0AtGE0{#UIwEPr8N;Tx!gMOM*s|o8WA7CPSNcSC7DyM6@aIT9~%a! zV~?DU2$-dD@pLxA{@zJNI~2^e{%-#z3<+>97E-^a!Z!qDjsQv*MTJL~qt)R}uxwA( znu2*LPf0%gSAQOKa}^ALMQ7gxgublZaP}ZBE=v>p4k)(=f0L_z%j2HCqD*7JUqK0d z7bVbL9e^+q7KM0gp1ZP@RK=IaJ!1Nq4mg=Zwj>V|f5vPJzcVZoxa&RRVN4g!O?CR7s0W`$L!k0)B{eZriy7YRd*Wf0k?dE z{hP~n|BdR0`9<>r<+P1uCq{PN9nu>Z=tJL@yG4Tv?uG?_2wLvvs;((4w?=Yw1ylUC zYQySVTH1m03rE!Flho9AwHKkLFZNR(|L4c#CPFGh+OTu5obS7(46z zZPRYEH8bpTaL3C%W&V@>^D)~ak4#R6B&}HKgM%9?o)YU-EVk4A%YFqKyKMaUFZXHegf7?2}{p8I7U($Ch?Qe8K$nmuG{%T1_yX_ zBb$+=O$Qb%X^*k!=UT6jmcU8s8u(SyC^yRPp#-|IS;}h)hUZJ6^MLDF%I0Uq=}5V| znyAQ;?_lT5@H3;Ya~z!*z6l_2&O#tk>k%SPqy2>ryh7%1cK^nL?{k_(%%ryo;Ept6 zov9>E^d`Nn4p3iC!nSavR*`Jc8-Qiwj?hylW&oSLWjLEw0`5!(;5`O$wk@yd%BI~Q zgZWb8O@dV=7~^kk_?->)^^v1?YsSHyJ{P@|Ye03!X}&g=?$D>ZO-f=@RTV`(GK94$ zRW|mR$hn9>;k($E4_=Zchf>5;BO<;^itglJYk8Y3e*<-FgfHc_x(1e~WRUpUM0uT3 z`N!~2=kd^il?YEWkc~E7KN~Q6#Q5u-*SZVDmD)o|yzV6k`Y&;%|90d4s{N1UQqiDf|#aUx&vN@fhM=tWeP z=yx2)jXF8#fS~ZSxv(KSEW9-`muYGJ?DWYRJdAS*0{oCj&NMbE17t+@ViED`RLn6R z&rqstuX};ZRs!y-Fq4Hs!0<2z&j11YL4=JX2DLwWrWD&x?gT)TJ_)*g-U-G_G=t~Hg|=Wfbpl0wz9AL{Y#8YcwFuD#O*W|- z%L4z1*E5N{iJ{5>J}y-Z4kDWIvxP+|OrS}u4x zXJ6N#=|2c?TB$sjb#&umYwNHPLO!$KiV0&lZjmbpAo?jk*4QFHQ(h6NPb2OwP5 zK^@KI?E%Il4=XooDxly#2$-vc+VtcCerkbuBj>*u8QA|s{Q6jAF=eY4R&A_AxI!ym z^jiZgRB$mD_20!}KZ2+;)}w~t1eTPAHW3O#9=<8}h6H9q7&-l8>v&7P3u^)Qw7lk| z7u(l4N&@l9r@W>H5LLC7zeKnjv|f00sZrS@M4g!^VGr^$&^-uqw2Y>Q?e;( zi#2=@A29hLJ|tMZO;fV)zaahV=kpPKR$12J=Xo@9 zMV3%l1=s(BF?gX_p!zadEE7slP;f|r?Y?!xvZDTVs5GwZE;;4xjq7;?&?tZ<_ZeS(7DKgZubdo9&oWd=k7u%I(M>;p%PuTE=sw<Aa5Uy>%)7R zGA}f?hW|Oetf64^$8GlS%RRc* z!G|u{@Se+}HnreItE(gw_HKhe=r}jnqF2)0cJqq-(M)5xkJF(|kv8bW>;-|mTEE6p zoFX6uJJ?AbQ&jb5N4ck&f9OH-cm_NUy7{uo8mw{nQ=qn32Q#QgY-Q#>qoKIb-u?pei8;#Hx~_EcLbQ} z=SBKn@CjjW-_6}DJeoD_zFBTCH}) zZ~QwBG4LBv4}W|Fh?+g9W+{>L{B!*MiGZc6g^HW3(aV^uG@%hhjIbC#{S>F86MiDa zT&Nt2wcfB34y76!{h8kGE&4j@yJzXI)@d9rZRhL6?aX7qXwq^dgoyoacX;UMT$Ap| z;VUPSJ<7umO%2Yvth|`??jm0PJv(eQGCetDOO-k{(lm1DNl5%sQGeyGHyJ!%fw@7dgB2oryF!>Kt8dyiT|Gr^KgX(bsFiZN^cb#PA37 zef6!Tx$iWSH+J{iTPUc<2FCq8X#D>$_3rUZ{_+3+PPSppF(WoYPQ@H5$2o@Nd`Jg5 z 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%0DA6XHo` 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